29.4. 配置文件 /etc/squid/squid.conf

所有 Squid 代理服务器设置都在 /etc/squid/squid.conf 文件中进行。首次启动 Squid 时,不必在此文件中进行任何更改,但是外部客户机最初不具备访问权。代理可供 localhost 使用。默认端口为 3128。预装的配置文件 /etc/squid/squid.conf 提供了有关选项的详细信息和许多示例。几乎所有项都以 # 开头(各行都标有注释)并且在行尾可找到相关说明。给定值几乎总与默认值相关,因此多数情况下,仅删除注释符号而不更改任何参数实际上没有什么影响。如果可能,保持示例不变,并将选项连同修改的参数一起插入下一行。这样,便可容易地恢复默认值,并将其与所作更改进行比较。

[Tip]更新后调整配置文件

如果已从较早的 Squid 版本更新,建议编辑新的 /etc/squid/squid.conf,并只应用以前文件中的更改。如果试图使用旧的 squid.conf,配置文件可能不起作用,因为有时会修改选项并添加新的更改。

29.4.1. 常规配置选项(选择)

http_port 3128

这是 Squid 监听客户机请求所用的端口。默认端口为 3128,但也常使用 8080。如果需要,可指定多个以空格分隔的端口号。

cache_peer hostname type proxy-port icp-port

在此输入父代理(如果您想使用 ISP 的代理)。在 hostname 中输入要使用代理的名称和 IP 地址,在 type 中输入 parent。对于 proxy-port,输入同样是由父代理运营商设置的在浏览器中使用的端口号,通常为 8080。如果父代理的 ICP 端口未知并且该端口的使用与提供商无关,请将 icp-port 设为 70。此外,端口号后应指定 defaultno-query 以禁止使用 ICP 协议。借助提供商的代理,Squid 就可以像普通浏览器那样操作了。

cache_mem 8 MB

此项定义 Squid 可用于常用答复的内存大小。默认为 8 MB。它不指定 Squid 的内存使用率,并且可能已经超过。

cache_dir ufs /var/cache/squid/ 100 16 256

cache_dir 项定义在磁盘上储存所有对象的目录。末尾的数字表示可用的最大磁盘空间(以 MB 为单位)以及第一级和第二级目录数。不要改动 ufs 参数。默认情况下,在 /var/cache/squid 目录内占用 100 MB 磁盘空间,并在该目录内创建 16 个子目录,每个又可以再包含 256 个子目录。指定要使用的磁盘空间时,应预留足够的磁盘空间。在此最为合理的值应该是可用磁盘空间的 50%(最小)到 80%(最大)。在增大目录的后两个数字时一定要小心,因为目录过多也可能导致性能问题。如果有多个磁盘共享超速缓存,请输入多个 cache_dir 行。

cache_access_log /var/log/squid/access.log, cache_log /var/log/squid/cache.log, cache_store_log /var/log/squid/store.log

这三个条目将指定 Squid 记录其所有操作的路径。通常不做任何更改。如果 Squid 因使用频繁而负担过重,则可能需要将超速缓存和日志文件分散到多个磁盘上。

emulate_httpd_log off

如果该项设置为 on,则可以获取可读的日志文件。但有一些评估程序不能对此作出解释。

client_netmask 255.255.255.255

有了此条目,便可在日志文件中屏蔽客户机的 IP 地址。如果在此输入 255.255.255.0,IP 地址的最后一位将被设为 0。可以使用此方法来保护客户机的私密。

ftp_user Squid@

使用此项可以设置 Squid 执行匿名 FTP 登录时应使用的口令。在此可以指定有效的电子邮件地址,因为有些 FTP 服务器需要通过这种方式来验证有效性。

cache_mgr webmaster

一个电子邮件地址,Squid 在意外崩溃时会向该地址发送信件。默认为 webmaster

logfile_rotate 0

如果运行 squid -k rotateSquid 可以循环使用受保护的日志文件。在此过程中会给文件编号,并且在达到指定值后覆盖最早文件。默认值为 0,因为 SUSE Linux 中日志文件的存档和删除是由配置文件 /etc/logrotate/squid 中设置的 cron job(定时执行的作业)完成的。

append_domain <domain>

使用 append_domain 可指定自动追加的域(如果没有指定域)。通常,在此输入的是您自己的域,所以在浏览器中输入 www 将访问您自己的万维网服务器。

forwarded_for on

如果将此项设置为,Squid 会将客户机的 IP 地址和系统名称从 HTTP 请求中删除。否则,它会向标题中添加以下行

