如何在Rocky Linux 8上设置Squid代理以实现私密连接
介绍
代理服务器是一种有用的缓存或混淆网站流量的方式。这意味着可以通过将连接卸载到中间人的方式,从不同的入站或出站地址提供网页请求,使其看起来与实际不同。对于普通用户来说,这通常意味着允许您使用不同于您自己的IP地址进行网页请求。这可以有很多用途,比如研究网络在不同法域中的服务方式的差异,或避免一些监控或网络流量限制的方法。
有很多第三方代理服务提供商,但它们可能不可靠,尤其是如果您使用代理的主要目的是将流量引导到您的互联网服务提供商之外时,商业代理提供商在实践中可能会更不安全或遵守法律约束较少。
本教程将指导您安装和配置Squid,以在Rocky Linux 8上提供稳定、流行的开源HTTP代理。
先决条件
完成这份指南,您需要:
- A Rocky Linux 8 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 8 guide.
在这个教程中,你将使用域名your_domain,但你应该用你自己的域名或IP地址来替代它。
第一步 — 安装Squid代理
Squid在路由个别用户的出站流量外还有许多用途。在大规模服务器部署的背景下,它可以用作分布式缓存机制、负载均衡器或路由堆栈的另一个组件。然而,一些通过代理服务器横向扩展服务器流量的方法在流行度上已被容器化框架(如Kubernetes)超越,后者可以分发应用程序的更多组件。同时,使用代理服务器来重定向网页请求以保护个人隐私已经日益流行。在使用开源代理服务器时,这一点需要注意,它们可能在低优先级维护模式下拥有许多功能。代理的用途随着时间的推移而改变,但基本技术并没有改变。
在Rocky Linux的默认软件包源中,没有可用的Squid软件包。相反,您可以通过EPEL存储库安装Squid。EPEL是基于RHEL的发行版中最受欢迎的附加软件包存储库,包含一些官方源不提供的受信任的第三方软件包。
使用 dnf 安装 epel-release 以添加 Rocky Linux EPEL 软件源。
- 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 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,其他连接不允许。请注意,这些规则是按顺序解析的,所以建议将拒绝所有规则放在配置块的底部。你可以更改那条规则以允许所有,从而使任何人都能连接到你的代理服务器,但你可能不想这样做。相反,你可以在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 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功能创建用户名和密码对,作为附加或替代步骤来限制通过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
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环境中,因此您可以打开任何本地命令行来运行此命令。
- 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来自动化服务器部署,以便在其他数据中心中复制这个配置时能够做到。