作者选择了COVID-19 救济基金来接受捐赠,作为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 Web 浏览器。
- 对于 Windows 用户,您还需要PuTTY工具或适用于 Linux 的 Windows 子系统 (WSL)
PuTTY 用于为 Windows 用户设置代理隧道。macOS 或 Linux 用户已预先安装了设置隧道的工具。
步骤 1 (macOS/Linux) — 设置隧道
在您的本地计算机上,如果您没有创建已经存在的 Droplet ,请创建一个SSH 密钥。创建密钥后,请确保将公共端添加到 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 一旦隧道启动就不会发送任何命令
请务必替换为您的用户和服务器 IP 地址/域名。sammy@your_domain
sudo
输入命令后,您将立即再次进入命令提示符,没有成功或失败的迹象;这是正常的。
使用以下命令验证隧道是否正在运行:
- 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 是14345
。然后我们将使用命令。我们将在步骤 3 中完成终止。kill 14345
步骤 1 (Windows) — 设置隧道
打开腻子。
如果您还没有安装它,请下载 PuTTY 并将其保存在您喜欢的位置。PuTTY 不需要管理员权限即可安装;只需下载.exe
并运行它。
完成以下步骤来设置隧道:
- 在会话部分,添加服务器的主机名(或 IP 地址)和 SSH 端口(通常为 22)
- 在左侧,导航至:连接 > SSH > 隧道
- 在
1025
和之间输入任何源端口号65536
,例如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
. which firefox
如果 Firefox 不在标准位置,您可以随时使用该命令找出 Firefox 在您系统上的位置。
在此脚本中,将 Firefox 的路径替换为适合您系统的路径。您可能还需要调整 SSH 行以反映您之前用于建立隧道的成功命令。
使用文本编辑器nano
创建一个新文件:
- nano ~/socks.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 隧道,但您可以使用任何您希望的单词作为别名:
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 的根访问权限,您将能够做到这一点),您可以将 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
. 下面是一个例子:
. . .
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 隧道可以快速设置并在紧要关头使用,您可以完全控制它。它们是安全浏览的绝佳选择。