X-Forwarded-For: 192.168.0.0
negative_ttl 5 minutes; negative_dns_ttl 5 minutes

一般不必更改这些值。但如果使用拨号连接,因特网有时可能无法访问。Squid 会记录失败的请求并拒绝发出新的请求,即便重新建立因特网连接也无济于事。在这种情况下,将分钟改为秒钟,然后单击浏览器中的重装载,拨号进程会在几秒钟后重新启动。

never_direct allow acl_name

要防止 Squid 直接从因特网接受请求,应使用上述命令强制连接到另一个代理。事先必须已在 cache_peer 中输入该代理。如果将 acl_name 指定为 all,会强制所有请求直接转发给父代理。有时这可能是必要的,例如在您的提供商严格规定使用它的代理或拒绝通过其防火墙直接访问因特网时。

29.4.2. 访问控制选项

Squid 为控制针对代理的访问提供了一套周密的系统。通过实施 ACL 可以轻松并全面地进行配置。这涉及一些依次处理的规则的列表。使用 ACL 之前必须先定义 ACL。一些默认的 ACL 已经存在,如 alllocalhost。但是,仅仅定义 ACL 并不意味着实际应用 ACL。只有在与 http_access 规则一同使用时才不是这样。

acl <acl_name> <type> <data>

ACL 至少需要三个值来定义。名称 <acl_name> 可以任意选择。对于 <type>,可以在多种不同的选项中选择(在 /etc/squid/squid.conf 文件的 ACCESS CONTROLS 部分中可以找到这些选项)。<data> 的值取决于各 ACL 的类型,并且可以从文件中读取(例如,通过主机名、IP 地址或 URL)。以下是一些简单的示例:

acl mysurfers srcdomain .my-domain.com
acl teachers src 192.168.1.0/255.255.255.0
acl students src 192.168.7.0-192.168.9.0/255.255.255.0
acl lunch time MTWHF 12:00-15:00
http_access allow <acl_name>

http_access 定义谁可以使用代理,以及谁能够访问因特网上的什么内容。为此必须指定 ACL。上面已经定义了 localhostall,这两个 ACL 可以通过 denyallow 相应地拒绝或允许访问。可以创建一个包含任何数量 http_access 项的列表,按从上到下的顺序处理各个项,并且根据出现的先后顺序允许或拒绝访问相应的 URL。最后一项应始终是 http_access deny all。在下例中,localhost 可随意访问任何内容,而其它所有主机全部被拒绝访问。

http_access allow localhost
http_access deny all

在另外一个使用这些规则的示例中,teachers 组总能访问因特网。students 组只能在星期一到星期五的午餐时间访问。

http_access deny localhost
http_access allow teachers
http_access allow students lunch time
http_access deny all

为提高可读性,只应该在 /etc/squid/squid.conf 文件的指定位置输入带有 http_access 项的列表。即在文本

# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR
# CLIENTS

和最后的

http_access deny all
redirect_program /usr/bin/squidGuard

使用此选项可以指定重定向器(如 squidGuard),允许拦截不需要的 URL。通过代理鉴定和适当的 ACL 可以控制不同的用户组访问因特网。squidGuard 是一个可以安装和配置的独立软件包。

auth_param basic program /usr/sbin/pam_auth

如果必须在代理上鉴定用户,请设置一个相应的程序(如 pam_auth)。当首次访问 pam_auth 时,用户会看到一个用于输入用户名和口令的登录窗口。此外,仍然需要 ACL,只允许提供有效登录信息的客户机使用因特网:

acl password proxy_auth REQUIRED

http_access allow password
http_access deny all

可以用授权用户名的列表或指向此类列表的路径来替换 proxy_auth 后的 REQUIRED

ident_lookup_access allow <acl_name>

使用此选项,可以为 ACL 定义的所有客户机都运行 ident 请求以查找各个用户的身份。如果对 <acl_name> 应用了 all,此选项对所有客户机都有效。另外,必须在所有客户机上运行 ident 守护程序。对于 Linux,可为此安装 pidentd 软件包。对于 Microsoft Windows,可从因特网上下载免费软件。为确保只有成功进行 ident 查找的客户机才有权访问,请在此定义相应的 ACL:

acl identhosts ident REQUIRED

http_access allow identhosts
http_access deny all

这里同样需要用授权用户名列表来替换 REQUIRED。使用 ident 会明显延缓访问时间,因为每个请求都要重复进行 ident 查找。