如何设置 ssh 隧道来转发 ssh?

kle*_*lew 16 linux ssh ssh-tunnel forwarding

我在路由器后面有一台无法配置的 Ubuntu 计算机。但是我想通过 ssh 访问那台计算机。我认为 ssh 隧道是可能的,但我不知道该怎么做。我有另一台服务器,我想设置隧道。怎么做?或者也许您有其他想法如何解决这个问题?

我试过:

ssh -N user@my_server -L 22/localhost/8090
Run Code Online (Sandbox Code Playgroud)

但它说:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 22
Could not request local forwarding.
Run Code Online (Sandbox Code Playgroud)

Dav*_*ett 20

您要求它侦听本地端口 22 并将连接转发到远程系统的端口 8090。您不能这样做,因为本地端口 22 已被本地 SSH 服务器占用。

我认为您正在寻找的是远程转发。替换-L 22:localhost:8090-R 8090:localhost:22将告诉远程主机侦听端口 8090 并将请求转发到您的 SSH 服务器。

如果您让连接保持运行以便稍后可以从远程站点进入,那么您将需要通过添加相关选项(-o TCPKeepAlive=yes-o ServerAliveInterval=30)来确保连接不会因不活动而超时

所以你最终会得到类似的东西:

ssh -N user@my_server -R 8090:localhost:22 -o ServerAliveInterval=30
Run Code Online (Sandbox Code Playgroud)

此外,如果您和服务器之间的一个网络跃点在任何时候出现故障,尽管您指定了任何 KeepAlive 选项,连接仍将断开,因此您可能需要将此命令添加到 inittab,或查看 daemontools 包或您的发行版等效,以便它始终在启动时启动,并在由于系统关闭以外的某种原因退出时重新启动(或者您可以从无限循环的 shell 脚本运行它,但 init 或 daemontools 是更干净的解决方案)。

  • 如果您将服务器的公共地址或通配符添加到端口转发定义(-R 111.222.333.444:8090:localhost:22 或 -R *:8090:localhost:22),那么这可能会起作用,尽管这种事情可以在服务器上禁用。如果服务器是您控制的,请确保在 sshd_config 中启用了 GatewayPorts 选项。 (3认同)

Dav*_*ley 8

您不能这样做的原因是因为您试图将本地计算机上的端口 22 转发到远程服务器上的端口 8090,并且某些内容已经在本地服务器上的端口 22 上运行。很可能你有一个 SSH 服务器正在运行。您可以通过将 22 更改为不同的值来解决此问题。您可以通过运行以下命令来检查端口是否空闲:

# netstat -lep --tcp
Run Code Online (Sandbox Code Playgroud)

这列出了所有侦听套接字,因此如果未列出端口,则它是免费的。