|
squid
http://www.squid-cache.org/
代理服务器的作用
共享网络,加快网络访问速度(缓存),防止内部主机受攻击,限制用户访问(七层限制)等
外网
|
|
路由器
|
|
squid正向代理
|
|
|----------------------|
上网用户一 上网用户二
三种代理类型
正向代理 客户端需要设置代理服务器的IP和代理端口
--代理内部主机上网(共享上网,并可以进行用户限制等功能)
透明代理 客户端不需要设置代理服务器的IP和代理端口,对用户是透明的
反向代理 从网络访问内部服务器,与正向相反
client
|
|
反向代理
|
|
web
--关于它们的应用:
正向和透明用于控制上网行为,共享上网等网络管理功能
反向代理主要应用于架构。 有四层和七层等之分,可用于动静分离等架构。
硬件反向代理负载均衡调度:F5 BIG-IP
squid varnish haproxy apache nginx
客户端 缓存(正向代理) --- 缓存(反向代理) apache+php(缓存) memcache(缓存) mysql(query-cache 缓存)
实验环境
公网
|
|
eth0 172.16.2.35
squid 服务器
vmnet1 192.168.1.1
内网用户VM1 内网用户VM2
eth0 eth0
192.168.1.128 192.168.1.129
准备这个拓扑图要注意的地方
1,宿主机(squid服务器)需要能上外网,在这里就是指向公司的路由器
2,192.168.1.0网络,我这里使用vmware的vmnet1网段来模拟
3,内网用户只要与squid服务器能ping通就行,不用指网关和DNS
4,内网用户需要安装图形界面,并安装firefox浏览器
5,squid服务器能上外网,但内网用户不能上外网,我们的目地就是让squid代理内网用户上外网
第一步:安装squid
www.squid-cache.org
# yum install squid -y
第二步:修改配置文件
rhel6.5下自带的squid(主配置文件少了很多参数,文档都写到了/usr/share/doc/squid-3.1.10/squid.conf.documented这个文件里)
--rhel6.5下的配置
vim /etc/squid/squid.conf
59 http_access allow all --把deny all改民allow all
68 cache_dir ufs /var/spool/squid 100 16 256 --把缓存目录这一句打开注释
如果你第二次重启squid时报下面的错误,表示内存高速缓存大于磁盘缓存的总空间
WARNING cache_mem is larger than total disk cache space!
原因:默认情况下,cache_mem为256M,而squid的配置里磁盘缓存默认为100M
如果你要解决这个问题的话:
1,第一种方式:调小cache_mem,因为磁盘缓存默认是100M,所以你加上一句cache_mem 100 MB
2,第二种方式:调大磁盘缓存;如cache_dir ufs /var/spool/squid 256 16 256;把100换成256
---------------------------------------------------------
第三步:
初始化缓存目录 --在rhel6的启动脚本里也会帮你初始化,如果你是第一次启动的话
ls /var/spool/squid --初始化之前为空
squid -zX --z参数创建缓存目录,X参数是打开调试功能,在这里就是可以看到创建过程
ls /var/spool/squid --初始化之后再查看,就创建了16个目录,每个目录里256个子目录
du -sh /var/spool/squid/ --查看一下大小,目前为17M
# du -sh /var/spool/squid/
17M /var/spool/squid/
# du -s /var/spool/squid/
16452 /var/spool/squid/
第三步:
启动服务
/etc/init.d/squid start
重新装载的话可以使用
/etc/init.d/squid reload
或者使用
squid -k reconfig
停服务可以使用
/etc/init.d/squid stop
或者使用
squid -k shutdown
[root@li ~]# lsof -i:3128 --查看3128端口
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
squid 4937 squid 12u IPv4 36871 TCP *:squid (LISTEN)
第四步:
客户端的测试
不用设置网关和DNS指向
主要是修改浏览器
--filefox配置
编辑--性能--高级--网络--设置-- 手动填写代理服务器的IP和代理端口
--IE配置
右键IE图标--连接--局域网设置--为LAN使用代理服务器前打勾并填上代理服务器的内网IP及其代理端口
测试:
访问已经访问过的页面是否能感觉到页面加快
再次查看 du -s /var/spool/squid 发现增大,因为缓存了对象
查看相关日志 /var/log/squid/squid/*.log
================================================================
透明(transparent)代理:
第一步:
在squid服务器上打开路由转发功能
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 --因为要使用iptables写NAT表的规则,所以要打开ip_forward
# sysctl -p
第二步:修改配置文件
# vim /etc/squid/squid.conf
http_port 3128 intercept
# /etc/init.d/squid restart
第三步:配置iptables
client squid 公司路由器
vmnet1 eth0
192.168.1.128 192.168.1.1 172.16.2.35--> 172.16.1.1 公网IP
|
|
|
client网关指向192.168.1.1--
clientDNS指向8.8.8.8 ---------------------------------->外网DNS
由上面的分析,需要在squid服务器上写上一句snat,让DNS能正常访问外网
# iptables -t nat -A POSTROUTING -p udp --dport 53 -o eth0 -j SNAT --to-source 172.16.2.35
这样的话,内网客户端的DNS OK了,但是http的80端口的访问如果也做一个SNAT的话,如下的规则:
# iptables -t nat -A POSTROUTING -p tcp --dport 80 -o eth0 -j SNAT --to-source 172.16.2.35
那么这就做的是完全的通过iptables来上外网;与squid无关
所以应该换成下面一句规则,把80端口的访问都重定向到3128端口
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i vmnet1 -j REDIRECT --to-port 3128
# iptables -t nat -A PREROUTING -p tcp --dport 443 -i vmnet1 -j REDIRECT --to-port 3128
第四步:客户端验证
省略
总结:
--上面所做的透明代理其实和上次iptables所讲的几乎一样,唯一不同的就是把80端口的SNAT换成了端口的转换,把它交给3128的squid来上网
--但就上面这样做,并没有看出比使用iptables上网有什么优势
--squid共享上网的优势就在于使用acl访问控制,缓存,资源控制等
=================================================================
squid 里的 ACL 访问控制列表
acl denyip src 192.168.1.129/32 --拒绝内网的192.168.1.129/32上网
http_access deny denyip
acl denyip src 192.168.1.129-192.168.1.132/255.255.255.255
http_access deny denyip
acl baddsturl2 dst 220.11.22.33 --不能访问这个外网IP的网站
http_access deny baddsturl2
acl baddsturl dstdomain -i www.baidu.com --不能访问www.baidu.com和WWW.BAIDU.COM;-i参数定义大小写都匹配; 但是可以访问zhidao.baidu.com或tieba.baidu.com,并且可以使用www.baidu.com的IP也可以访问
http_access deny baddsturl
acl baddsturl dstdom_regex -i baidu.com --这是把baidu.com以下的所有域名都禁止 ,但直接使用IP仍然是可以访问的
http_access deny baddsturl
acl baddsturl dstdom_regex "/etc/squid/baddsturl" --如果网址太多,可以写成一个文件,然后在这个文件里一行一个网站写上你要禁止的
http_access deny baddsturl
acl baddsturl3 url_regex -i baidu --拒绝访问url里有baidu这个关键字的网站
http_access deny baddsturl3
acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$
http_access deny badfile --禁止下载带有定义后缀名的文件
acl vip arp 00:0C:29:79:0C:1A --rhel5系列里的rpm版不支持,需要编译版squid加上此功能;如果用的是rhel6的rpm版,支持MAC地址功能
http_access allow vip
acl badipclient2 src 192.168.1.0/255.255.255.0
acl worktime time MTWHF 9:00-17:00
http_access deny badipclient2 worktime --拒绝192.168.1.0网段工作时间不能上网
acl badipclient3 src 192.168.1.128
acl conn5 maxconn 5
http_access deny badipclient3 conn5 --最大连接数为5
实现如下要求:
1,允许周一到周五12:00-14:00和17:30-21:00和双休能上网,别的时间不能上网
2,禁止下载.exe .rar .mp3 .avi .rmvb .mp4后缀的文件
3,禁止访问qq.com,mop.com,sina.com,163.com,youku.com
4,禁止访问网址中包含某些关键字的网站:比如 sex news movie sport game stock
5, vip没有任何限制
--把上面五点情况做成两种需求:
1,上课时间不能上任何网站,休息时间可以上网,但受限
2,上课时间可以上网,但受限,休息时间可以无限制上网
acl lunchtime time MTWHF 12:00-14:00
acl dinnertime time MTWHF 17:30-21:00
acl weekend time SA 00:00-24:00
acl badfile urlpath_regex -i \.mp3$ \.rmvb$ \.exe$ \.zip$ \.mp4$ \.avi$ \.rar$
acl badweb dstdom_regex "/etc/squid/denywebsite"
acl badword url_regex -i sex news movie sport game stock
acl vip mac 00:0C:29:79:0C:1A
vim /etc/squid/denywebsite
qq.com
sina.com
mop.com
163.com
youku.com
第一种需求
http_access allow vip
http_access deny badfile
http_access deny badweb
http_access deny badword
http_access allow lunchtime
http_access allow dinnertime
http_access allow weekend
http_access deny all
第二种
http_access allow vip
http_access allow lunchtime
http_access allow dinnertime
http_access allow weekend
http_access deny badfile
http_access deny badweb
http_access deny badword
http_access allow all
====================================================================
客户端
|
|
反向代理(缓存加速,网站数据切分)
|
|
web服务器
|
amoeba
|
mysql
实验环境
内网web服务器 squid VM2
eth0 vmnet1 eth1 eth0
192.168.1.128 192.168.1.1 172.16.2.35 172.16.2.x
--注意:
192.168.1.1为squid的一个内网IP
172.16.2.35为squid的外网IP(也就是说在这个架构里squid在最前端)
172.16.2.x 为外网客户端
第一步:
在内网web服务器上安装httpd,并做一个主页用于测试
yum install httpd* -y
echo "内网web" > /var/www/html/index.html
/etc/init.d/httpd restart
第二步:
在squid服务器上安装,并进行配置
yum install squid -y
用一个新的配置文件;如果是在上面的透明代理基础上再做反向代理,先注释掉前面所有的配置
vim /etc/squid/squid.conf
62 http_port 80 accel vhost vport
--accel 反向代理加速模式
--vhost 支持域名
--vport 支持IP
cache_peer 192.168.1.128 parent 80 0 no-query originserver name=web
--192.168.1.128 内网web服务器的IP
--parent 上下关系,非平级关系
--80 代理内部web服务器的80端口
--0 没有使用icp,表示就一台squid服务器
--no-query 不去查询邻居,与上面的0结合使用
--originserver 表示源实际服务器
--name=web 定义一个名字,让后面的参数引用
cache_peer_domain web web.cluster.com --对web.cluster.com的请求会给web这台服务器(也就是上面定义的192.168.1.128);如果有多台web的话,可以多台web绑定同一个域名,还可以实现RR轮循调度
cache_peer_domain web 172.16.2.35 --光写上面一条,客户端只能通过web.cluster.com访问,再加上这条,客户端就可以使用172.16.2.35来访问
59 http_access allow all
cache_dir ufs /var/spool/squid 256 16 256
保存后,先不要重启squid;因为我这是在透明代理的基础上再做的,所以要把前面做的缓存和日志给删除,清除iptables规则
# rm /var/spool/squid/* -rf
# rm /var/log/squid/*.log -rf
# iptables -t nat -F
# squid -zX --重新初始化
重启服务,注意不要与apache的80端口冲突
--测试:
所以这里客户端的DNS解析web.cluster.com应该得到172.16.2.35的结果
所以这里不做DNS的话,就直接在/etc/hosts里写上
172.16.2.35 web.cluster.com
再使用http://web.cluster.com 就可以访问到内部的web服务器了
可以使用curl -I http://web.cluster.com去查有没有命中缓存
=================================================================
多台squid反向代理
参考
http://www.ibm.com/developerworks/cn/linux/l-cn-squid
客户端
DNS轮叫(round-robin)
www.abc.com
squid1 squid2
web1 web2
参考它实现
client
|
|
|-----------|
squid 1 squid 2
| |
|-----------|
|
|
|-----------|
lamp1 lamp 2
|-----------|
|
|
mysql + nfs
两台squid1使用icp协议共同工作
两台lamp可以安装一个phpwind或discuz论坛
lamp里mysql独立出来,lamp的网站家目录也独立出来,使用nfs共享(--注意其权限)
把mysql和nfs做在同一台
--在这里我实现下面的架构
client
li.cluster.com | squid2.cluster.com
外网 172.16.2.4 | 172.16.2.130
|-----------|
squid 1 squid 2
| |
|-----------|
内网 1.1.1.1 | 1.1.1.149
|
|-----------|
web1 web 2
|-----------|
web内网 1.1.1.128 1.1.1.131
第一步:
主机名绑定
时间同步
防火墙关闭
yum配置
第二步:
squid1 上的配置
yum install squid* -y
# vim /etc/squid/squid.conf --下面只列出需要修改的参数
http_port 80 accel vhost vport
icp_port 3130
icp_access allow all --在rhel6.5下的squid3.1版加上这一句
cache_peer 1.1.1.149 sibling 80 3130
cache_peer 1.1.1.128 parent 80 0 no-query originserver round-robin name=web1
cache_peer 1.1.1.131 parent 80 0 no-query originserver round-robin name=web2
cache_peer_domain web1 web2 web.cluster.com
http_access allow all
保存配置文件后
squid -zX --初始化缓存目录
/etc/init.d/squid start --启动
第三步
squid2上的配置
yum install squid -y
# vim /etc/squid/squid.conf
修改配置文件,和squid1的配置几乎一样,把squid1的配置文件拷过来,再修改两个参数
cache_peer 1.1.1.1 sibling 80 3130 --IP改为squid1的内网IP
保存配置文件后
squid -zX --初始化缓存目录
/etc/init.d/squid start --启动
第四步:
配置两个内网web服务器
yum install httpd* -y
--因为我这里没有做共享存储,所以这里估计分别做两个不同的主页,来测试
在web1 128上
echo 128 > /var/www/html/index.html
在web1 129上
echo 129 > /var/www/html/index.html
/etc/init.d/httpd start --再把两个web启起来
第五步:
我现在使用172.16.2.108做外网的一个客户端来验证
--因为我的架构是做了DNS的轮叫,也就是网站域名为web.cluster.com,但轮叫两个IP172.16.2.4和172.16.2.130
vim /etc/hosts --为了方便,我这里没有做DNS,使用hosts文件来模拟DNS轮叫
172.16.2.4 web.cluster.com
172.16.2.130 web.cluster.com
[root@108 ~]# elinks web.cluster.com --得到的结果怎么样都是128的主页
[root@108 ~]# curl -I http://web.cluster.com
HTTP/1.0 200 OK
Date: Tue, 10 Apr 2012 09:01:42 GMT
Server: Apache/2.2.3 (Red Hat)
Last-Modified: Tue, 10 Apr 2012 09:01:35 GMT
ETag: "1546ce-c-5ea859c0"
Accept-Ranges: bytes
Content-Length: 12
Content-Type: text/html; charset=UTF-8
Age: 1
X-Cache: HIT from li.cluster.com
X-Cache-Lookup: HIT from li.cluster.com:80 --HIT表示命中缓存
Via: 1.0 li.cluster.com:80 (squid/2.6.STABLE21)
Connection: close
--结果多次删除两台squid的/var/spool/squid/*缓存信息,多台客户端的测试,有时是128的主页,有时是129的主页,说明是正常的轮叫成功
--或者清空两个缓存,重启,只启动一个httpd,那客户端就只能访问这个启动的httpd
--但实际应用时,128和129应该是经过同步或共享存储的同一网站,内容是一致的
--上面的架构,坏掉任意一台内网web或squid,不影响网站的运行
测试:当缓存查不到,是否可以去找sibling的另一台squid
1,在两台web建立一个同名文件(内容不同)
2, 客户端去访问squid1的那个文件,得到内容缓存起来
3,关闭两台web ,然后客户端去访问squid2的那个文件,会得到同样的内容,说明是当缓存查不到,是先去查sibling的另一台
|
|