如何使用SOCKS隧道在没有VPN的情况下安全地路由Web流量
作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。
介绍
在某些时候,您可能会发现自己处于一个不安全的网络或防火墙限制过于严格的网络上,并且您需要确保没有人在监视您的流量。 一个解决方案是使用VPN,但是很多VPN需要在你的机器上安装特殊的客户端软件,你可能没有权限安装。 但是,如果您只需要保护您的网页浏览,那么有一个快速、免费且有用的替代方案:SOCKS 5 代理隧道。
SOCKS 代理是一个 SSH 加密隧道,配置的应用程序在其中向下转发其流量,然后在服务器端,代理将流量转发到一般 Internet。 与 VPN 不同,SOCKS 代理必须在客户端计算机上逐个应用程序配置,但只要应用程序能够使用 SOCKS 代理,您就可以在没有任何特殊客户端软件的情况下设置应用程序。 在服务器端,您只需要配置 SSH。
在本教程中,您将使用运行 Ubuntu 20.04 的服务器(尽管您可以通过 SSH 访问的任何 Linux 发行版都可以使用),并将 Firefox Web 浏览器作为客户端应用程序。 在本教程结束时,您将能够通过加密的 SSH 隧道安全地浏览网站。
先决条件
- 运行 Ubuntu 20.04(其他发行版也可以)的 Linux 服务器,具有
sudo
用户和 SSH 访问权限。 要进行此设置, 您可以按照我们的 Ubuntu 20.04 初始服务器设置教程进行操作。 去这里在 DigitalOcean Droplet 上建立你的隧道。 - 使用 SOCKS 代理配置的应用程序,例如 Firefox 网络浏览器 。
- 对于 Windows 用户,您还需要 PuTTY 工具或适用于 Linux 的 Windows 子系统 (WSL)
PuTTY 用于为 Windows 用户设置代理隧道。 macOS 或 Linux 的用户预装了设置隧道的工具。
第 1 步 (macOS/Linux) — 设置隧道
在您的本地计算机上,创建一个 SSH 密钥 如果您没有创建您的 Droplet,并且已经有一个。 创建密钥后,确保将公共端添加到 SSH Droplet 上的“authorized_keys”文件中。 然后打开一个终端应用程序来创建一个启用了 SOCKS 代理的 SSH 隧道。
使用以下命令设置隧道:
ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
论据的解释
-i
:用于连接主机的 SSH 密钥的路径-D
:告诉 SSH 我们想要在指定端口号上的 SOCKS 隧道(您可以在1025
和65536
之间选择一个数字)-f
:将进程分叉到后台-C
:发送前压缩数据-q
:使用安静模式-N
:告诉 SSH 一旦隧道启动就不会发送任何命令
请务必将 sammy@your_domain
替换为您的 sudo
用户和服务器 IP 地址/域名。
输入命令后,您将立即再次进入命令提示符,没有成功或失败的迹象; 这很正常。
使用以下命令验证隧道是否正在运行:
ps aux | grep ssh
您将在输出中看到如下所示的一行:
Outputsammy 14345 0.0 0.0 2462228 452 ?? Ss 6:43AM 0:00.00 ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
您可以退出您的终端应用程序,隧道将保持畅通。 那是因为我们使用了 -f
参数,它将 SSH 会话置于后台:
注意: 要终止隧道,您必须通过 ps
获取 PID。 在我们的示例中,PID 为 14345
。 然后我们将使用命令 kill 14345
。 我们将在第 3 步中介绍终止。
步骤 1 (Windows) — 设置隧道
打开 PuTTY。
如果您尚未安装它,请下载 PuTTY 并将其保存在您喜欢的位置。 PuTTY 不需要管理员权限即可安装; 只需下载 .exe
并运行它。
完成以下步骤来设置隧道:
- 在会话部分,添加服务器的主机名(或 IP 地址)和 SSH 端口(通常为 22)
- 在左侧,导航到:连接 > SSH > 隧道
- 输入
1025
和65536
之间的任意 Source 端口号,例如1337
- 选择动态单选按钮
- 单击添加按钮
- 返回左侧的 Session
- 在 Saved Sessions 下添加一个名称,然后单击 Save 按钮
- 现在单击“打开”按钮进行连接
- 输入您的
sudo
用户名和服务器密码登录
您现在可以最小化 PuTTY 窗口,但不要关闭它。 您的 SSH 连接应该是打开的:
注意:您可以按照PuTTY SSH密钥说明保存您的sudo
用户名(sammy)和SSH密钥用于同一会话。 这样您就不必每次打开连接时都输入您的用户名和密码。
第 2 步 — 将 Firefox 配置为使用隧道
现在您已经有了 SSH 隧道,是时候配置 Firefox 以使用该隧道了。 请记住,要使 SOCKS 5 隧道工作,您必须使用可以实现隧道的本地应用程序; Firefox 具有此功能:
对于 Windows、macOS 和 Linux,此步骤相同。
确保您拥有在 SSH 命令中使用的端口号; 在我们的示例中,我们使用了 1337
。
(以下步骤在 Firefox 版本 80 上执行,但应该适用于其他版本,尽管选项的位置可能不同。)
打开火狐。
- 在右上角,单击汉堡图标以访问 Firefox 的菜单。
- 单击首选项或选项菜单项。
- 滚动到底部并在网络设置下选择设置...按钮。
- 在“配置对 Internet 的代理访问”标题下,选择手动代理配置。
- 对于 SOCKS 主机,输入
localhost
或127.0.0.1
,对于端口,使用隧道中指定的自定义端口1337
。 - 在底部附近,选中“使用 SOCKS v5 时代理 DNS”框
- 单击确定按钮保存并关闭您的配置
现在,在 Firefox 中打开另一个选项卡并开始浏览网页。 您应该准备好通过 SSH 隧道进行安全浏览。 您从网站取回的数据已加密。 此外,由于您选中了代理 DNS 选项,因此您的 DNS 查找也被加密,因此您的 ISP 看不到您看到的内容或您去哪里获取它。
要验证您是否正在使用代理,请返回 Firefox 中的网络设置并输入不同的端口号并保存设置。 现在,如果您尝试浏览网页,您应该会收到一条错误消息:“代理服务器拒绝连接”。 这证明 Firefox 正在使用代理,而不仅仅是默认连接。 或者,您可以访问公共 IP 站点,例如 ipecho.net,它返回的 IP 应该是您的 SSH Droplet 的 IP,因为它现在充当您的代理。
第 3 步 — 在 Firefox 中恢复代理
当您需要 SSH 隧道的隐私时,请返回 Firefox 中的网络代理设置。 单击“使用系统代理设置”的单选按钮,然后单击确定。 现在 Firefox 不再使用 SOCKS 隧道,我们也可以关闭它。 您可以让隧道保持畅通,以便在 Firefox 中随意启用和禁用代理,但如果让隧道闲置时间过长,它可能会自行关闭。
关闭隧道 (macOS/Linux)
我们之前在本地机器上创建的隧道被发送到后台,因此关闭用于打开隧道的终端窗口不会终止它。 要终止隧道,我们需要使用 ps
命令识别进程 ID (PID),然后使用 kill
命令终止进程。
让我们在我们的机器上搜索所有活动的 ssh
进程:
ps aux |grep ssh
找到与您之前输入的用于创建隧道的命令相似的行。 这是示例输出:
Outputsammy 14345 0.0 0.0 2462228 452 ?? Ss 6:43AM 0:00.00 ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain
从行的开头,在前两列之一中,是一个 3-5 位数字。 这是PID。 此处突出显示 14345
的示例 PID。
现在您知道 PID 是什么,您可以使用 kill
命令关闭隧道。 终止进程时使用您的 PID:
kill 14345
关闭隧道(Windows)
关闭用于创建隧道的 PuTTY 窗口。 就是这样。
第 4 步 (macOS/Linux) — 创建可重复使用的快捷方式
对于 macOS 或 Linux 系统,我们可以制作别名或创建脚本来快速为我们创建隧道。 以下是自动化隧道过程的两种方法:
这些快捷方式都需要对服务器进行无密码/无密码 SSH 密钥身份验证。
可点击的 BASH 脚本
如果您想要一个在单击时会启动隧道的图标,我们可以创建一个小的 BASH 脚本来完成这项工作。 该脚本将设置隧道,然后启动 Firefox,尽管您仍然需要第一次在 Firefox 中手动添加代理设置。
在 macOS 上,我们可以从命令行启动的 Firefox 二进制文件位于 Firefox.app 中。 假设应用程序位于 Applications 文件夹中,二进制文件将在 /Applications/Firefox.app/Contents/MacOS/firefox
中找到。
在 Linux 系统上,如果您通过 repo 安装了 Firefox,或者如果它是预安装的,那么它的位置应该是 /usr/bin/firefox
。 如果 Firefox 不在标准位置,您始终可以使用命令 which firefox
找出 Firefox 在系统上的位置。
在此脚本中,将 Firefox 的路径替换为适合您系统的路径。 您可能还需要调整 SSH 行以反映您之前用来建立隧道的成功命令。
使用像 nano
这样的文本编辑器创建一个新文件:
nano ~/socks.sh
添加以下行:
袜子.sh
#!/bin/bash -e ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@`your_domain` /Applications/Firefox.app/Contents/MacOS/firefox &
- 将
1337
替换为您想要的端口号(它应该与您在 Firefox 中输入的相匹配) - 将
sammy@your_domain
替换为您的 SSH 用户@您的主机名或 IP - 将
/Applications/Firefox.app/Contents/MacOS/firefox
替换为您系统的 Firefox 二进制文件的路径
保存您的脚本。 对于 nano
,键入 CONTROL + o
,然后要退出,键入 CONTROL + x
。
使脚本可执行,这样当您双击它时,它就会执行。 在命令行中,使用 chmod
命令添加执行权限:
chmod +x /path/to/socks.sh
在 macOS 上,您可能需要执行一个额外的步骤来告诉 macOS .sh 文件应该像程序一样执行,而不是在编辑器中打开。 为此,请右键单击您的 socks.sh
文件并选择“获取信息”。
找到“打开方式:”部分,如果显示三角形未指向下方,请单击它以查看下拉菜单。 Xcode 可能被设置为默认应用程序。
将其更改为 Terminal.app。 如果未列出 Terminal.app,请选择“其他”,然后导航到应用程序 > 实用程序 > Terminal.app(您可能需要将下拉菜单“启用”从“推荐应用程序”设置为“所有应用程序”)。
要立即打开您的 SOCKS 代理,请双击 socks.sh
文件。 该脚本将打开一个终端窗口,启动 SSH 连接,然后启动 Firefox。 此时请随意关闭终端窗口。 只要您在 Firefox 中保留代理设置,您就可以开始通过安全连接进行浏览:
该脚本将帮助您快速建立代理,但您仍然需要执行上面列出的手动步骤才能找到 ssh 进程并在完成后将其终止。
命令行别名
如果您发现自己经常使用命令行并且想要启动隧道,您可以创建一个命令行别名来为您完成这项工作。
创建别名最难的部分是找出保存别名命令的位置。
不同的 Linux 发行版和 macOS 版本将别名保存在不同的位置。 最好的办法是查找以下文件之一并搜索 alias
以查看当前保存其他别名的位置。 可能性包括:
- ~/.bashrc
- ~/.zshrc
- ~/.bash_aliases
- ~/.bash_profile
- ~/.profile
找到正确的文件后,将下面的别名添加到您已有的任何文件中,或添加到文件末尾。 在下面的示例中,我们使用别名“firesox”来启动 SOCKS 隧道,但您可以使用任何您希望的词作为别名:
.bashrc
alias firesox='ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain && /Applications/Firefox.app/Contents/MacOS/firefox &'
- 将
1337
替换为您想要的端口号(它应该与您在 Firefox 中输入的相匹配) - 将
sammy@your_domain
替换为您的 SSH 用户 @ 主机名或 IP - 将
/Applications/Firefox.app/Contents/MacOS/firefox
替换为 Firefox 二进制文件的路径
您的别名仅在您启动新 shell 时加载,因此请关闭您的终端会话并启动一个新的。 现在当你输入:
firesox
此别名设置您的隧道,然后为您启动 Firefox 并将您返回到命令提示符。 确保 Firefox 仍设置为使用代理。 您现在可以安全地浏览。
第 5 步(可选)- 故障排除:通过防火墙
如果您的连接正常,您就可以继续阅读了。 但是,如果您发现由于限制性防火墙而无法建立 SSH 连接,则可能是创建隧道所需的端口 22
被阻止了。 如果您可以控制代理服务器的 SSH 设置(具有对 DigitalOcean Droplet 的 root 访问权限,您将能够做到这一点),您可以将 SSH 设置为侦听 22
以外的端口。
您可以使用哪个端口没有被阻止?
经常开放的端口包括 80(一般网络流量)和 443(TLS,安全网络流量)。
如果您的 SSH 服务器不提供 Web 内容,我们可以告诉 SSH 使用这些 Web 端口之一进行通信,而不是默认端口 22
。 443
是最好的选择,因为它预计在这个端口上有加密的流量,我们的 SSH 流量将被加密。
从非防火墙位置,通过 SSH 连接到您用于代理的 DigitalOcean Droplet,或使用 Digital Ocean 控制面板中的内置 控制台 。
编辑服务器的 SSH 设置:
sudo nano /etc/ssh/sshd_config
寻找线 Port 22
。
我们可以完全替换“22”,也可以添加第二个端口供 SSH 监听。 我们将选择让 SSH 在多个端口上侦听,因此我们将在 Port 22
下添加一个新行,显示为 Port 443
。 这是一个例子:
sshd_config
. . . Port 22 Port 443 . . .
重新启动 SSH,它会重新加载您刚刚编辑的 SSH 配置。 根据您的发行版,SSH 服务器守护程序的名称可能不同,但可能是 ssh
或 sshd
。 如果一个不起作用,请尝试另一个:
sudo service ssh restart
要验证您的新 SSH 端口是否正常工作,请打开一个新的 shell(不要关闭当前的 shell,以防万一您不小心将自己锁在了外面)并 SSH 使用新端口:
ssh sammy@your_domain -p 443
如果您成功了,您现在可以注销两个 shell 并使用新端口打开您的 SSH 隧道:
ssh -i ~/.ssh/id_rsa -D 1337 -f -C -q -N sammy@your_domain -p 443
Firefox 设置将是相同的,因为它不依赖于 SSH 端口,只依赖于隧道端口(上面的 1337
)。
结论
在这个现代时代,当您在潜在的敌对网络(例如咖啡店的公共 wifi)上时,有多种安全浏览方式。 在大多数情况下,如果您能够使用 VPN 来保护和保护您的所有流量,那么最好使用它。 但是,当您无法使用或信任 VPN 时,拥有 SOCKS 隧道将为您提供网页浏览所需的安全性。 SOCKS 隧道可以快速设置并在紧要关头使用,您可以完全控制它。 它们是安全浏览的绝佳选择。