如何在 Rocky Linux 8 上为专用连接设置 Squid 代理
介绍
代理服务器是一种缓存或混淆网络流量的有用方法。这意味着通过将连接卸载到中介,Web 请求可以从与看起来不同的入站或出站地址得到服务。对于普通最终用户,这通常意味着允许您从不同于您自己的 IP 地址发出 Web 请求。这可以用于多种目的,例如研究网络在不同司法管辖区之间的服务方式有何不同,或者避免某些监视或网络流量限制的方法。
有许多第三方代理服务提供商,但它们可能不可靠——尤其是如果您使用代理的主要目标是将流量从您的 Internet 服务提供商路由出去,那么在某些情况下,商业代理提供商实际上不太安全或在实践中较少受法律约束。
Squid 是一种稳定、流行、开源的 HTTP 代理。在本教程中,您将安装和配置 Squid 以在 Rocky Linux 8 上提供 HTTP 代理。
先决条件
要完成本指南,您需要:
- 一台 Rocky Linux 8 服务器和一个具有 sudo 权限的非根用户。您可以在我们的使用 Rocky Linux 8 进行初始服务器设置指南中详细了解如何为用户设置这些权限。
您将在本教程中使用域名 your_domain,但您应该将其替换为您自己的域名或 IP 地址。
第 1 步 — 安装 Squid 代理
除了路由单个用户的出站流量之外,Squid 还有许多用例。在大规模服务器部署的上下文中,它可以用作分布式缓存机制、负载平衡器或路由堆栈的另一个组件。然而,一些通常涉及代理服务器的水平扩展服务器流量的方法已经被 Kubernetes 等容器化框架所超越,后者分发应用程序的更多组件。同时,使用代理服务器将 Web 请求重定向为个人用户已变得越来越流行,以保护您的隐私。在使用开源代理服务器时,记住这一点很有帮助,因为在较低优先级的维护模式下,这些代理服务器可能看起来具有许多功能。代理的用例随着时间的推移发生了变化,但基本技术没有变化。
squid
包在 Rocky Linux 的默认包源中不可用。相反,您可以通过 EPEL 存储库安装 Squid。 EPEL 是基于 RHEL 的发行版(如 Rocky Linux)上最受欢迎的附加软件包存储库,并且包含许多官方来源未提供的受信任的第三方软件包。
要添加 Rocky Linux EPEL 存储库,请使用 dnf install epel-release
- sudo dnf install epel-release
接下来,您可以继续使用 dnf
安装 Squid:
- sudo dnf install squid
在 Rocky Linux 上,安装后 Squid 不会自动启动。您可以使用 systemctl status
检查服务是否已创建但处于非活动状态:
- systemctl status squid.service
Output● 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 8 自带的默认文本编辑器是 vi
。 vi
是一个非常强大的文本编辑器,但对于缺乏使用经验的用户来说可能有点迟钝。你可能想要安装一个更用户友好的编辑器,例如 nano
以方便在你的 Rocky Linux 8 服务器上编辑配置文件:
- sudo dnf install nano
在 nano
或您喜欢的文本编辑器中打开 Squid 配置文件:
- sudo nano /etc/squid/squid.conf
首先导航到包含短语 http_access deny all
的行。您应该看到一段解释 Squid 的默认访问规则的文本:
. . .
#
# 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
. . .
从这里,您可以看到当前的行为——localhost
是允许的;其他连接不是。请注意,这些规则是按顺序解析的,因此最好将 deny all
规则保留在此配置块的底部。您可以将该规则更改为 allow all
,使任何人都可以连接到您的代理服务器,但您可能不想这样做。相反,您可以在 http_access allow localhost
上方添加一行,其中包含您自己的 IP 地址,如下所示:
#
# 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 表示访问控制列表,权限策略的常用术语
- 本例中的 localnet 是您的 ACL 的名称。
- src 是此 ACL 下请求的来源,即您的 IP 地址。
如果你不知道你的本地 IP 地址,最快的方法是访问 What's my IP 这样的网站,它可以告诉你你是从哪里访问它的。进行更改后,保存并关闭文件。如果您使用的是 nano
,请按 Ctrl+X
,然后在出现提示时按 Y
,然后按 Enter
。
此时,您可以重新启动 Squid 并连接到它,但是您可以做更多的事情来首先保护它。
第 2 步 — 保护鱿鱼
大多数代理和大多数连接到代理的客户端应用程序(例如网络浏览器)都支持多种身份验证方法。这些可以包括共享密钥或单独的身份验证服务器,但最常见的是需要常规的用户名-密码对。 Squid 允许您使用内置的 Linux 功能创建用户名-密码对,作为通过 IP 地址限制对代理的访问的附加或替代步骤。为此,您将创建一个名为 /etc/squid/passwords
的文件并将 Squid 的配置指向它。
首先,您需要从 Apache 项目安装一些实用程序,以便访问 Squid 喜欢的密码生成器。
- sudo dnf install httpd-tools
这个包提供了htpasswd
命令,您可以使用它来为新的 Squid 用户生成密码。 Squid 的用户名不会以任何方式与系统用户名重叠,因此您可以根据需要使用与登录时相同的名称。系统还会提示您添加密码:
- sudo htpasswd -c /etc/squid/passwords your_squid_username
这会将您的用户名和新密码的散列存储在 /etc/squid/passwords
中,它将被 Squid 用作身份验证源。之后您可以 cat
文件以查看其外观:
- sudo cat /etc/squid/passwords
Outputsammy:$apr1$Dgl.Mtnd$vdqLYjBGdtoWA47w4q1Td.
验证您的用户名和密码已存储后,您可以更新 squid 的配置以使用新的 /etc/squid/passwords
文件。使用 nano
或您最喜欢的文本编辑器,重新打开 Squid 配置文件并添加以下突出显示的行:
- sudo nano /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 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
http_access allow authenticated
# And finally deny all other access to this proxy
http_access deny all
…
这些额外的指令告诉 squid 检查您的新 passwords
文件以获取可以使用 basic_ncsa_auth
机制解析的密码散列,并要求对您的代理的访问进行身份验证。您可以查看 Squid 的文档以获取有关此或其他身份验证方法的更多信息。之后,您终于可以使用您的配置更改来启动 squid。这可能需要一些时间才能完成。
- sudo systemctl start squid.service
您可以再次使用 systemctl status
来验证它是否正常启动:
- sudo systemctl status squid.service
Output● 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
,请不要忘记通过为端口 3128 添加规则来允许 Squid 通过您的防火墙:
- sudo firewall-cmd --permanent --add-port=3128/tcp
- firewall-cmd --reload
在下一步中,您将最终连接到您的代理。
第 3 步 — 通过 Squid 连接
为了演示您的 Squid 服务器,您将使用一个名为 curl
的命令行程序,该程序常用于发出不同类型的 Web 请求。一般来说,如果您想验证给定连接是否应该在理想情况下在浏览器中正常工作,您应该始终首先使用 curl
进行测试。您将在本地计算机上使用 curl 来执行此操作——它默认安装在所有现代 Windows、Mac 和 Linux 环境中,因此您可以打开任何本地 shell 来运行此命令:
- curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 http://www.google.com/
-x
参数将代理服务器传递给 curl,在这种情况下,您这次使用的是 http://
协议,指定您到该服务器的用户名和密码,然后连接到已知可用的网站,例如 google.com
。如果命令成功,您应该会看到以下输出:
Output* 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:
- curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 https://www.google.com/
Output* 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
的凭据现在应该可以在您可能想要使用新代理服务器的任何其他地方使用。
结论
在本教程中,您学习了如何部署一个流行的开源 API 端点来代理流量,几乎没有开销。许多应用程序都有内置的代理支持(通常在操作系统级别)可以追溯到几十年前,使这个代理堆栈高度可重用。
由于代理服务器最常见的用例之一是代理进出不同全球区域的流量,接下来您可能需要查看如何使用 Ansible 来自动化服务器部署,以防您发现自己想要在其他数据中心复制此配置.