网站搜索

配置 Squid 代理服务器以限制访问并设置客户端使用代理 - 第 5 部分


Linux 基金会认证工程师是一位熟练的专业人员,拥有在 Linux 系统中安装、管理和排除网络服务故障的专业知识,并负责系统的设计、实施和持续维护 -广泛的架构。

介绍 Linux 基金会认证计划。

在本系列的第 1 部分中,我们展示了如何安装鱿鱼,一个用于 Web 客户端的代理缓存服务器。如果您尚未在系统上安装鱿鱼,请先参阅该帖子(下面给出的链接),然后再继续。

  1. 第 1 部分 – 安装网络服务并配置引导时自动启动

在本文中,我们将向您展示如何配置 Squid 代理服务器以授予或限制 Internet 访问,以及如何配置 http 客户端或 Web 浏览器以使用该代理服务器。

我的测试环境设置

鱿鱼服务器
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

让我们记住,简单来说,Web 代理服务器是一台(或多台)客户端计算机和特定网络资源(最常见的是访问互联网)之间的中介。换句话说,代理服务器的一侧直接连接到 Internet(或连接到 Internet 的路由器),另一侧连接到将通过其访问万维网的客户端计算机网络。

您可能想知道,为什么我要向我的网络基础设施添加另一个软件?

以下是最重要的 3 个原因:

1. Squid 存储以前请求的文件以加快将来的传输速度。例如,假设 client1 从 Internet 下载 CentOS-7.0-1406-x86_64-DVD.iso。当 client2 请求访问同一文件时,squid 可以从其缓存中传输该文件,而不是再次从 Internet 下载该文件。正如您所猜测的,您可以使用此功能来加速需要频繁更新的计算机网络中的数据传输。

2. ACL访问控制列表)允许我们限制对网站的访问,和/或监控每个用户的访问。例如,您可以根据星期几、一天中的时间或域来限制访问。

3. 通过使用向其发出请求并将请求内容返回给客户端的 Web 代理,而不是让客户端直接向 Internet 请求,可以绕过 Web 过滤器

例如,假设您登录 client1 并希望通过公司的路由器访问 www.facebook.com。由于该网站可能会被贵公司的政策阻止,因此您可以连接到网络代理服务器并让它请求访问 www.facebook.com。然后,远程内容会再次通过 Web 代理服务器返回给您,绕过公司路由器的阻止策略。

配置 Squid – 基础知识

Squid Web代理服务器的访问控制方案由两个不同的组件组成:

  1. ACL 元素 是以单词“acl”开头的指令行,表示针对任何请求事务执行的测试类型。
  2. 访问列表规则允许拒绝操作组成,后跟许多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 元素使用的基本示例。

  1. 第一个单词 acl 表示这是一个 ACL 元素指令行。
  2. 第二个单词 localhostlocalnet 指定指令的名称。
  3. 在本例中,第三个字 src 是 ACL 元素类型,分别用于表示客户端 IP 地址或地址范围。您可以通过 IP(或主机名,如果您实施了某种 DNS 解析)或通过网络地址指定单个主机。
  4. 第四个参数是一个过滤参数,它被“fed”给指令。

下面两行是访问列表规则,表示前面提到的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)以通过代理访问互联网,如下所示。

在火狐中

1. 转到编辑菜单并选择首选项选项。

2. 点击高级,然后点击网络选项卡,最后点击设置...

3.勾选手动代理配置并输入代理服务器的IP地址及其监听的端口用于连接。

注意默认情况下,Squid 侦听端口 3128,但您可以通过编辑访问列表来覆盖此行为> 以 http_port 开头的规则(默认情况下为 http_port 3128)。

4. 单击确定应用更改,然后就可以开始了。

验证客户端是否正在访问 Internet

您现在可以验证您的本地网络客户端是否通过代理访问互联网,如下所示。

1. 在您的客户端中,打开一个终端并输入,

ip address show eth0 | grep -Ei '(inet.*eth0)'

该命令将显示客户端的当前IP 地址(下图中的192.168.0.104)。

2. 在您的客户端中,使用网络浏览器打开任何给定的网站(在本例中为 www.howtoing.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

或者,我们可能只想在一天中的特定时间(上午 10:00 至 11:00)仅在星期一(M)允许访问这些网站, 周三 (W)周五 (F)

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 Tecmint's LFCE series
acl ncsa proxy_auth REQUIRED
http_access allow ncsa

注意:在CentOS 7中,squid的NCSA插件可以在/usr/lib64/squid/basic_nsca_auth中找到,因此在上面的行中进行相应的更改。

一些澄清:

  1. 我们需要通过指定程序名称(最有可能是 /usr/lib/squid/ncsa_auth/usr/lib64/squid/basic_nsca_auth),如果需要的话,加上任何命令行选项(在本例中为/etc/squid/passwd)。
  2. /etc/squid/passwd 文件是通过 htpasswd 创建的,这是一个通过文件管理基本身份验证的工具。它将允许我们添加允许使用 Squid 的用户名(及其相应的密码)列表。
  3. credentialsttl 30 分钟将要求每 30 分钟输入您的用户名和密码(您也可以用小时指定此时间间隔)。
  4. casesensitive on 表示用户名和密码区分大小写。
  5. realm 表示将用于对鱿鱼进行身份验证的身份验证对话框的文本。
  6. 最后,仅当代理身份验证(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

对上述指令的一些澄清。

  1. ufs是Squid的存储格式。
  2. /var/cache/squid 是存储缓存文件的顶级目录。该目录必须存在并且可由 Squid 写入(Squid 不会为您创建该目录)。
  3. 1000 是此目录下要使用的数量(以 MB 为单位)。
  4. 16是一级子目录的数量,而256/var/spool/squid中二级子目录的数量。
  5. maximum_object_size 指令指定缓存中允许的对象的最大大小。
  6. refresh_pattern 告诉 Squid 如何处理特定的文件类型(本例中为 .mp4.iso)以及它应该存储所请求的文件多长时间缓存中的对象(2880 分钟=2 天)。

第一个和第二个 2880 分别是没有明确到期时间的对象将被视为最近的对象的下限和上限,因此将由缓存提供服务,而 0% 是对象年龄(自上次修改以来的时间)的百分比,没有明确到期时间的每个对象将被视为最近的。

案例研究:从 2 个不同的客户端下载 .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 表示)。

HITMISS 关键字以及 200 http 响应代码表明文件两次均已成功提供,但缓存已命中和 分别为错过。当由于某种原因缓存无法为某个请求提供服务时,Squid 会尝试从 Internet 为其提供服务。

结论

在本文中,我们讨论了如何设置 Squid Web 缓存代理。您可以使用代理服务器按照选定的标准过滤内容,还可以减少延迟(因为相同的传入请求是从缓存中提供的,而缓存比实际提供内容的 Web 服务器更接近客户端,从而导致速度更快)数据传输)和网络流量(减少使用的带宽量,如果您为流量付费,这可以节省您的钱)。

您可能需要访问 Squid 网站以获取更多文档(请务必查看 wiki),但如果您有任何问题或意见,请随时与我们联系。我们将非常高兴收到您的来信!