如何使用 ssh 创建 SOCKS 代理?

如何使用 ssh 创建 SOCKS 代理?

我想将我的电脑用作 SOCKS 代理。你只需要这样做吗ssh -D port_number hostname?我必须将我的 Linux 用户名作为 吗hostname

答案1

tl;dr--寻找下面的粗体文本。


注意:我使用$前缀来表示字符串,你必须用你想要的值替换它。此语法是不是意味着与任何 shell 中的变量完全兼容。

的用法ssh -D确实是这样的:

ssh -D $port_number $hostname

或者

ssh -D $port_number $username@$hostname

哪里$hostname标识了某台机器;它可以是 IP 地址、可通过 DNS 解析的地址、通过/etc/hosts文件解析的地址或通过ssh_config文件解析的地址等。第一个命令将使用您当前的(本地)用户名,除非您的ssh_config文件另有说明(默认情况下不会)。您需要提供$username对机器有效的凭据(如询问时的密码)$hostname

这将打开$port_number你的当地的计算机并在其上建立 SOCKS 服务器。请注意,您可能不被允许以普通用户身份打开某些端口,尤其是低于 的端口1024,请使用更高的端口。

一般情况下没有提供SOCKS代理的情况ssh是这样的:

A -> D

其中A是客户端(例如 Web 浏览器),D是服务器(例如 Web 服务器)。但是使用代理,情况如下:

A -> B -> C -> D

在哪里:

  • A表示使用 SOCKS 地址的单个客户端B:$port_number;可能有许多客户端。
  • B是运行的机器ssh -D $port_number C,也是 TCP$port_number监听来自任何的传入连接的机器A
  • C是连接到;通常从$hostname B到 的通信现在从到达。DADC
  • D是任何服务器,它都可以看到来自的通信C,但可能没有意识到AB参与其中;可能有许多服务器。

在某些特定使用情况下,其中一些字母可能指代同一台机器。显然,任何情况下A=C都不会比简单连接带来直接优势A -> D,但还有其他有用的情况。

假设你运行ssh上面显示的命令,并告诉你的当地的浏览器在 处使用 SOCKS 。这是= 的localhost:$port_number情况。您的浏览器流量将被转发,您访问的网站 ( ) 将看到来自( ) 的通信,就像您的浏览器在那里运行一样。ABD$hostnameC

如果您希望其他计算机连接到您的开放端口(AB,它们将用作$your_IP:$port_numberSOCKS 服务器地址),您需要:

  • 配置防火墙以允许传入连接到 TCP 端口$port_number
  • 使用-g选项ssh -D

或者

  • 例如通过每个客户端自己单独的ssh连接来隧道化它们,这样它们的连接对于您已经运行的连接来说似乎是本地的(好像A= Bssh -D ...,因此防火墙不会干扰,也-g没有必要;这可以通过ssh -L $some_port:localhost:$port_number $your_IP在他们那边调用或ssh -R $some_port:localhost:$port_number $their_IP在您那边调用来完成;客户端将localhost:$some_port在他们的浏览器中用作 SOCKS 服务器地址。

没有理由$hostname不能Blocalhost它可以。在这种情况下B= C。当您在本地浏览器中使用此 SOCKS 代理时,这毫无意义(A= B= C),但如果您允许来自外部的连接,那么它就完全有意义了。我猜这就是你想做的事。该命令可能是:

ssh -g -f -N -D $port_number localhost

你可能想要建立基于密钥的身份验证因此从到的ssh连接不需要您的密码。上述关于防火墙的评论仍然有效。任何能够使用SOCKS 服务器地址的人都会被他们访问的服务器看到,就好像他们在您的计算机上一样。localhostlocalhost$your_IP:$port_number


相关片段man 1 ssh

-D [bind_address:]port
指定本地“动态”应用程序级端口转发。这通过分配一个套接字来port在本地端监听,可选择绑定到指定的bind_address。每当连接到此端口时,连接都会通过安全通道转发,然后使用应用程序协议来确定从远程计算机连接到哪里。目前支持 SOCKS4 和 SOCKS5 协议,并将ssh充当 SOCKS 服务器。只有 root 可以转发特权端口。[...]

-f
请求ssh在命令执行之前进入后台。[...]

-g
允许远程主机连接到本地转发端口。

-N
不执行远程命令。这对于仅转发端口很有用。[...]

相关内容