如何在Rocky Linux 9上设置私密连接的Squid代理
引言
代理服务器是一种有用的方式,用于缓存或混淆网络流量。这意味着网页请求可以从不同的入站或出站地址提供服务,通过将连接卸载到中间人。对于普通用户来说,这通常意味着允许您使用不同的IP地址发送网页请求。这可以有很多用途,例如研究不同司法管辖区的网页服务方式,或避免某些监控或网络流量限制方法。
有许多第三方代理服务提供商,但是它们可能不可靠 – 尤其是如果您使用代理的主要目标是将流量从您的互联网服务提供商中路由出去,可能存在实际上商业代理提供商更不安全或在法律上拘束较少的情况。
Squid是一个稳定、流行的开源HTTP代理。在本教程中,您将安装并配置Squid,为Rocky Linux 9提供一个HTTP代理。
先决条件
为了完成这份指南,你将需要:
- A Rocky Linux 9 server and a non-root user with sudo privileges. You can learn more about how to set up a user with these privileges in our Initial Server Setup with Rocky Linux 9 guide.
在本教程中,你将使用域名your_domain,但你应该使用你自己的域名或IP地址来替代它。
第一步 – 安装Squid代理
墨鱼在个体用户的出站流量路由之外有许多用途。在大规模服务器部署的背景下,它可以作为分布式缓存机制、负载均衡器或路由堆栈的另一个组成部分。然而,一些通常涉及代理服务器的水平扩展服务器流量的方法已经被容器化框架(如Kubernetes)所超越,这些框架可以分发应用程序的更多组件。同时,使用代理服务器重定向网页请求以保护个人隐私的做法越来越普遍。在使用开源代理服务器时要注意,它们可能在较低优先级维护模式下拥有很多功能。代理服务器的用途随着时间的推移而改变,但其基本技术并未改变。
在Rocky Linux的默认软件包源中,无法获取到Squid软件包。相反,您可以通过EPEL软件仓库安装Squid。EPEL是基于RHEL发行版的最流行的附加软件包仓库,其中包含一些官方软件源未提供的可信的第三方软件包。
要添加Rocky Linux的EPEL软件仓库,请使用dnf软件包管理器运行dnf install epel-release。
- sudo dnf install epel-release
接下来,您可以通过dnf安装Squid。
- sudo dnf install squid
在Rocky Linux上,Squid安装后不会自动启动。通过使用systemctl status命令,您可以检查到一个服务已创建但处于非活动状态。
- 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附带的默认文本编辑器是vi。vi是一个非常强大的文本编辑器,但对于没有使用经验的用户来说可能有些晦涩。您可能希望安装一个更用户友好的编辑器,如nano,以便在Rocky Linux 9服务器上方便地编辑配置文件。
- sudo dnf install nano
打开Squid配置文件,使用nano或你喜欢的文本编辑器。
- 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
. . .
从中,你可以看到当前的行为 – 只允许本地连接;其他连接不允许。注意,这些规则是按顺序解析的,所以最好将拒绝所有规则放在配置块的底部。你可以将该规则改为允许所有,让任何人都能连接到你的代理服务器,但你可能不想这样做。相反,你可以在http_access allow localhost的上方添加一行,包括你自己的IP地址,像这样:
/etc/squid/squid配置文件。
#
# 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 means an Access Control List, a common term for permissions policies
- localnet in this case is the name of your ACL.
- src is where the request would originate from under this ACL, i.e., your IP address.
如果您不知道本地IP地址,最快的方法是访问一个像“我的IP地址是什么”这样的网站,它可以告诉您您是从哪里访问的。更改完毕后,请保存并关闭文件。如果您正在使用nano编辑器,请按下Ctrl+X,然后在提示时按Y,最后按Enter。
在这一点上,你可以重新启动Squid并连接到它,但在此之前还有更多事情可以做以增强其安全性。
第二步 – 防护Squid
大多数代理和连接到代理的客户端应用程序(例如Web浏览器)都支持多种身份验证方法。这些方法可以包括共享密钥,或者单独的身份验证服务器,但通常是常见的用户名密码对。Squid允许您使用内置的Linux功能创建用户名密码对,作为限制代理访问的附加或替代步骤之一。为此,您将创建一个名为/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
sammy:$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在你的新密码文件中检查可使用basic_ncsa_auth机制解析的密码哈希值,并要求对代理访问进行身份验证。您可以查阅Squid的文档以获取有关此或其他认证方法的更多信息。然后,您可以使用配置更改来启动Squid。这可能需要一些时间来完成。
- sudo systemctl start squid.service
你可以再次使用 systemctl status 命令来验证它是否已成功启动。
- 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的规则来实现。
- sudo firewall-cmd –permanent –add-port=3128/tcp
- firewall-cmd –reload
在接下来的步骤中,你最终将连接到代理服务器。
第三步:通过Squid进行连接
为了展示您的Squid服务器,您将使用一个称为curl的命令行程序,该程序用于进行不同类型的网络请求,非常受欢迎。一般来说,如果您想要验证一个特定连接在理想情况下是否应该在浏览器中正常工作,您应该首先使用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。如果命令成功,你应该会看到以下输出:
* 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/
* 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自動化伺服器部署的方式來進行審查。