如何在Ubuntu20.04上为专用连接设置Dante代理
介绍
代理服务器是一种服务器应用程序,用作最终用户和 Internet 资源之间的网关。 通过代理服务器,最终用户能够控制和监控他们的网络流量,用于各种目的,包括隐私、安全和缓存。 例如,您可以使用代理服务器从与您自己的 IP 地址不同的 IP 地址发出 Web 请求。 您还可以使用代理服务器来研究从一个司法管辖区到下一个司法管辖区的网络服务方式有何不同,或者避免某些监视方法或网络流量限制。
Dante 是一个稳定、流行、开源的 SOCKS 代理。 在本教程中,您将安装和配置 Dante 以在 Ubuntu 20.04 服务器上提供 SOCKS 代理。
先决条件
要完成本指南,您需要:
- 一个 Ubuntu 20.04 服务器和一个具有 sudo 权限的非 root 用户。 您可以在我们的 Initial Server Setup with Ubuntu 20.04 指南中了解有关如何设置具有这些权限的用户的更多信息。
您将在本教程中使用域名 your_domain,但您应该将其替换为您自己的域名或 IP 地址。
第 1 步 — 安装 Dante
Dante 是一个开源的 SOCKS 代理服务器。 SOCKS 是一种不太广泛使用的协议,但它对于某些点对点应用程序更有效,并且对于某些类型的流量比 HTTP 更受欢迎。 首先以非 root 用户身份运行以下命令来更新您的软件包列表并安装 Dante:
sudo apt update sudo apt install dante-server
Dante 还会在安装后自动设置后台服务并启动。 但是,它被设计为在第一次运行时优雅地退出并显示错误消息,因为它附带禁用了所有功能。 您可以使用 systemctl
命令验证这一点:
systemctl status danted.service
Output● danted.service - SOCKS (v4 and v5) proxy daemon (danted) Loaded: loaded (/lib/systemd/system/danted.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2021-12-15 21:48:22 UTC; 1min 45s ago Docs: man:danted(8) man:danted.conf(5) Main PID: 14496 (code=exited, status=1/FAILURE) Dec 15 21:48:21 proxies systemd[1]: Starting SOCKS (v4 and v5) proxy daemon (danted)... Dec 15 21:48:22 proxies systemd[1]: Started SOCKS (v4 and v5) proxy daemon (danted). Dec 15 21:48:22 proxies danted[14496]: Dec 15 21:48:22 (1639604902.102601) danted[14496]: warning: checkconfig(): no socks authentication methods enabled. This means all socks requests will be blocked after negotiation. Perhaps this is not intended?
要成功启动 Dante 的服务,您需要在配置文件中启用它们。
Dante 的配置文件默认在 /etc/danted.conf
中提供。 如果您使用 nano
或您喜欢的文本编辑器打开此文件,您将看到一长串配置选项,所有这些选项都已禁用。 您可以尝试浏览此文件并逐行启用一些选项,但实际上删除此文件并从头开始替换它会更有效且更具可读性。 不要担心这样做。 您始终可以通过导航到 Dante 的 在线手册 来查看 Dante 的默认配置,您甚至可以从 Ubuntu 的 软件包列表 手动重新下载该软件包,以重新获取库存配置文件(如果需要)。 与此同时,继续删除它:
sudo rm /etc/danted.conf
现在你可以用更简洁的东西替换它。 如果文件不存在,使用文本编辑器打开文件会自动创建文件,因此通过使用 nano
或您喜欢的文本编辑器,您现在应该得到一个空的配置文件:
sudo nano /etc/danted.conf
添加以下内容:
/etc/danted.conf
logoutput: syslog user.privileged: root user.unprivileged: nobody # The listening network interface or address. internal: 0.0.0.0 port=1080 # The proxying network interface or address. external: eth0 # socks-rules determine what is proxied through the external interface. socksmethod: username # client-rules determine who can connect to the internal interface. clientmethod: none client pass { from: 0.0.0.0/0 to: 0.0.0.0/0 } socks pass { from: 0.0.0.0/0 to: 0.0.0.0/0 }
您现在有一个可用的 SOCKS 服务器配置,在端口 1080 上运行,这是 SOCKS 的常用约定。 您还可以逐行分解此配置文件的其余部分:
logoutput
指的是 Dante 将如何记录连接,在这种情况下使用常规系统记录user.privileged
允许 dante 拥有root
权限用于检查权限user.unprivileged
不授予服务器任何作为非特权用户运行的权限,因为在不授予更精细的权限时这是不必要的internal
连接详细信息指定运行服务的端口以及可以连接的 IP 地址external
连接详细信息指定用于出站连接的网络接口,在大多数服务器上默认为eth0
其余的配置细节处理身份验证方法,这将在下一节中讨论。 如果您使用 ufw
,请不要忘记在防火墙中打开端口 1080:
sudo ufw allow 1080
此时,您可以重新启动 Dante 并连接到它,但您将拥有一个对整个世界开放的 SOCKS 服务器,您可能不想要它,因此您将首先学习如何保护它。
第 2 步 — 保护 Dante
如果到目前为止您已按照本教程进行操作,Dante 将使用常规 Linux 用户帐户进行身份验证。 这很有帮助,但用于该连接的密码将通过纯文本发送,因此创建一个没有任何其他登录权限的专用 SOCKS 用户很重要。 为此,您将使用 useradd
和不会为用户分配登录 shell 的标志,然后设置密码:
sudo useradd -r -s /bin/false your_dante_user sudo passwd your_dante_user
您还需要避免通过不安全的无线连接登录此帐户或过于广泛地共享服务器。 否则,恶意行为者可以并且将反复努力登录。
Dante 支持其他身份验证方法,但许多将连接到 SOCKS 代理的客户端(即应用程序)仅支持基本的用户名和密码身份验证,因此您可能希望保留该部分原样。 作为替代方案,您可以限制对特定 IP 地址的访问。 这不是最复杂的选择,但考虑到这里使用的技术组合,这是一个明智的选择。 您可能已经从我们的必备教程中学习了如何使用 ufw
限制对特定 IP 地址的访问,但您也可以直接在 Dante 中执行此操作。 编辑您的 /etc/danted.conf
:
sudo nano /etc/danted.conf
/etc/danted.conf
… client pass { from: your_ip_address/0 to: 0.0.0.0/0 }
为了支持多个 IP 地址,您可以使用 CIDR 表示法,或者只是添加另一个 client pass {}
配置块:
/etc/danted.conf
client pass { from: your_ip_address/0 to: 0.0.0.0/0 } client pass { from: another_ip_address/0 to: 0.0.0.0/0 }
之后,您终于可以使用您的配置更改重新启动 Dante。
sudo systemctl restart danted.service
这一次,当您检查服务状态时,您应该会看到它正在运行且没有任何错误:
systemctl status danted.service
Output● danted.service - SOCKS (v4 and v5) proxy daemon (danted) Loaded: loaded (/lib/systemd/system/danted.service; enabled; vendor preset: enable> Active: active (running) since Thu 2021-12-16 18:06:26 UTC; 24h ago
在下一步中,您最终将连接到您的代理。
第 3 步 — 通过 Dante 连接
为了演示您的 Dante 服务器,您将使用一个名为 curl
的命令行程序,该程序在发出不同类型的 Web 请求时很流行。 一般来说,如果你想验证一个给定的连接是否应该在理想情况下在浏览器中工作,你应该总是先用 curl
进行测试。 您将在 local 机器上使用 curl 来执行此操作 - 它默认安装在所有现代 Windows、Mac 和 Linux 环境中,因此您可以打开任何本地 shell 来运行此命令:
curl -v -x socks5://your_dante_user:your_dante_password@your_server_ip:1080 http://www.google.com/
Output* Trying 138.197.103.77... * TCP_NODELAY set * SOCKS5 communication to www.google.com:80 * SOCKS5 connect to IPv4 142.250.189.228 (locally resolved) * SOCKS5 request granted. * Connected to 138.197.103.77 (138.197.103.77) port 1080 (#0) > GET / HTTP/1.1 …
您用于 curl
的凭据现在应该可以在您可能想要使用新代理服务器的其他任何地方使用。
结论
在本教程中,您学会了部署一个流行的开源 API 端点来代理流量,而开销很小甚至没有。 许多应用程序都有内置的代理支持(通常在操作系统级别)可以追溯到几十年前,这使得这个代理堆栈具有高度可重用性。
接下来,您可能想了解如何部署 Squid,这是一个 HTTP 代理,可以与 Dante 一起运行以代理不同类型的 Web 流量。
由于代理服务器最常见的用例之一是代理进出不同全球区域的流量,您可能需要查看如何使用 Ansible 来自动化服务器部署,以防您发现自己想要复制这种配置在其他数据中心。