3. Squid高级配置
很多情况下, 我们上面所说的基本配置足以保证浏览提速和保护网络了, 但是Squid的功能远不止于此。下面我们仅讨论其中的很小一部分。
3.1 更多的访问控制
尽管多数人仅使用最基本的访问控制方案, 但是Squid的访问控制系统功能非常强大灵活, 允许你从更深层控制对缓存内容的访问。到目前为止,我们主要接触了ACLs,它的过滤规则基于源IP地址或者目标端口, 但是还有很多其它的 ACL 类型。在这里, 我们将粗略地说一下主要的, 仅仅是让读者了解一下Squid的 ACLs 可以做什么; 更详尽的信息请自行参阅
文档。
Squid的一个 ACL 由至少4区块构成: acl 关键字, 后面跟一个 (也有可能是描述) 唯一的名称, ACL 类型和一个或多个判断字符串。所以, Squid的ACL大致的语法像这样:
代码: 全选
acl name type (string|"filename") [string2] [string3] ["filename2"]
一个 ACL 包含多个判断字符串,如果匹配任何判断字符串则会返回 (也就是说,判断字符串之间的关系是“或”)。为了避免数百行ACL规则搞乱配置文件,你可以用绝对路径指定一个文件 (在双引号内) ,这个文件里每个每个判断字符串占用一行。
下面列出的是一些最常用的 ACL 类型:
源/目标 IP地址
[INDENT]过滤基于源IP地址 (src 类) 或者目标IP地址 (dst 类)。既可以使用传统的l "IP/Netmask" 也可以使用CIDR "IP/Bits" 这两种表示法。例如:
代码: 全选
# "Traditional" notation
acl myNet1 src 192.168.0.0/255.255.255.0
# Address range with CIDR notation
acl myNet2 src 172.16.0.0-172.16.2.0/24
# Filtering on destination address
acl badNet dst 10.0.0.0/24
[/INDENT]源/目标 域名
[INDENT]Squid可以允许/拒绝那些去往/来自特定域名的请求 (类型分别是dstdomain 和 srcdomain )。如果你想拒绝到一个站点的访问, 别忘了同时也拒绝访问其IP地址, 否则这条规则会被轻松突破。例如:
代码: 全选
# Match a specific site
acl badDomain dstdomain forbidden.site
# Match the IP address of "forbidden.site"
acl badDomainIP dst 1.2.3.4
也可以使用正则表达式来检查一个请求的源域名 (srcdom_regex 类型) 和目标域名 (dstdom_regex 类) 。例如:
代码: 全选
# Match domains containing the word "sex" and a ".com" TLD (the match is case
# insensitive because of the '-i' flag)
acl badSites dstdom_regex -i sex.*\.com$
[/INDENT]包含在请求的URL里面的词汇
[INDENT]Squid可使用正则表达式过滤URL里匹配的特征(url_regex 类); 如果你不关心具体是什么 URL-类型以及域名, 你可以用 urlpath_regex 类来代替。
代码: 全选
# Match the most common video files extensions
acl movies urlpath_regex -i \.avi$ \.mpg$ \.mpeg$ \.wmv$ \.asf$ \.mov$
# Match JPG images from URLs containing the word "sex"
acl sexImg url_regex -i sex.*\.jpg$
[/INDENT]当前的 日期/时间
[INDENT]Squid允许根据时间来允许/拒绝访问特定的站点。语法是:
代码: 全选
acl name time [day-list] [start_hour:minute-end_hour:minute]
这里的 day-list 是一个用单个字符表示的 acl 具体应用在哪些“day”的清单 (
Sunday,
Monday,
Tuesday,
Wednesday, T
Hhursday,
Friday, S
Aturday). E.g.:
代码: 全选
acl workhours time MTWHF 08:00-18:00acl weekend time SAacl morning time 07:00-13:00
[/INDENT]目标端口
[INDENT]Squid的过滤可以基于目标端口。例如: acl SSL_ports port 443 563acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1024-65535
其中协议 (FTP, HTTP, SSL)是Squid的acl协议类型,它允许Squid 根据 acl 类型来 允许/拒绝 访问请求。例如:
代码: 全选
acl SSL_ports port 443 563
acl Safe_ports port 80 21 443 563 70 210 280 488 591 777 1024-65535
[/INDENT]方式 (HTTP GET, POST 或 CONNECT)
[INDENT]ACL方式类可以让你基于请求的HTTP方式限制访问, 也就是 GET (用于下载), POST (用于上传) 和 CONNECT (用于SSL数据传输)。例如:
代码: 全选
# Deny CONNECT to other than SSL ports
acl connect method CONNECT
http_access deny connect !SSL_ports
很重要的方法是你可以阻止CONNECT类的请求访问非SSL端口。这里的 CONNECT方式允许数据在任何时间及方向上的传输, 不管使用的是什么传输协议。否则可能是这样的结果:一个恶意用户可以
telnet(1) 到一个 (非常) 不好的代理服务器, 例如这样:
代码: 全选
$ telnet bad.proxy.tld 3128
Trying 1.2.3.4...
Connected to bad.proxy.tld.
Escape character is '^]'.
CONNECT telnet.server.tld:23 HTTP/1.1
然后结束到远程服务器的连接, 好像连接是来自该服务器原生的。
[/INDENT]浏览器类型
[INDENT]这个acl 浏览器类型允许你指定一个正规表达式用于基于User-Agent header的 允许/拒绝 访问控制。例如:
代码: 全选
# Deny access to MS Internet Explorer
acl MSIE browser MSIE
http_access deny MSIE
[/INDENT]Username/Password pair
[INDENT]用户认证允许你跟踪Internet访问的使用和收集每个用户的统计信息。 最简单的认证机制是使用基本机制, 也就是用储存在一个文件里的 username/password 组。要创建该文件, 你可以使用
htpasswd(1) 命令:
代码: 全选
# /usr/bin/htpasswd -c /etc/squid/squid.passwd danix
New password: dAn1x
Re-type new password: dAn1x
Adding password for user danix
#
认证参数的设定使用 auth_param 标签; 然后, 为了真正激活认证你需要基于http_access (proxy_auth 或 proxy_auth_regex)里的login名称或者用在format标签里面的external_acl_type 带有 %LOGIN 来使用ACL。例如:
代码: 全选
# Configure traditional (basic) proxy authentication
auth_param basic program /usr/local/libexec/ncsa_auth /etc/squid/squid.passwd
# Number of authenticator processes to spawn
auth_param basic children 5
# Realm to be reported to the client
auth_param basic realm Squid proxy-caching web server
# Usernames are case insensitive
auth_param basic casesensitive off
# Credentials time to live
auth_param basic credentialsttl 12 hours
# Using REQUIRED will accept any valid username
acl AUTH proxy_auth REQUIRED
# Don't require authentication to localhost
http_access allow localhost
# Only allow authenticated requests coming from the LAN
http_access allow AUTH lan
# Default deny
http_access deny all
[/INDENT]SNMP通讯
[INDENT]可以基于请求的SNMP通讯来限制SNMP查询。例如:
代码: 全选
# Address of the cache administrator
acl snmpManager src 172.16.0.100
# Non-sensitive information
acl SNMPPublic snmp_community public
# Allow any request from the cache administrator
snmp_access allow snmpManager
# Clients on the LAN can only query non-sensitive information
snmp_access allow SNMPPublic lan
# Default deny
snmp_access deny all
[/INDENT]
3.2 Http加速器模式 (反向代理)
按照此
文档, 启用Squid的加速模式仅在很有限的环境中才有效果:
- 加速一台慢速服务器;
- 用Squid代替一台整合了 cache/web 的服务器;
- 透明缓存;
- 保护一个不加密的web服务器。
除了这些情况, 我们强烈不推荐开启加速器模式。加速器模式配置很简单; 下面是一个Squid服务器加速请求到一台慢速服务器的简单配置。
文件 /etc/squid/squid.conf
代码: 全选
# In accelerator mode, Squid usually listens on the standard www port
http_port 80 accel vhost
# Do the SSL work at the accelerator level. To create the certificates, run:
# openssl req -x509 -newkey rsa:2048 -keyout squid.key -out squid.crt \
# -days 365 -nodes
https_port 443 cert=/etc/ssl/squid.crt key=/etc/ssl/private/squid.key
# Accelerated server address and port
cache_peer 172.16.1.217 parent 80 0 no-query originserver
# Do not rewrite 'Host:' headers
url_rewrite_host_header off
# Process multiple requests for the same URI as one request
collapsed_forwarding on
# Allow requests when they are to the accelerated machine AND to the
# right port
acl webSrv dst 172.16.1.217
acl webPrt port 80
acl all src all
http_access allow webSrv webPrt
http_access allow all
always_direct allow webSrv
3.3 透明缓存
透明缓存的意思是有一个过滤设备, 例如一个路由器或者一个防火墙, 默默地将web通讯重定向到缓存服务器。客户端忽略它们和web服务器之间的代理服务器的存在,认为自己直接与web服务器通讯。结果是, 透明缓存不需要在客户端进行任何配置, 因此让维护工作更加简单和快捷和。不过,在另一方面, 一个透明拦截代理无法使用认证或者透明地代理HTTPS协议。
在配置Squid前, 我们需要在我们的
防火墙 (the involved firewalls are those between the LAN, where clients reside, and the DMZ, where the cache server is placed)上启用web通讯重定向. 下面是简单的
pf.conf(5) 规则:
文件/etc/pf.conf
代码: 全选
[...]
# LAN interface
lan_if = rl1
# Cache server and port
cache_srv = proxy.kernel-panic.it
cache_port = 3128
# Transparently redirect web traffic to the cache server
pass in on $lan_if proto tcp from $lan_if:network to any port www \
rdr-to $cache_srv port $cache_port
[...]
Squid configuration is quite simple:
文件 /etc/squid/squid.conf
代码: 全选
# Port on which connections are redirected
http_port 3128 transparent
3.4 SNMP
SNMP 是一系列用于网络管理和监视的协议。如果你
安装了 带"snmp" 性能的fSquid package, 那么代理服务器将可以通过SNMP提供统计和状态的服务。
SNMP的配额相当简单:
文件 /etc/squid/squid.conf
代码: 全选
# By default, Squid listens for SNMP packets on port 3401, to avoid conflicting
# with any other SNMP agent listening on the standard port 161.
snmp_port 3401
# Address to listen on (0.0.0.0 means all interfaces)
snmp_incoming_address 0.0.0.0
# Address to reply on (255.255.255.255 means the same as snmp_incoming_address)
# Only change this if you want to have SNMP replies sent using another address
# than where Squid listens for SNMP queries.
# snmp_incoming_address and snmp_outgoing_address can't have the same value
# since they both use port 3401.
snmp_outgoing_address 255.255.255.255
# Configuring access control is strongly recommended since some SNMP
# information is confidential
acl all src all
acl lan src 172.16.0.0/24
acl snmpManager src 172.16.0.100
acl publicCommunity snmp_community public
snmp_access allow snmpManager
snmp_access allow publicCommunity lan
snmp_access deny all
你可以测试一下是否 SNMP 可以和
snmpwalk 程序 (snmpwalk是
NET-SNMP 项目的一部分) 协同工作。例如:
代码: 全选
# snmpwalk -c public -v 1 proxy.kernel-panic.it:3401 .1.3.6.1.4.1.3495.1.1
SNMPv2-SMI::enterprises.3495.1.1.1.0 = INTEGER: 356
SNMPv2-SMI::enterprises.3495.1.1.2.0 = INTEGER: 744
SNMPv2-SMI::enterprises.3495.1.1.3.0 = Timeticks: (540791) 1:30:07.91
#
请参阅这篇
文档 以了解snmpwalk命令输出内容的相关信息。