0


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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

介绍

在某些情况下,您可能会发现自己处于一个不安全的网络或者有一个过于严格的防火墙,您会希望确保没有人在监视您的流量。一个解决方案是使用 VPN,但许多 VPN 需要在您的设备上安装特殊的客户端软件,而您可能没有安装的权限。然而,如果您只需要保护您的网页浏览,有一个快速、免费且有用的替代方案:SOCKS 5 代理隧道。

SOCKS 代理是一个 SSH 加密隧道,在该隧道中,配置的应用程序将其流量转发下来,然后在服务器端,代理将流量转发到互联网。与 VPN 不同,SOCKS 代理必须在客户端设备上逐个应用程序进行配置,但只要应用程序能够使用 SOCKS 代理,您就可以设置应用程序而无需任何特殊的客户端软件。在服务器端,您只需要配置 SSH。

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

先决条件

  • 运行 Ubuntu 20.04 的 Linux 服务器(其他发行版也可以),具有 sudo 用户和 SSH 访问权限。要设置这一点,您可以按照我们的 Ubuntu 20.04 初始服务器设置教程进行操作。在这里构建您的 DigitalOcean Droplet 上的隧道。
  • 一个要配置 SOCKS 代理的应用程序,比如 Firefox 网页浏览器。
  • 对于 Windows 用户,您还需要 PuTTY 工具或 Windows Subsystem for Linux (WSL)。

PuTTY 用于为 Windows 用户设置代理隧道。macOS 或 Linux 用户已经预先安装了设置隧道所需的工具。

步骤 1(macOS/Linux)— 设置隧道

在您的本地计算机上,如果您没有在创建 Droplet 时已经创建 SSH 密钥,请创建一个 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 隧道(您可以选择 102565536 之间的数字)
  • -f:将进程分叉到后台
  • -C:在发送数据之前对数据进行压缩
  • -q:使用安静模式
  • -N:告诉 SSH 一旦隧道建立,将不会发送任何命令

请确保将

sammy@your_domain

替换为您的

sudo

用户和服务器 IP 地址/域名。

一旦输入命令,您将立即被带回到命令提示符,没有成功或失败的迹象;这是正常的。

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

ps aux | grep ssh

您将在输出中看到一行类似于以下内容:

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 会话放入了后台:

步骤 1(Windows)— 设置隧道

打开 PuTTY。

如果您尚未安装 PuTTY,请下载 PuTTY 并将其保存在您喜欢的位置。PuTTY 不需要管理员权限来安装;只需下载

.exe

文件并运行即可。

完成以下步骤设置隧道:

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

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

步骤 2 — 配置 Firefox 使用隧道

现在你已经建立了一个 SSH 隧道,是时候配置 Firefox 使用这个隧道了。请记住,要让 SOCKS 5 隧道生效,你必须使用一个能够实现隧道的本地应用程序;Firefox 就具备这个功能:

确保你记住了在 SSH 命令中使用的端口号;在我们的示例中,我们使用的是

1337

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

打开 Firefox。

  1. 在右上角,点击汉堡菜单图标以访问 Firefox 的菜单。
  2. 点击“首选项”或“选项”菜单项。
  3. 滚动到底部,在“网络设置”下选择“设置…”按钮。
  4. 在“配置代理访问互联网”标题下选择手动代理配置。
  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

找到类似于你之前输入的创建隧道命令的行。以下是示例输出:


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。示例 PID

14345

在这里被突出显示。

现在你知道了 PID 是多少,你可以使用

kill

命令关闭隧道。在终止进程时使用你的 PID:

kill 14345

关闭隧道(Windows)

关闭你用于创建隧道的 PuTTY 窗口。就是这样。

步骤 4(macOS/Linux)— 为重复使用创建快捷方式

对于 macOS 或 Linux 系统,我们可以创建别名或者创建一个脚本来快速为我们创建隧道。以下是两种自动化隧道过程的方法:

可点击的 BASH 脚本

如果你想要一个图标,点击后会启动隧道,我们可以创建一个小的 BASH 脚本来完成这项工作。该脚本将设置隧道,然后启动 Firefox,尽管你仍然需要在 Firefox 中手动添加代理设置。

在 macOS 上,我们可以从命令行中启动的 Firefox 二进制文件位于 Firefox.app 内。假设该应用程序位于 Applications 文件夹中,二进制文件将在

/Applications/Firefox.app/Contents/MacOS/firefox

找到。

在 Linux 系统上,如果你通过存储库安装了 Firefox,或者它是预安装的,那么它的位置应该是

/usr/bin/firefox

。如果 Firefox 不在标准位置上,你可以随时使用

which firefox

命令来找出 Firefox 在你的系统上的位置。

在这个脚本中,用适合你系统的路径替换 Firefox 的路径。你可能还需要调整 SSH 行以反映你之前成功使用的命令来建立隧道。

使用像

nano

这样的文本编辑器创建一个新文件:

nano ~/socks.sh

添加以下行:

#!/bin/bash -essh -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 可能设置为默认应用程序。!Get Info

将其更改为 Terminal.app。如果 Terminal.app 没有列出,请选择“其他”,然后导航到应用程序 > 实用工具 > Terminal.app(您可能需要将下拉菜单“启用”从“推荐应用程序”更改为“所有应用程序”)。

现在,双击

socks.sh

文件以打开您的 SOCKS 代理。脚本将打开一个终端窗口,启动 SSH 连接并启动 Firefox。此时可以随意关闭终端窗口。只要您保留了 Firefox 中的代理设置,就可以开始通过安全连接进行浏览:

命令行别名

如果您经常在命令行上工作并希望启动隧道,可以创建一个命令行别名来为您完成这项工作。

创建别名的最困难的部分是找到保存别名命令的位置。

不同的 Linux 发行版和 macOS 版本将别名保存在不同的位置。最好的方法是查找以下文件之一,并搜索

alias

,以查看其他别名当前保存在哪里。可能的位置包括:

  • ~/.bashrc
  • ~/.zshrc
  • ~/.bash_aliases
  • ~/.bash_profile
  • ~/.profile

找到正确的文件后,在任何已有的别名下添加以下别名,或者将其添加到文件末尾。在下面的示例中,我们使用别名 ‘firesox’ 来启动 SOCKS 隧道,但您可以使用任何您希望的单词作为别名:

aliasfiresox='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

。以下是一个示例:

...

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的使用是首选。但是当你无法使用或信任VPN时,使用SOCKS隧道将为你在网页浏览时提供所需的安全性。SOCKS隧道快速设置并且在紧急情况下使用,你可以完全控制它。它们是安全浏览的绝佳选择。

标签: 安全 前端

本文转载自: https://blog.csdn.net/rubys007/article/details/143135747
版权归原作者 白如意i 所有, 如有侵权,请联系我们删除。

“如何在不使用 VPN 的情况下通过 SOCKS 隧道安全地路由 Web 流量”的评论:

还没有评论