代理服务器是一种服务器应用程序,充当最终用户和Internet资源之间的网关。通过代理服务器,最终用户能够出于各种目的控制和监视其Web流量,包括隐私、安全和缓存。例如,您可以使用代理服务器从与您自己的IP地址不同的IP地址发出Web请求。您还可以使用代理服务器来研究不同司法管辖区的网络服务方式,或避免某些监视或网络流量限制方法。
Squid 是一个稳定、流行、开源的HTTP代理。在本教程中,您将安装和配置Squid以在Ubuntu 20.04服务器上提供HTTP代理。
先决条件
要完成本指南,您将需要:
- Ubuntu 20.04服务器和具有sudo权限的非root用户。您可以在我们的Ubuntu 20.04初始服务器设置指南中了解有关如何设置具有这些权限的用户的更多信息。
在本教程中,您将使用域名your_domain,但应将其替换为您自己的域名或IP地址。
第1步 — 安装Squid代理
除了路由单个用户的出站流量之外,Squid还有许多用例。在大规模服务器部署的上下文中,它可以用作分布式缓存机制、负载平衡器或路由堆栈的其他组件。但是,一些水平扩展服务器流量的方法通常涉及代理服务器,但其受欢迎程度已被容器化框架(如Kubernetes)所超越,这些框架分发了应用程序的更多组件。同时,使用代理服务器以个人用户身份重定向Web请求对于保护您的隐私变得越来越流行。在使用开源代理服务器时,记住这一点很有帮助,这些服务器在低优先级维护模式下可能看起来有数十种功能。代理的用例随着时间的推移而变化,但基本技术没有变化。
首先,以非root用户身份运行以下命令,以更新软件包列表并安装Squid Proxy:
sudo apt update
sudo apt install squid
Squid会自动设置后台服务,并在安装后启动。您可以检查服务是否正常运行:
systemctl status squid.service
Output● squid.service - Squid Web Proxy Server
Loaded: loaded (/lib/systemd/system/squid.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-12-15 21:45:15 UTC; 2min 11s ago
默认情况下,Squid不允许任何客户端从此服务器外部连接到它。为了启用此功能,您需要对其配置文件进行一些更改,该文件存储在 .在您喜欢的文本编辑器中打开它:/etc/squid/squid.confnano
请注意,Squid的默认配置文件非常非常长,并且包含大量选项,这些选项通过在它们所在的行的开头放置a来暂时禁用,也称为被注释掉。您很可能希望搜索文件以查找要编辑的行。在 中,这是通过按 ,输入搜索词,按 ,然后根据需要反复按以查找该词的下一个实例来完成的。#nanoCtrl+WEnterAlt+W
首先导航到包含短语 的行。您应该会看到一个文本块,解释Squid的默认访问规则:http_access deny all
/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.
# 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
. . .
由此,您可以看到当前行为 – 是允许的;其他连接则不然。请注意,这些规则是按顺序解析的,因此最好将规则保留在此配置块的底部。您可以将该规则更改为 ,使任何人都可以连接到您的代理服务器,但您可能不想这样做。相反,您可以在上面添加一行,其中包含您自己的IP地址,如下所示:localhostdeny allallow allhttp_access allow localhost
/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是什么"之类的网站,它可以告诉您从哪里访问它。进行更改后,保存并关闭文件。如果您使用的是 ,请按 ,然后在出现提示时按 ,然后按 。nanoCtrl+XYEnter
此时,您可以重新启动Squid并连接到它,但为了首先保护它,您可以执行更多操作。
第2步 — 保护Squid
大多数代理和连接到代理的大多数客户端应用程序(例如Web浏览器)都支持多种身份验证方法。这些可以包括共享密钥或单独的身份验证服务器,但最常见的是常规的用户名-密码对。Squid允许您使用内置的Linux功能创建用户名-密码对,作为通过IP地址限制对代理访问的附加或替代步骤。为此,您将创建一个名为Squid的文件,并将Squid的配置指向该文件。/etc/squid/passwords
首先,您需要从Apache项目中安装一些实用程序,以便访问Squid喜欢的密码生成器。
sudo apt install apache2-utils
此软件包提供了命令,您可以使用该命令为新的Squid用户生成密码。Squid的用户名不会以任何方式与系统用户名重叠,因此您可以根据需要使用与登录时相同的名称。系统还会提示您添加密码:htpasswd
sudo htpasswd -c /etc/squid/passwords your_squid_username
这将存储您的用户名以及新密码的哈希值,这将被Squid用作身份验证源。之后,您可以查看该文件,看看它是什么样子的:/etc/squid/passwordscat
sudo cat /etc/squid/passwords
在验证您的用户名和密码已存储后,您可以更新Squid的配置以使用您的新文件。使用或您喜欢的文本编辑器,重新打开Squid配置文件并添加以下突出显示的行:/etc/squid/passwordsnano
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/lib/squid3/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在新文件中签入可以使用该机制解析的密码哈希,并要求身份验证才能访问您的代理。您可以查看 Squid的文档,了解有关此身份验证方法或其他身份验证方法的更多信息。之后,您终于可以使用配置更改重新启动Squid。这可能需要一些时间才能完成。passwordsbasic_ncsa_auth
sudo systemctl restart squid.service
如果您使用以下命令,请不要忘记在防火墙中打开端口3128:ufw
sudo ufw allow 3128
在下一步中,您将最终连接到您的代理。
第3步 — 通过Squid连接
为了演示您的Squid服务器,您将使用一个名为 的命令行程序,该程序在发出不同类型的Web请求时很受欢迎。通常,如果要验证给定连接在理想情况下是否应在浏览器中工作,则应始终首先使用 进行测试。为此,您将在本地计算机上使用curl – 默认情况下,它安装在所有现代Windows、Mac和Linux环境中,因此您可以打开任何本地shell来运行此命令:
curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 http://www.google.com/
该参数将代理服务器传递给curl,在本例中,您正在使用该协议,为该服务器指定您的用户名和密码,然后连接到已知有效的网站,例如 .如果命令成功,应看到以下输出:
Output* Trying 138.197.103.77...
* TCP_NODELAY set
* Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0)
* Proxy auth using Basic with user 'sammy'
> GET http://www.google.com/ HTTP/1.1
也可以使用Squid代理访问网站,而无需进行任何进一步的配置更改。它们使用一个单独的代理指令,以在客户端和服务器之间保留SSL:https://CONNECT
curl -v -x http://your_squid_username:your_squid_password@your_server_ip:3128 https://www.google.com/
Output* Trying 138.197.103.77...
* TCP_NODELAY set
* Connected to 138.197.103.77 (138.197.103.77) port 3128 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to www.google.com:443
* Proxy auth using Basic with user 'sammy'
> CONNECT www.google.com:443 HTTP/1.1
> Host: www.google.com:443
> Proxy-Authorization: Basic c2FtbXk6c2FtbXk=
> User-Agent: curl/7.55.1
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
* Proxy replied OK to CONNECT request
* CONNECT phase completed!