Rocky Linux 9:搭建安全私密的Squid代理服务器教程

引言

代理服务器是一种有效的方式,用于缓存或混淆网络流量。这意味着网页请求可以从不同的入站或出站地址提供服务,通过将连接卸载到中间人。对于普通用户而言,这通常意味着您可以使用不同的IP地址发送网页请求。这在多种场景下都非常有用,例如研究不同司法管辖区的网页服务方式,或规避某些监控或网络流量限制。

市面上有许多第三方代理服务提供商,但它们可能并不可靠——特别是当您使用代理的主要目的是将流量从您的互联网服务提供商(ISP)中路由出去时,商业代理提供商反而可能更不安全或在法律上约束较少。

Squid是一个稳定、流行的开源HTTP代理。在本教程中,您将学习如何在Rocky Linux 9上安装并配置Squid,以提供一个HTTP代理服务。

先决条件

为了完成本指南,您将需要:

  • 一台Rocky Linux 9服务器,以及一个具有sudo权限的非root用户。您可以查阅我们的《Rocky Linux 9初始服务器设置指南》来了解如何设置具有这些权限的用户。

在本教程中,您将使用域名your_domain作为示例,但您应该替换为自己的实际域名或IP地址。

第一步 – 安装Squid代理

Squid在个体用户的出站流量路由之外有许多用途。在大型服务器部署的背景下,它可以作为分布式缓存机制、负载均衡器或路由堆栈的另一个组成部分。然而,一些通常涉及代理服务器的水平扩展服务器流量的方法已经被容器化框架(如Kubernetes)所超越,这些框架可以分发应用程序的更多组件。与此同时,使用代理服务器重定向网页请求以保护个人隐私的做法越来越普遍。在使用开源代理服务器时需要注意,它们可能在较低优先级维护模式下拥有许多功能。代理服务器的用途随着时间的推移而改变,但其基本技术并未改变。

在Rocky Linux的默认软件包源中,无法直接获取到Squid软件包。相反,您可以通过EPEL(Extra Packages for Enterprise Linux)软件仓库安装Squid。EPEL是基于RHEL发行版的最流行的附加软件包仓库,其中包含一些官方软件源未提供的可信的第三方软件包。

要添加Rocky Linux的EPEL软件仓库,请使用dnf软件包管理器运行dnf install epel-release

  1. sudo dnf install epel-release

 

接下来,您可以通过dnf安装Squid。

  1. sudo dnf install squid

 

在Rocky Linux上,Squid安装后不会自动启动。通过使用systemctl status命令,您可以检查到一个服务已创建但处于非活动状态。

  1. systemctl status squid.service

 

输出

● squid.service – Squid caching proxy

Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disa>

Active: inactive (dead)

Docs: man:squid(8)

在启用Squid之前,您需要对其配置文件进行一些更改,该文件存储在/etc/squid/squid.conf中。Rocky Linux 9附带的默认文本编辑器是vivi是一个非常强大的文本编辑器,但对于没有使用经验的用户来说可能有些晦涩。您可能希望安装一个更用户友好的编辑器,如nano,以便在Rocky Linux 9服务器上方便地编辑配置文件。

  1. sudo dnf install nano

 

打开Squid配置文件,使用nano或您喜欢的文本编辑器。

  1. sudo nano /etc/squid/squid.conf

 

首先找到包含短语http_access deny all的行。您应该会看到一段解释Squid默认访问规则的文本块。

/etc/squid/squid.conf 文件内容示例:

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

# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
http_access allow localnet
http_access allow localhost

# And finally deny all other access to this proxy
http_access deny all
. . .

从上述配置中,您可以看到当前的默认行为——只允许本地连接;其他连接均被拒绝。请注意,这些规则是按顺序解析的,因此最好将deny all规则放在配置块的底部。您可以将该规则更改为allow all,从而允许任何人连接到您的代理服务器,但这通常不是一个推荐的做法。相反,您可以在http_access allow localhost的上方添加一行,包含您自己的IP地址,如下所示:

/etc/squid/squid.conf 配置文件简化示例:

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
# Example rule allowing access from your local networks.
acl localnet src your_ip_address
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
  • acl 表示访问控制列表(Access Control List),这是权限策略的常用术语。
  • localnet 在此示例中是您的ACL名称。
  • src 是在此ACL下请求的来源,即您的IP地址。

如果您不知道本地IP地址,最快的方法是访问一个像“我的IP地址是什么”这样的网站,它可以告诉您您是从哪里访问的。更改完毕后,请保存并关闭文件。如果您正在使用nano编辑器,请按下Ctrl+X,然后在提示时按Y,最后按Enter

此时,您可以重新启动Squid并连接到它,但在此之前还有更多事情可以做以增强其安全性。

第二步 – 防护Squid

第二步:配置Squid以进行身份验证

大多数代理和连接到代理的客户端应用程序(例如Web浏览器)都支持多种身份验证方法。这些方法可以包括共享密钥,或者单独的身份验证服务器,但通常是常见的用户名密码对。Squid允许您使用内置的Linux功能创建用户名密码对,作为限制代理访问的附加或替代步骤之一。为此,您将创建一个名为/etc/squid/passwords的文件,并将Squid的配置指向该文件。

首先,您需要安装一些来自Apache项目的实用程序,以便使用Squid喜欢的密码生成器。

  1. sudo dnf install httpd-tools

