分类: LINUX
2009-11-19 13:07:27
在局域网中,常常需要对访问外部资源进行控制。通常的做法是用防火墙(例如iptables)对某些IP或者端口进行管理,但这样不够灵活。
在RHEL5中使用Squid作为代理服务软件,不仅可以实现访问控制,也可以对访问内容进行控制。同时可以作为Cache提高访问速度。
一、Squid访问控制——ACL
ACL的语法格式如下:
acl aclname acltype string1 ...
acl aclname acltype "file" ...
当使用”file”时,”file”中的每一行只能包含一个item。
几种ACL类型简介:
默认情况下,正则表达式是大小写敏感的,加-i参数可以取消大小写敏感。
acl aclname src ip-address/netmask ... (客户端IP地址)
acl aclname src addr1-addr2/netmask ... (地址范围)
acl aclname dst ip-address/netmask ... (URL host's IP address)
acl aclname myip ip-address/netmask ... (本地IP)
acl aclname arp mac-address ... (xx:xx:xx:xx:xx:xx notation)
# arp ACL 需要特殊选项 --enable-arp-acl.
# /etc/init.d/squid restart --enable-arp-acl
acl aclname srcdomain .foo.com ... # 反解client IP
acl aclname dstdomain .foo.com ...
acl aclname srcdom_regex [-i] xxx ... # 正则表达式匹配客户端的主机名
acl aclname dstdom_regex [-i] xxx ...
#如果匹配不成功,可以使用”none”这个字来匹配。
acl aclname time [day-abbrevs] [h1:m1-h2:m2]
day-abbrevs:
S - Sunday
M - Monday
T - Tuesday
W - Wednesday
H - Thursday
F - Friday
A - Saturday
# h1:m1 必须小于 h2:m2
acl aclname port 80 70 21 ... #定义端口
acl aclname port 0-1024 ... #定义端口的范围
acl aclname myport 3128 ... # (local socket TCP port)
acl aclname proto HTTP FTP ...
acl aclname method GET POST ...
acl aclname browser [-i] regexp ... #过滤浏览器类型
# 这个选项会检查HTTP报头中的User-Agent选项
acl aclname referer_regex [-i] regexp ...
#正则表达式匹配HTTP报头中的Referer选项
acl aclname maxconn number
#每个IP的最大链接数
二、基于ACL网页内容过滤
acl aclname url_regex [-i] ^http:// ... # 匹配整个url地址
acl aclname urlpath_regex [-i] \.gif$ ... #匹配url中的路径
acl sexpath urlpath_regex "/usr/local/squid/etc/sex_path.txt"
acl sex url_regex "/usr/local/squid/etc/sex_tab.txt"
至於sex_path.txt的内容列举如下:
sex
fuck
而sex_tab.txt的内容列举如下:(注意在网址之前须使用^)
^
^
^
http_access allow manager localhost
#设定色情防治
http_access deny sexpath
http_access deny sex
#设定中可存取proxy
http_access allow school
http_access deny manager
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
….
http_access deny all
三、透明代理
要在一个网段的每一台计算机上都设置代理很不方便,所以可以利用NAT和Squid来实现透明代理功能。
实验要求:
Client1访问Server1的HTTP服务,默认访问80端口,在服务器端通过iptables将访问到80端口的包重定向到3128端口(Squid服务监听的端口)。这样对于客户端来说就完全意识不到有代理服务器的存在。
实验环境:
Client1 :
OS:Red Hat Enterprise Linux 5 update 4
Network:eth0 192.168.242.2/24
Gateway:192.168.242.3
Server1(Squid Server,HTTP Server):
OS:Red Hat Enterprise Linux 5 update 4
Network:eth0 10.66.5.144/24;eth1 192.168.242.3/24
实验步骤:
客户端:
1. 配置客户端的Gateway,设置为192.168.242.3,重启network服务使之生效。
#vi /etc/sysconfig/network-scripts/ifconfig-eth0
...
GATEWAY=192.168.242.3
...
#service network restart
2. 客户端的DNS服务器一定要指向正确的地址。
#vi /etc/resolv.conf
generated by /sbin/dhclient-script
search redhat.com
nameserver 66.187.233.210
nameserver 209.132.183.2
服务器:
1. 编辑squid.conf文件,配置合理的acl,使客户端不能访问。在http_port选项后加transparent参数,使squid支持透明代理。
#vi /etc/squid/squid.conf
...
acl localnet src 192.168.242.0/24
...
http_access deny localnet
...
http_port 3128 transparent
2. 配置防火墙规则,将访问到80端口的包重定向到3128端口;为了能使内网IP访问互联网,对私网IP做SNAT。
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.66.5.144
//对私网IP做SNAT
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
//DNAT
测试
在客户端访问,若出现Access Deny,则说明实验成功;若出现其他问题,则实验失败。
#elinks