如何使用 SOCKS 隧道在没有 VPN 的情况下安全地路由 Web 流量

作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

在某些时候,您可能会发现自己所处的网络不安全或防火墙过于严格,您需要确保没有人在监视您的流量。一种解决方案是使用 VPN,但许多 VPN 需要在您的计算机上安装特殊的客户端软件,您可能无权安装这些软件。但是,如果您只需要确保您的网页浏览安全,那么有一个快速、免费且有用的替代方案:SOCKS 5 代理隧道。

SOCKS 代理是一个 SSH 加密隧道,在其中配置的应用程序向下转发其流量,然后在服务器端,代理将流量转发到一般 Internet。与 VPN 不同,SOCKS 代理必须在客户端机器上逐个应用程序进行配置,但只要应用程序能够使用 SOCKS 代理,您就可以在没有任何专业客户端软件的情况下设置应用程序。在服务器端,您只需要配置 SSH。

在本教程中,您将使用运行 Ubuntu 20.04 的服务器(尽管您可以通过 SSH 访问任何 Linux 发行版),并使用 Firefox Web 浏览器作为客户端应用程序。在本教程结束时,您将能够通过加密的 SSH 隧道安全地浏览网站。

先决条件

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_domainsudo

输入命令后,您将立即再次进入命令提示符,没有成功或失败的迹象;这是正常的。

使用以下命令验证隧道是否正在运行:

  • ps aux | grep ssh

您将在输出中看到如下一行:

Output
sammy 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并运行它。

完成以下步骤来设置隧道:

  1. 在会话部分,添加服务器的主机名(或 IP 地址)和 SSH 端口(通常为 22) 腻子会议
  2. 在左侧,导航至:连接 > SSH > 隧道
  3. 1025之间输入任何源端口号65536,例如1337腻子连接>SSH>隧道
  4. 选择动态单选按钮
  5. 单击添加按钮
  6. 返回左侧的 Session
  7. 在 Saved Sessions 下添加一个名称,然后单击 Save 按钮
  8. 现在单击“打开”按钮进行连接
  9. 输入您的sudo用户名和服务器密码以登录

您现在可以最小化 PuTTY 窗口,但不要关闭它。您的 SSH 连接应该是打开的:

注意:您可以按照PuTTY SSH 密钥说明为同一会话保存您的sudo用户名 ( sammy ) 和 SSH 密钥这样您就不必每次打开连接时都输入用户名和密码。

步骤 2 — 配置 Firefox 以使用隧道

现在您有了 SSH 隧道,是时候配置 Firefox 以使用该隧道了。请记住,要使 SOCKS 5 隧道工作,您必须使用可以实现隧道的本地应用程序;Firefox 具有以下功能:

此步骤与 Windows、macOS 和 Linux 相同。

确保您拥有在 SSH 命令中使用的端口号;在我们的示例中,我们使用了1337.

(以下步骤是在 Firefox 80 版上执行的,但应该适用于其他版本,尽管选项的位置可能不同。)

打开火狐。

  1. 在右上角,单击汉堡包图标以访问 Firefox 的菜单。
  2. 单击首选项或选项菜单项。
  3. 滚动到底部并在网络设置下选择设置…按钮。
  4. 在“配置对 Internet 的代理访问”标题下,选择手动代理配置。
  5. 对于 SOCKS 主机输入localhost127.0.0.1和端口,使用隧道中指定的自定义端口,1337
  6. 在底部附近,选中“使用 SOCKS v5 时代理 DNS”框
  7. 单击“确定”按钮保存并关闭您的配置

现在,在 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

找到与您之前输入的用于创建隧道的命令相似的行。这是示例输出:

Output
sammy 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

添加以下几行:

袜子.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 的根访问权限,您将能够做到这一点),您可以将 SSH 设置为侦听22.

您可以使用哪个端口没有被阻止?

经常开放的端口包括 80(一般网络流量)和 443(TLS,安全网络流量)。

如果您的 SSH 服务器不提供 Web 内容,我们可以告诉 SSH 使用这些 Web 端口之一而不是默认端口进行通信22443是最好的选择,因为它预计会在此端口上加密流量,并且我们的 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 服务器守护程序的名称可能不同,但很可能是sshsshd如果一个不起作用,请尝试另一个:

  • 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 隧道可以快速设置并在紧要关头使用,您可以完全控制它。它们是安全浏览的绝佳选择。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