如何使用 ssh 创建 SOCKS 代理?

Raf*_*rco 8 linux ssh proxy socks

我想将我的计算机用作 SOCKS 代理。你只需要做ssh -D port_number hostname吗?我必须把我的 Linux 用户名作为hostname?

Kam*_*ski 17

tl;dr——寻找下面的粗体文字。


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

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

ssh -D $port_number $hostname
Run Code Online (Sandbox Code Playgroud)

或者

ssh -D $port_number $username@$hostname
Run Code Online (Sandbox Code Playgroud)

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

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

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

A -> D
Run Code Online (Sandbox Code Playgroud)

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

A -> B -> C -> D
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • A表示B:$port_number用作 SOCKS 地址的单个客户端;可能有很多客户。
  • Bssh -D $port_number C运行和 TCP$port_number侦听来自任何A.
  • C$hostname B连接到;通常DA现在开始的通信D从 开始C
  • D是任何服务器,它看到来自C并且可能不知道A并且B涉及的通信;可能有很多服务器。

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

假设您运行ssh上面显示的命令并告诉您的本地浏览器使用 SOCKS at localhost:$port_numberA=就是这种情况B。您浏览器的流量将被转发,您访问的站点 ( D) 将看到来自$hostname( C) 的通信,就像您的浏览器在那里运行一样。

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

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

或者

  • 隧道每个客户端,例如通过他们自己单独的ssh连接,所以他们的连接看起来是本地的(就像A= B)你已经在运行,ssh -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
Run Code Online (Sandbox Code Playgroud)

您可能希望建立基于密钥的身份验证,这样sshlocalhost到的连接localhost就不会要求您输入密码。以上关于防火墙的说明。任何能够$your_IP:$port_number用作 SOCKS 服务器地址的人都会被他们访问的服务器看到,就像他们在您的计算机上一样。


的相关片段man 1 ssh

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

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

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

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