这个软件包提供了htpasswd命令,您可以用它来为新的Squid用户生成密码。Squid的用户名与系统用户名不会有任何重叠,因此如果您愿意,可以使用您已登录的相同名称。您将被提示添加密码。

  1. sudo htpasswd -c /etc/squid/passwords 您的Squid用户名

这将会将您的用户名以及新密码的哈希值存储在/etc/squid/passwords文件中,并被Squid用作身份验证来源。您之后可以使用cat命令查看文件的内容,以了解它的样子。

  1. sudo cat /etc/squid/passwords
输出
sammy:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.

在确认您的用户名和密码已经储存后,您可以更新Squid的配置,使用您的新的/etc/squid/passwords文件。使用nano或者您喜欢的文本编辑器,重新打开Squid配置文件并添加以下突出显示的行:

  1. sudo nano /etc/squid/squid.conf

/etc/squid/squid.conf 文件内容如下:

…
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
include /etc/squid/conf.d/*
auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwords
auth_param basic realm proxy
acl authenticated proxy_auth REQUIRED
# Example rule allowing access from your local networks.
acl localnet src 您的IP地址
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost
http_access allow authenticated
# And finally deny all other access to this proxy
http_access deny all
…

这些额外的指示告诉Squid在您的新密码文件中检查可使用basic_ncsa_auth机制解析的密码哈希值,并要求对代理访问进行身份验证。您可以查阅Squid的文档以获取有关此或其他认证方法的更多信息。然后,您可以使用配置更改来启动Squid。这可能需要一些时间来完成。

  1. sudo systemctl start squid.service

您可以再次使用 systemctl status 命令来验证它是否已成功启动。

  1. sudo systemctl status squid.service
输出
● squid.service - Squid caching proxy
   Loaded: loaded (/usr/lib/systemd/system/squid.service; disabled; vendor preset: disa>
   Active: active (running) since Fri 2022-10-28 19:17:04 UTC; 21s ago
     Docs: man:squid(8)
  Process: 263480 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/>
 Main PID: 263485 (squid)
    Tasks: 3 (limit: 11152)
   Memory: 15.7M
   CGroup: /system.slice/squid.service
           ├─263485 /usr/sbin/squid --foreground -f /etc/squid/squid.conf
           ├─263489 (squid-1) --kid squid-1 --foreground -f /etc/squid/squid.conf
           └─263490 (logfile-daemon) /var/log/squid/access.log
Oct 28 19:17:03 rocky systemd[1]: Starting Squid caching proxy...
Oct 28 19:17:04 rocky squid[263485]: Squid Parent: will start 1 kids
Oct 28 19:17:04 rocky squid[263485]: Squid Parent: (squid-1) process 263489 star>
Oct 28 19:17:04 rocky systemd[1]: Started Squid caching proxy.

如果您正在使用 firewalld,请不要忘记通过您的防火墙允许Squid。可以通过添加端口3128的规则来实现。

  1. sudo firewall-cmd --permanent --add-port=3128/tcp
  2. firewall-cmd --reload

在接下来的步骤中,您最终将连接到代理服务器。

第三步:通过Squid进行连接

为了测试您的Squid服务器,您将使用一个名为curl的命令行工具。curl因其能够进行各种网络请求而广受欢迎。通常,如果您想验证某个特定连接在浏览器中是否能正常工作,建议首先使用curl进行测试。您将在本地计算机上使用curl来完成此操作——它在所有现代的Windows、Mac和Linux环境中都默认安装,因此您可以在任何本地终端中运行此命令。

  1. curl -v -x http://您的_squid_用户名:您的_squid_密码@您的_服务器_IP:3128 http://www.google.com/

-x参数用于将代理服务器传递给curl。在这种情况下,您使用http://协议,并为该服务器指定您的用户名和密码,然后连接到一个已知可正常访问的网站,例如google.com。如果命令成功,您应该会看到以下输出:

输出

* Trying 165.227.119.46:3128… * Connected to 165.227.119.46 (165.227.119.46) port 3128 (#0) * Proxy auth using Basic with user ‘squid’ > GET http://www.google.com/ HTTP/1.1

您也可以在不进行进一步配置更改的情况下,使用Squid代理访问https://网站。这些网站使用名为CONNECT的单独代理指令,以保持客户端和服务器之间的SSL连接。

  1. curl -v -x http://您的_squid_用户名:您的_squid_密码@您的_服务器_IP:3128 https://www.google.com/
输出

* Trying 165.227.119.46:3128… * Connected to 165.227.119.46 (165.227.119.46) port 3128 (#0) * allocate connect buffer * Establish HTTP proxy tunnel to www.google.com:443 * Proxy auth using Basic with user ‘squid’ > CONNECT www.google.com:443 HTTP/1.1 > Host: www.google.com:443 > Proxy-Authorization: Basic c3F1aWQ6c3F1aWQ= > User-Agent: curl/7.83.1 > Proxy-Connection: Keep-Alive > < HTTP/1.1 200 Connection established < * Proxy replied 200 to CONNECT request * CONNECT phase completed

您在curl中使用的凭据现在可以在您希望使用新代理服务器的任何地方使用。

结论

在本教程中,您学习了如何在Rocky Linux 9上部署一个流行的开源API端点,以几乎没有额外开销的方式代理流量。许多应用程序已经内置了代理支持(通常在操作系统级别)几十年了,这使得这个代理堆栈具有很高的可重用性。

由于代理服务器最常见的应用场景之一是代理来自不同全球区域的流量,因此当您希望在其他数据中心中复制此配置时,请考虑使用Ansible自动化服务器部署的方式进行审查。

bannerAds