我想将我的电脑用作 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
到 的通信现在从到达。D
A
D
C
D
是任何服务器,它都可以看到来自的通信C
,但可能没有意识到A
并B
参与其中;可能有许多服务器。
在某些特定使用情况下,其中一些字母可能指代同一台机器。显然,任何情况下A
=C
都不会比简单连接带来直接优势A -> D
,但还有其他有用的情况。
假设你运行ssh
上面显示的命令,并告诉你的当地的浏览器在 处使用 SOCKS 。这是= 的localhost:$port_number
情况。您的浏览器流量将被转发,您访问的网站 ( ) 将看到来自( ) 的通信,就像您的浏览器在那里运行一样。A
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
不能B
;localhost
它可以。在这种情况下B
= C
。当您在本地浏览器中使用此 SOCKS 代理时,这毫无意义(A
= B
= C
),但如果您允许来自外部的连接,那么它就完全有意义了。我猜这就是你想做的事。该命令可能是:
ssh -g -f -N -D $port_number localhost
你可能想要建立基于密钥的身份验证因此从到的ssh
连接不需要您的密码。上述关于防火墙的评论仍然有效。任何能够使用SOCKS 服务器地址的人都会被他们访问的服务器看到,就好像他们在您的计算机上一样。localhost
localhost
$your_IP:$port_number
相关片段man 1 ssh
:
-D [bind_address:]port
指定本地“动态”应用程序级端口转发。这通过分配一个套接字来port
在本地端监听,可选择绑定到指定的bind_address
。每当连接到此端口时,连接都会通过安全通道转发,然后使用应用程序协议来确定从远程计算机连接到哪里。目前支持 SOCKS4 和 SOCKS5 协议,并将ssh
充当 SOCKS 服务器。只有 root 可以转发特权端口。[...]
-f
请求ssh
在命令执行之前进入后台。[...]
-g
允许远程主机连接到本地转发端口。
-N
不执行远程命令。这对于仅转发端口很有用。[...]