ACL元素定义的语法如下:
acl aclname acltype string1…
acl aclname acltype "file"…
当使用文件时,该文件的格式为每行包含一个条目。
其中,acltype可以是src、dst、srcdomain、dstdomain、url_regex、urlpath_regex、time、port、proto、method中的一任意一种。
src:指明源地址。可以用以下的方法指定:
acl aclname src ip-address/netmask ... 客户ip地址
acl aclname src addr1-addr2/netmask ... 地址范围
dst:指明目标地址,即客户请求的服务器的IP地址。语法为:
acl aclname dst ip-address/netmask ...
srcdomain:指明客户所属的域,Squid将根据客户IP反向查询DNS。语法为:
acl aclname srcdomain foo.com ...
dstdomain:指明请求服务器所属的域,由客户请求的URL决定。语法为:
acl aclname dstdomain foo.com ...。此处需要注意的是:如果用户使用服务器IP而非完整的域名时,Squid将进行反向的DNS解析来确定其完整域名,如果失败,就记录为“none”。
time:指明访问时间。语法如下:
acl aclname time [day-abbrevs] [h1:m1-h2:m2][hh:mm-hh:mm]
日期的缩写指代关系如下:
1.S:指代Sunday
2.M:指代Monday
3.T:指代Tuesday
4.W:指代Wednesday
5.H:指代Thursday
6.F:指代Friday
7.A:指代Saturday
另外,h1:m1必须小于h2:m2,表达式为[hh:mm-hh:mm]。
port:指定访问端口。可以指定多个端口,比如:
acl aclname port 80 70 21 ...
acl aclname port 0-1024 ... 指定一个端口范围
proto:指定使用协议。可以指定多个协议:
acl aclname proto HTTP FTP ...
method:指定请求方法。比如:
acl aclname method GET POST ...
url_regex:URL规则表达式匹配,语法为:
acl aclname url_regex[-i] pattern
urlpath_regex:URL-path规则表达式匹配,略去协议和主机名。其语法为:
acl aclname urlpath_regex[-i] pattern
在使用上述ACL元素的过程中,要注意如下几点:
1.acltype可以是任一个在ACL中定义的名称。
2.任何两个ACL元素不能用相同的名字。
3.每个ACL由列表值组成。当进行匹配检测的时候,多个值由逻辑或运算连接;换句话说,任一ACL元素的值被匹配,则这个ACL元素即被匹配。
4.并不是所有的ACL元素都能使用访问列表中的全部类型。
5.不同的ACL元素写在不同行中,Squid将这些元素组合在一个列表中
CDN简介
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
二:案例一(透明代理)
案例要求:
client客户端不用在应用服务器上设置代理服务器ip和端口,就能直接访问internet资源,即实现透明代理。
拓扑图:
配置步骤
客户端配置
编辑 /etc/sysctl.conf 打开数据包转发能力
[root@localhost ~]# vim /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1
是数据包转发能力生效
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
在squid所在的机器上,设置关于dns的nat转换
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.28.0/24 -p udp --dport 53 -o eth0 -j MASQUERADE
设置端口重定向
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j REDIRECT --to-ports 3128
在squid配置中加入 transparent
[root@localhost ~]# vim /etc/squid/squid.conf
# Squid normally listens to port 3128
http_port 192.168.28.100:3128 transparent
重启squid服务
[root@localhost ~]# service squid restart
停止 squid:. [确定]
启动 squid:. [确定]
测试
查看日志
[root@localhost ~]# tail -f /var/log/squid/access.log
1345387179.776 1234 192.168.28.200 TCP_MISS/200 4431 GET http://www.baidu.com/ - DIRECT/119.75.218.77 text/html
1345387179.799 23 192.168.28.200 TCP_HIT/200 2084 GET http://www.baidu.com/img/baidu_sylogo1.gif - NONE/- p_w_picpath/gif
1345387180.212 5 192.168.28.200 TCP_HIT/200 542 GET http://www.baidu.com/cache/global/img/gs.gif - NONE/- p_w_picpath/gif
1345387180.215 2 192.168.28.200 TCP_HIT/200 1105 GET http://s1.bdstatic.com/r/www/img/i-1.0.0.png - NONE/- p_w_picpath/png
1345387189.913 9700 192.168.28.200 TCP_MISS/200 12980 GET http://s1.bdstatic.com/r/www/cache/global/js/home-1.3.js - DIRECT/113.105.244.109 application/javascript
1345387190.616 703 192.168.28.200 TCP_MISS/200 23028 GET http://s1.bdstatic.com/r/www/cache/global/js/tangram-1.3.4c1.0.js - DIRECT/113.105.244.109 application/javascript
1345387190.871 254 192.168.28.200 TCP_MISS/200 10383 GET http://s1.bdstatic.com/r/www/cache/user/js/u-1.3.3.js - DIRECT/113.105.244.109 application/javascript
下面设置访问控制
1.假设内网中的192.168.28.88的主机不允许访问Internet其他网段主机可以访问设置如下
[root@localhost ~]# vim /etc/squid/squid.conf
acl noip src 192.168.28.88/32
http_access deny noip
重启squid服务
[root@localhost ~]# service squid restart
停止 squid: [确定]
启动 squid:. [确定]
测试结果:
查看日志显示
[root@localhost ~]# tail -f /var/log/squid/access.log
1345392656.009 0 192.168.28.88 TCP_DENIED/403 1405 GET http://baidu.com/ - NONE/- text/html
1345392657.769 0 192.168.28.88 TCP_DENIED/403 1429 GET http://222.85.64.169/wpad.dat - NONE/- text/html
1345392658.623 0 192.168.28.88 TCP_DENIED/403 1529 POST http://stats1.update.microsoft.com/ReportingWebService/ReportingWebService.asmx - NONE/- text/html
1345392679.871 0 192.168.28.88 TCP_DENIED/403 1529 POST http://stats1.update.microsoft.com/ReportingWebService/ReportingWebService.asmx - NONE/- text/html
1345392700.974 0 192.168.28.88 TCP_DENIED/403 1529 POST http://stats1.update.microsoft.com/ReportingWebService/ReportingWebService.asmx - NONE/- text/html
改变内网机器ip为192.168.28.89 测试效果如下
2.假设内网机器从周一到周五的8点到18点为工作时间不能上网,其他时间可以上网。设置如下
[root@localhost ~]# vim /etc/squid/squid.conf
acl work time MTWHF 08:00-18:00
http_access deny work
[root@localhost ~]# service squid restart
停止 squid:. [确定]
启动 squid:. [确定]
查看时间
[root@localhost ~]# date
2012年 08月 29日 星期三 15:15:08 CST
测试结果
修改工作以外的时间
[root@localhost ~]# date 090119142012
2012年 09月 01日 星期六 19:14:00 CST
重启服务测试结果如下
三:案例二(反向代理)
案例要求:
Web服务器通过squid服务器和Internet连接,Internet用户通过反向代理访问web服务器
案例拓扑图:
配置步骤
Web服务器配置
安装apache服务编辑页面
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# echo "you are right" >index.html
测试访问页面
[root@localhost Server]# lynx http://127.0.0.1
Squid设置
编辑squid配置脚本
[root@localhost ~]# vim /etc/squid/squid.conf
# Squid normally listens to port 3128
920 http_port 192.168.101.87:80 vhost
1184 # cache_peer parent.foo.net parent 3128 3130 proxy-only default
1185 cache_peer 192.168.28.128 parent 80 0 originserver
1186 # cache_peer sib1.foo.net sibling 3128 3130 proxy-only
1187 # cache_peer sib2.foo.net sibling 3128 3130 proxy-only
检测语法
[root@localhost ~]# squid -k parse
[root@localhost ~]# service squid restart
停止 squid:. [确定]
启动 squid:. [确定]
查看端口
[root@localhost ~]# netstat -tupln |grep squid
tcp 0 0 192.168.28.100:3128 0.0.0.0:* LISTEN 2434/(squid)
测试