部署的是squid-3.0.PRE4.tar.gz,不加iptables,不使用任何外加插件
下面不是部署全过程,只是一点心得
一、configure的时候要注意参数
- 如果要使用HTTPS,要加上–enable-ssl(我加了才发现用不到……)
- 如果要在定义ACL的时候使用arp选项(即使用MAC地址来判定用户)需要加上–enable-arp-acl
- 如果要允许解析的URL中出现下划线,要加上–enable-underscore,因为默认情况下Squid会认为带下划线的URL是非法的,并拒绝访问该地址。这个我没试过
二、ACL配置
如果不加载第三方工具,ACL配置是Squid中唯一的访问控制方法。这个东西的功能其实跟CCProxy的身份控制差不多(但是没有用户名密码认证功能),但是配置起来要更复杂也更强大。
-
配置格式:acl aclname acltype string1
-
常用的定义类型:
- src ip-address/netmask
src addr1-addr2/netmask
用来源的IP地址定义,一个ip#即mask方式就是网络,cidr方式就是单个ip - acl aclname dst ip-address/netmask
目标地址 - acl aclname arp mac-address
后悔编译的时候没加–enable-arp-acl参数,这个功能很有用的 - acl aclname dstdomain .foo.com
类似于CCProxy的访问限制,例如可以限制只能访问.cn的站点、不能访问.xxx的站点等等 - acl aclname dstdom_regex [-i] xxx
用正则,不过……谁这么无聊呢…… - acl aclname http_status 200 301 500- 400-403
根据HTTP Response返回值,这个很有效,比如规定302Moved就不访问 - acl aclname port
端口 - acl aclname proto
协议 - acl aclname method
方式,例如只能GET不能CONNECT -
acl aclname browser [-i] regexp
这个也太强了……限制浏览器用户代理标志类型
还可以规定mime类型、响应时间等等等等……绝对强大
我的ACL设置:
很简单的设置,没有用复杂的功能限制
以下是默认的,直接使用了:
acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl to_localhost dst 127.0.0.0/8 acl SSL_ports port 443 563 acl Safe_ports port 80 # http acl Safe_ports port 21 # ftp acl Safe_ports port 443 563 # https, snews acl Safe_ports port 70 # gopher acl Safe_ports port 210 # wais acl Safe_ports port 1025-65535 # unregistered ports acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT
以下是我修改的:
http_access allow CONNECT all #默认是这句http_access deny CONNECT !SSL_ports #这样才能支持使用HTTPS地址前缀,也才能在下级生成Socks、FTP等代理 acl LilyStudio src ip1 ip2 #两个ip地址是我要让其允许访问的 http_access allow LilyStudio http_access deny all
要注意,acl 定义的name是全局的,也就是说不能重复定义一个name,即
acl a src 210.29.240.1 acl a src 210.29.240.2
只会有后一条起作用
经过这样的配置,Squid就能完整地运行了,下面我们来看看在校园网内部署的时候,必不可少的二级代理的功能
三、二级代理的使用
首先,要使用上级代理可以这样写配置文件
cache_peer proxy1 parent port1 port2 proxy-only login=user:pwd no-query default
- 其中proxy1是上级代理的IP地址,port1是其http端口号,port2是icp端口号(打开的话,一般为3130,在此我们使用0,禁用
- parent表示这是一个父代理(后面会提到兄弟代理)
- login的作用是给上级代理的用户验证
- proxy-only表示不进行本地缓存,直接将这个缓存服务器的内容转发给客户
- no-query表示不发送icp信息
- default表示这个代理是“最后的”选择,即如果所有线路都不通就发送给它,特别在不使用icp的时候有用
Squid还支持所谓的兄弟代理(Sibling类型),对于父代理,Squid会一直向其要数据(如果没有本地缓存),等不到回应就无动作或返回超时;对于兄弟代理,Squid先从其上寻找数据,找不到则自己直接去访问数据,简而言之兄弟代理是另一个缓存而已。
以下这段是转的:
一般 Squid Server 运作的模式是:
1. 当 Squid Server 没有资料时,会先向 Sibling 的 Squid Server 要资料,如果 Sibling 没资料,就跳过它直接向 Parent 要。
2. 向 Parent 要资料,然後一直等,直到 Parent 给它资料为止(Parent 自己有的资料或上 internet 去拿)。
3. 没有 Parent 时,就自己上 internet 去拿。
4. 如果这三者都拿不到资料,才向用户端回报拿不到资料。一般而言,把网路上一层的 Squid Server 设成 Sibling 是不错的选择,因为网路上一层的 Squid Server 服务对象较多,其硬体较强,离我们比较近,速度也比较快;万一要不到资料,我们还可以自己上 internet 去拿。那什么时候设 Parent?当您的出口只有一个,或上一层 Squid Server 拿不到资料,自己也一定拿不到,只好将上一层 Squid Server 设为 Parent。
四、二级代理中的http CONNECT的问题
首先要确保Http_access中,
#http_access deny CONNECT !SSL_ports这句话要注释掉
然后要写这个(查了官方FAQ才知道的)
never_direct allow all
所有的访问都不会被直接转向,都必须通过cache_peer
否则所有的GET会被发往上级代理,而CONNECT则会被发往目标地址,由于我们需要所有的情况都使用二级代理,所以需要如此设置
Related posts:
Recent Comments