配置具有受限访问的 Squid 代理服务器并设置客户端以使用代理 - 第 5 部分
Linux 基金会认证工程师是一位熟练的专业人士,他拥有在 Linux 系统中安装、管理和排除网络服务故障的专业知识,并负责系统范围架构的设计、实施和持续维护。
介绍Linux基金会认证计划。
在本系列的第 1 部分中,我们展示了如何安装 squid(一种用于 Web 客户端的代理缓存服务器)。如果您尚未在系统上安装 squid,请在继续之前参阅该文章(链接如下)。
在本文中,我们将向您展示如何配置 Squid 代理服务器以授予或限制 Internet 访问,以及如何配置 http 客户端或 Web 浏览器以使用该代理服务器。
我的测试环境设置
Squid 服务器
Operating System : Debian Wheezy 7.5 IP Address : 192.168.0.15 Hostname : dev2.gabrielcanepa.com.ar
客户端机器 1
Operating System : Ubuntu 12.04 IP Address : 192.168.0.104 Hostname : ubuntuOS.gabrielcanepa.com.ar
客户端机器 2
Operating System : CentOS-7.0-1406 IP Address : 192.168.0.17 Hostname : dev1.gabrielcanepa.com.ar
让我们记住,简单来说,网络代理服务器是一台(或多台)客户端计算机与某个网络资源(最常见的是访问互联网)之间的中介。换句话说,代理服务器一端直接连接到互联网(或连接到互联网的路由器),另一端连接到将通过它访问万维网的客户端计算机网络。
您可能想知道,为什么我要在我的网络基础设施中添加另一个软件?
以下是 3 个主要原因:
1. Squid 存储先前请求的文件以加快将来的传输速度。例如,假设客户端 1从 Internet下载CentOS-7.0-1406-x86_64-DVD.iso 。当客户端 2请求访问同一文件时,squid 可以从其缓存中传输该文件,而不是再次从 Internet 下载。正如您所猜测的,您可以使用此功能来加快需要频繁更新的计算机网络中的数据传输速度。
2. ACL(访问控制列表)允许我们限制对网站的访问,和/或监控每个用户的访问。例如,您可以根据星期几、一天中的时间或域来限制访问。
3.通过使用 Web 代理,可以绕过 Web 过滤器,向其发出请求并将所请求的内容返回给客户端,而不是让客户端直接向 Internet 发出请求。
例如,假设您已登录客户端 1并希望通过公司的路由器访问www.facebook.com 。由于该网站可能被公司政策屏蔽,因此您可以连接到 Web 代理服务器并让其请求访问www.facebook.com。然后,远程内容将再次通过 Web 代理服务器返回给您,从而绕过公司路由器的屏蔽政策。
配置 Squid - 基础知识
Squid Web 代理服务器的访问控制方案由两个不同的组件组成:
- ACL 元素是以“ acl ”开头的指令行,表示针对任何请求事务执行的测试类型。
- 访问列表规则由允许或拒绝操作以及随后的多个 ACL 元素组成,用于指示必须针对给定请求执行哪些操作或限制。它们按顺序进行检查,一旦其中一个规则匹配,列表搜索就会终止。如果规则有多个 ACL 元素,则将其实现为布尔 AND 运算(规则的所有 ACL 元素必须匹配,规则才匹配)。
Squid 的主要配置文件是/etc/squid/squid.conf,该文件大约有5000行,因为它既包含配置指令,又包含文档。因此,我们将创建一个新的squid.conf文件,其中只包含包含配置指令的行,以方便使用,省略空行或注释行。为此,我们将使用以下命令。
# mv /etc/squid/squid.conf /etc/squid/squid.conf.bkp
进而,
# grep -Eiv '(^#|^$)' /etc/squid/squid.conf.bkp OR # grep -ve ^# -ve ^$ /etc/squid/squid.conf.bkp > /etc/squid/squid.conf
现在,打开新创建的squid.conf文件,并查找(或添加)以下ACL元素和访问列表。
acl localhost src 127.0.0.1/32 acl localnet src 192.168.0.0/24
上面两行代表了ACL元素用法的基本示例。
- 第一个字acl表示这是一个 ACL 元素指令行。
- 第二个词,localhost或localnet,指定指令的名称。
- 第三个单词(在本例中为 src)是 ACL 元素类型,分别用于表示客户端 IP 地址或地址范围。您可以通过 IP(或主机名,如果您实施了某种 DNS 解析)或网络地址指定单个主机。
- 第四个参数是“输入”给指令的过滤参数。
下面两行是访问列表规则,代表前面提到的ACL指令的明确实现。简而言之,它们表示如果请求来自本地网络 ( localnet ) 或localhost ,则应授予http 访问权限。具体来说,允许的本地网络或本地主机地址是什么?答案是:localhost 和 localnet 指令中指定的地址。
http_access allow localnet http_access allow localhost
此时您可以重新启动Squid以应用任何待处理的更改。
# service squid restart [Upstart / sysvinit-based distributions] # systemctl restart squid.service [systemd-based distributions]
然后在本地网络中配置客户端浏览器(在我们的例子中为192.168.0.104)以通过您的代理访问互联网,如下所示。
在 Firefox 中
1.转到“编辑”菜单并选择“首选项”选项。
2.单击“高级”,然后单击“网络”选项卡,最后单击“设置” …
3.选中手动代理配置并输入代理服务器的IP 地址和监听连接的端口。
注意:默认情况下,Squid 监听端口3128,但你可以通过编辑以http_port开头的访问列表规则来覆盖此行为(默认情况下它读取http_port 3128)。
4.单击“确定”应用更改,一切就绪。
验证客户端是否正在访问互联网
您现在可以验证您的本地网络客户端是否正在通过您的代理访问互联网,如下所示。
1.在客户端中,打开终端并输入,
# ip address show eth0 | grep -Ei '(inet.*eth0)'
该命令将显示客户端的当前IP 地址(下图中的192.168.0.104 )。
2.在您的客户端中,使用 Web 浏览器打开任何给定的网站(本例中为www.example.com )。
3.在服务器中运行。
# tail -f /var/log/squid/access.log
您将获得通过Squid处理的请求的实时视图。
限制客户端访问
现在假设您想要明确拒绝对该特定客户端 IP 地址的访问,同时仍保留对本地网络其余部分的访问。
1.定义一个新的ACL指令如下(我将其命名为ubuntuOS,但您可以随意命名)。
acl ubuntuOS src 192.168.0.104
2.将ACL指令添加到已存在的localnet 访问列表中,但在其前面加上感叹号。这表示“允许与 localnet ACL 指令匹配的客户端访问 Internet,但与 ubuntuOS 指令匹配的客户端除外”。
http_access allow localnet !ubuntuOS
3.现在我们需要重新启动 Squid 以应用更改。然后如果我们尝试浏览任何网站,我们会发现访问现在被拒绝。
配置 Squid – 微调
按域和/或按一天中的时间/一周中的日子限制访问
为了通过域限制对 Squid 的访问,我们将在ACL指令中使用dstdomain关键字,如下所示。
acl forbidden dstdomain "/etc/squid/forbidden_domains"
其中forbidden_domains是一个纯文本文件,其中包含我们希望拒绝访问的域。
最后,对于与上述指令不匹配的请求,我们必须授予 Squid 访问权限。
http_access allow localnet !forbidden
或者也许我们只想允许在星期一 (M)、星期三 (W)和星期五 (F)的某个时间段 (上午 10:00 至 11:00 )访问这些网站。
acl someDays time MWF 10:00-11:00 http_access allow forbidden someDays http_access deny forbidden
否则,这些域的访问将被阻止。
通过用户身份验证限制访问
Squid 支持多种身份验证机制(Basic、NTLM、Digest、SPNEGO 和 Oauth)和辅助程序(SQL 数据库、LDAP、NIS、NCSA 等等)。在本教程中,我们将使用NCSA 的基本身份验证。
将以下行添加到您的/etc/squid/squid.conf文件中。
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd auth_param basic credentialsttl 30 minutes auth_param basic casesensitive on auth_param basic realm Squid proxy-caching web server for Example's LFCE series acl ncsa proxy_auth REQUIRED http_access allow ncsa
注意:在CentOS 7中,可以在/usr/lib64/squid/basic_nsca_auth中找到 squid 的 NCSA 插件,因此请在上行中进行相应的更改。
一些澄清:
- 我们需要通过指定程序名称(最有可能的是 /usr/lib/squid/ncsa_auth 或 /usr/lib64/squid/basic_nsca_auth )以及任何命令行选项(在本例中为 /etc/squid/passwd )来告诉Squid使用哪个身份验证辅助程序与auth_param指令。
- /etc/squid/passwd文件是通过htpasswd创建的,htpasswd 是一个通过文件管理基本身份验证的工具。它允许我们添加允许使用 Squid 的用户名(及其对应的密码)列表。
- credentialsttl 30 分钟将要求每 30 分钟输入一次您的用户名和密码(您也可以用小时指定此时间间隔)。
- casesensitive on 表示用户名和密码区分大小写。
- realm代表用于向 squid 进行身份验证的身份验证对话框的文本。
- 最后,仅当代理身份验证( proxy_auth REQUIRED)成功时才授予访问权限。
运行以下命令来创建文件并为用户gacanepa添加凭据(如果文件已存在,则省略-c标志)。
# htpasswd -c /etc/squid/passwd gacanepa
在客户端机器上打开 Web 浏览器并尝试浏览任何给定的站点。
如果身份验证成功,则允许访问请求的资源。否则,访问将被拒绝。
使用缓存加速数据传输
Squid 的一个显著特点是可以将从 Web 请求的资源缓存到磁盘,以便加快同一客户端或其他客户端将来对这些对象的请求。
在您的squid.conf文件中添加以下指令。
cache_dir ufs /var/cache/squid 1000 16 256 maximum_object_size 100 MB refresh_pattern .*\.(mp4|iso) 2880
对上述指令的一些澄清。
- ufs是 Squid 存储格式。
- /var/cache/squid是存储缓存文件的顶级目录。此目录必须存在,并且 Squid 可写入(Squid 不会为您创建此目录)。
- 1000是此目录下要使用的数量(以 MB 为单位)。
- 16是一级子目录的数量,而256是/var/spool/squid中的二级子目录的数量。
- maximum_object_size指令指定缓存中允许的对象的最大大小。
- refresh_pattern告诉 Squid 如何处理特定的文件类型(在本例中为.mp4和.iso)以及应该将请求的对象存储在缓存中多长时间(2880 分钟 = 2 天)。
第一个和第二个2880分别是没有明确到期时间的对象被视为最近的时间的下限和上限,因此将由缓存提供服务,而0%是对象年龄(自上次修改以来的时间)的百分比,每个没有明确到期时间的对象将被视为最近的对象。
案例研究:从两个不同的客户端下载 .mp4 文件并测试缓存
第一个客户端(IP 192.168.0.104)在 2 分 52 秒内下载了一个71 MB 的 .mp4文件。
第二个客户端(IP 192.168.0.17)在 1.4 秒内下载了同一个文件!
这是因为在第二种情况下,文件是从Squid 缓存中提供的(由TCP_HIT/200表示),而不是在第一种情况下,文件是直接从互联网上下载的(由TCP_MISS/200表示)。
HIT和MISS关键字以及200 http响应代码分别表示两次文件都已成功提供,但缓存分别为 HIT 和 Missed。当缓存因某种原因无法提供请求时,Squid 会尝试从 Internet 提供该请求。
结论
在本文中,我们讨论了如何设置Squid Web 缓存代理。您可以使用代理服务器根据选定的标准过滤内容,还可以减少延迟(因为相同的传入请求由缓存提供,缓存比实际提供内容的 Web 服务器更靠近客户端,从而加快数据传输速度)和网络流量(减少使用的带宽量,如果您为流量付费,这可以为您节省资金)。
您可能希望参考Squid 网站以获取更多文档(请务必查看 wiki),但如果您有任何问题或意见,请随时与我们联系。我们非常乐意收到您的来信!