如何在Ubuntu20.04上为私有连接设置Squid代理

来自菜鸟教程
跳转至:导航、​搜索

介绍

代理服务器是一种服务器应用程序,用作最终用户和 Internet 资源之间的网关。 通过代理服务器,最终用户能够控制和监控他们的网络流量,用于各种目的,包括隐私、安全和缓存。 例如,您可以使用代理服务器从与您自己的 IP 地址不同的 IP 地址发出 Web 请求。 您还可以使用代理服务器来研究从一个司法管辖区到下一个司法管辖区的网络服务方式有何不同,或者避免某些监视方法或网络流量限制。

Squid 是一个稳定的、流行的、开源的 HTTP 代理。 在本教程中,您将安装和配置 Squid 以在 Ubuntu 20.04 服务器上提供 HTTP 代理。

先决条件

要完成本指南,您需要:

  • 一个 Ubuntu 20.04 服务器和一个具有 sudo 权限的非 root 用户。 您可以在我们的 Initial Server Setup with Ubuntu 20.04 指南中了解有关如何设置具有这些权限的用户的更多信息。

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

第 1 步 — 安装 Squid 代理

除了路由单个用户的出站流量之外,Squid 还有许多用例。 在大规模服务器部署的上下文中,它可以用作分布式缓存机制、负载均衡器或路由堆栈的其他组件。 然而,一些水平扩展服务器流量的方法通常需要代理服务器,但其流行程度已被 Kubernetes 等容器化框架所超越,后者分发了应用程序的更多组件。 同时,使用代理服务器以个人用户身份重定向 Web 请求已变得越来越流行,以保护您的隐私。 在使用开源代理服务器时记住这一点很有帮助,这些代理服务器在较低优先级的维护模式下可能看起来有许多功能。 代理的用例随着时间的推移发生了变化,但基础技术却没有。

首先以非 root 用户身份运行以下命令来更新您的软件包列表并安装 Squid 代理:

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.conf 中的配置文件进行一些更改。 在 nano 或您喜欢的文本编辑器中打开它:

sudo nano /etc/squid/squid.conf

请注意,Squid 的默认配置文件非常非常长,并且包含大量选项,这些选项已通过在它们所在行的开头放置 # 被暂时禁用,也称为 [X226X ]注释掉。 您很可能希望在文件中搜索以找到要编辑的行。 在 nano 中,按 Ctrl+W,输入您的搜索词,按 Enter,然后反复按 Alt+W 来查找下一个实例如果需要的话。

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

/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
. . . 

从这里,你可以看到当前的行为——localhost是允许的; 其他连接没有。 请注意,这些规则是按顺序解析的,因此最好将 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 表示 A 访问 C 控制 List,权限策略的常用术语
  • localnet 在这种情况下是您的 ACL 的名称。
  • src 是此 ACL 下请求的来源,即您的 IP 地址。

如果您不知道您的本地 IP 地址,最快的方法是访问 What's my IP 之类的网站,它可以告诉您从哪里访问它。 进行更改后,保存并关闭文件。 如果您正在使用 nano,请按 Ctrl+X,然后在出现提示时按 Y,然后按 Enter

此时,您可以重新启动 Squid 并连接到它,但为了首先保护它,您还可以做更多的事情。

第 2 步 — 保护 Squid

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

首先,您需要安装 Apache 项目中的一些实用程序才能访问 Squid 喜欢的密码生成器。

sudo apt install apache2-utils

这个包提供了 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

/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 检查新的 passwords 文件中可以使用 basic_ncsa_auth 机制解析的密码散列,并要求对访问代理进行身份验证。 您可以查看 Squid 的文档 以获取有关此或其他身份验证方法的更多信息。 之后,您终于可以使用您的配置更改重新启动 Squid。 这可能需要一点时间才能完成。

sudo systemctl restart squid.service

如果您使用 ufw,请不要忘记在防火墙中打开端口 3128:

sudo ufw allow 3128

在下一步中,您最终将连接到您的代理。

第 3 步 — 通过 Squid 连接

为了演示您的 Squid 服务器,您将使用一个名为 curl 的命令行程序,该程序在发出不同类型的 Web 请求时很流行。 一般来说,如果你想验证一个给定的连接是否应该在理想情况下在浏览器中工作,你应该总是先用 curl 进行测试。 您将在 local 机器上使用 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 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 代理访问 https:// 网站,而无需进行任何进一步的配置更改。 这些使用了一个名为 CONNECT 的单独代理指令,以便在客户端和服务器之间保留 SSL:

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!

您用于 curl 的凭据现在应该可以在您可能想要使用新代理服务器的其他任何地方使用。

结论

在本教程中,您学会了部署一个流行的开源 API 端点来代理流量,而开销很小甚至没有。 许多应用程序都有内置的代理支持(通常在操作系统级别)可以追溯到几十年前,这使得这个代理堆栈具有高度可重用性。

接下来,您可能想了解如何部署 Dante,这是一个 SOCKS 代理,可以与 Squid 一起运行以代理不同类型的 Web 流量。

由于代理服务器最常见的用例之一是代理进出不同全球区域的流量,您可能需要查看如何使用 Ansible 来自动化服务器部署,以防您发现自己想要复制这种配置在其他数据中心。