ssh -D
可以在本地机器上创建一个 socks 端口,将流量传递到远程,然后再传递到其他地方。
ssh -L port:host:hostport
,在本地机器上监听端口,从远程机器的角度将流量传递到“host:hostport”。
ssh -R port:host:hostport
是的对应部分ssh -L
,它在远程机器上监听端口,并从本地机器的角度将流量传递到“host:hostport”。
但是对应的是什么ssh -D
,即如何在远程机器上打开一个 socks 端口,将流量传递到本地,然后再传递到其他地方?
答案1
通过-D
&,-L
您就可以在两台机器之间进行通信。
所以...
- 从本地机器,用于
-R
在指向本地机器的 sshd 的远程机器上创建监听端口。 - 在远程机器上使用
-D
,指向您上面创建的端口。
我“认为”填写以下内容即可使其起作用......
ssh remotehost -R remoteport:localhost:localport "ssh -D 9050 localhost -p remoteport"
上面的‘ remotehost
’、‘ remoteport
’和‘ ’需要更改。9050 上将形成一个 socks 代理。localport
答案2
local$ ssh -R 1080 remote
remote$ curl --socks5 localhost https://example.com
自 OpenSSH 7.6 起
ssh(1):添加对反向动态转发的支持。在此模式下,ssh 将充当 SOCKS4/5 代理并将连接转发到远程 SOCKS 客户端请求的目的地。此模式是使用 -R 和 RemoteForward 选项的扩展语法请求的,并且由于它仅在客户端上实现,因此不需要更新服务器即可获得支持。
答案3
可以通过 ~/.ssh/config 中的这段代码透明地实现:
Host sockstunnel
ProxyCommand ssh -D 3128 localhost nc -q 1 localhost 22
Host target
RemoteForward 3128 localhost:3128
ProxyCommand ssh -W target:22 sockstunnel
细节
我们想要一个反向的 DynamicForward。这可以通过两个 ssh 命令实现:
ssh -D 3128 localhost
ssh -R 3128:localhost:3128 target
这样,目标就拥有了到 SSH 客户端的 SOCKS 隧道。
我所做的是使用经典的 ssh 链接方式通过中间主机到达远程目标,以便在登录目标时透明地处理 SOCKS 隧道创建。第一个 ProxyCommand + nc 技巧是强制性的,因为 -W 意味着 ClearAllForwardings。