SSH 和陈旧会话中的稳定反向端口转发

SSH 和陈旧会话中的稳定反向端口转发

使用 VPS 转发 NAT 后面的端口:

for((;;)) { ssh -R 2222:127.0.0.1:22 [email protected]; sleep 10; }

当连接因某种原因中断时,它会重新连接。

Warning: remote port forwarding failed for listen port 2222
Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686

我输入:

vi@vi-server:~$ killall sshd
Connection to vi-server.org closed by remote host.
Connection to vi-server.org closed.
Linux vi-server.no-ip.org 2.6.18-92.1.13.el5.028stab059.3 #1 SMP Wed Oct 15 13:33:44 MSD 2008 i686
vi@vi-server:~$ 

现在可以了。

如何使这个自动化变得更简单?

答案1

我认为你理解错了:就你的情况而言,sshd(服务器端)大概没有失败,也没有陈旧的会话,因此除了停止任何连接的客户端连接的副作用之外,杀死它不会对您有任何帮助ssh

就是ssh客户端在建立端口转发机制失败后,不退出连接,这个行为不算bug。

您需要查看ExitOnForwardFailuressh 手册中的选项。

你的脚本将是:

  对于((;;)){ ssh -R 2222:127.0.0.1:22[电子邮件保护]-o ExitOnForwardFailure=yes;睡眠 10;}

此外,您可能希望收紧ServerAliveIntervalServerAliveCountMax让客户端更快地检测到断开连接。(并且您应该确保这TCPKeepAliveon默认值)。请注意,autossh如果您设置了这些选项,这实际上不会对您有更多帮助。

答案2

我看到已经有一个很好的答案,引用了现有的软件(autossh),它可以通过 ssh 自动维护反向端口转发。

我仍然想分享我自己的小型 bash 脚本,它可以做同样的事情,而且设置起来很简单。

#!/bin/bash

while true
do
  START=$(date +%s)
  ssh -NR rport:host:lport -o ServerAliveInterval=10 -o ExitOnForwardFailure=yes user@host
  END=$(date +%s)
  DIFF=$(( $END - $START ))
  if (( $DIFF < 3 ))
  then
    sleep 60
  fi
done

如果转发反复失败,则每分钟重试一次就足够了,如果连接建立一段时间后断开,它将立即重试。

我在带有 systemd 的 archlinux 上使用它(写了一个小的 .service 文件),它运行良好。

答案3

好像自动SSH是正确的做法。

Autossh 是一个启动 SSH 副本并对其进行监控的程序,如果 SSH 死机或停止传输流量,则根据需要重新启动它。最初的想法和机制受到 RSTunnel(可靠 SSH 隧道)的启发。

从 1.2 版开始,方法发生了变化:autossh 开始使用 SSH 构建 SSH 转发循环(一个从本地计算机到远程计算机,一个从远程计算机到本地计算机),然后发送它期望返回的测试数据。(这个想法要感谢 Terrence Martin。)

在 1.3 版中,添加了一个新方法(感谢 Ron Yorston):可以为将回显测试数据的远程回显服务指定一个端口。这样可以避免拥塞,也避免了确保远程机器上的所有端口号不发生冲突的麻烦。对于无法使用回显服务的情况,循环转发方法仍然可用。

特征

  • autossh 是一个用于启动 ssh 副本并对其进行监控的程序,如果 ssh 死机或停止传输流量,则根据需要重新启动它。该想法源自 rstunnel(可靠 SSH 隧道),但用 C 实现。
  • 作者的观点是,它不像 rstunnel 那样繁琐。
  • 使用端口转发循环或远程回显服务进行连接监控。
  • 当遇到连接被拒绝等快速失败时,会降低连接尝试率。
  • 在 OpenBSD、Linux、Solaris、Mac OS X、Cygwin 和 AIX 上编译和测试;应该可以在其他 BSD 上运行。
  • 免费软件。

相关内容