我有以下设置:一台运行 sshd 的机器(当地的)位于路由器(路由器)后面,第二台主机(远程)尝试访问当地的通过 ssh 连接互联网和路由器。
因此:端口转发路由器:22->当地的:22(和路由器作为门户当地的)。运行良好。
如果我尝试从偏僻的到当地的如下:
ssh -L 1234:R:12345 user@R
这仅在我也重定向时才有效路由器:1234->当地的:1234。
我的理解是,ssh 将通过端口 22 上的连接传输所有流量。但似乎情况并非如此。我做错了什么吗?是否有可能通过单个连接传输所有流量?
答案1
您的问题对我来说有点不清楚,所以我将详细说明我的假设,然后尝试帮助您解决问题。您在“远程”计算机上,该计算机正在通过 SSH 连接到“本地”,并且此部分工作正常。如果是这样,我们就不再需要担心路由器了。
继续我的假设,“本地”在端口 12345 上运行着一项服务,而您想从“远程”访问该服务,而无需在路由器上打开其他端口。您需要做的是从“远程”使用以下命令:
ssh -L 1234:localhost:12345 user@router's_ip
要连接到该服务,您可以通过 localhost:1234 访问它。
端口转发语法的工作方式是:{本地端口}:{代理目标}:{代理端口}
本地端口是您正在连接的客户端机器上打开的端口,要访问它,您可以使用 localhost:本地端口
代理目标是从您正在通过 SSH 连接的服务器的角度来看您想要连接的主机
代理端口是您想要连接的远程系统上的端口。
答案2
回答你问题的第二部分。你可以使用 SSH 更高版本的动态代理功能来转发所有流量,但有几个注意事项。
您在客户端上使用的应用程序必须支持 SOCKS 代理。
OpenSSH 仅支持 SOCKS4 样式代理。
使用的语法是:
ssh -D 用户@远程主机
答案3
我认为你想要的是:
remote
从到sshlocal
- 并将
1234
远程端口转发12345
到local
你似乎表明local
位于 NAT 后面router
- 这就是为什么你需要设置端口转发,以便router:22
内部转发到local:22
如果我理解正确的话,您想要在远程使用的命令行实际上是:
ssh -L 1234:local:12345 user@router
这里的关键是,虽然这是一个local
端口转发(-L
== local
),但主机名的解析(即,local
在本例中 - 列表中的第二个参数1234:local:12345
)发生在目标机器上 - 在本例中是local
。
在您的示例中,您有1234:router:12345
- 这意味着流量从remote
到沿着 ssh 隧道传输;然后从到local
路由- 并且正如您所说,这需要另一个端口转发才能将流量返回到。local
router
local
另一种方法是使用ssh 从local
到。这样就不需要端口转发了,但你仍然需要转发到。这样做的明显缺点是你无法从 发起此连接,因为你没有办法到达。remote
ssh -R 1234:local:12345
router
1234
remote
12345
local
remote
local