反向 ssh 隧道连接中断后,挂起远程主机上的 sshd 进程

反向 ssh 隧道连接中断后,挂起远程主机上的 sshd 进程

我这样设置反向隧道:

function startconn () {
    ssh -N -b ${SRCIP} -X -R ${REMOTEIP}:${REMOTEPORT}:${LOCALIP}:${LOCALPORT} root@${REMOTEIP} &
    SSHPID=$!
    echo "$SSHPID" > $PIDFILE
    echo "Forwarding port ${REMOTEPORT} at ${REMOTEIP} to ${LOCALIP}:${LOCALPORT}"
}

这将通过 SRCIP 网络提供的备份链路转发 REMOTEPORT@REMOTEIP(我有一个辅助 NIC,其 SRCIP==192.168.5.2,它连接到 192.168.5.1 的备份链路网关)。

它工作得很好,但是有一个问题:如果 ssh 连接中断,例如由于网关重新启动等,一般来说,任何中断反向隧道 ssh 会话的 TCP/IP 连接的事件,REMOTEIP 处的 sshd 进程都会挂起,从而阻止重新建立到该端口的反向隧道(下面的 30200 是 REMOTEPORT):

netstat -anp | grep 30200
tcp        0      0 0.0.0.0:30200           0.0.0.0:*               LISTEN      8772/sshd: root

目前我看到的唯一可行解决方案是重新连接脚本记录与 REMOTEIP 的丢失连接,并在尝试重新建立反向隧道之前“手动”终止 sshd 进程。

有没有更智能/更简便的方法来防止远程 sshd 进程阻塞 REMOTEIP 端口?

答案1

对,是自动SSH,包装器远程控制正是为此而设计的。autossh 手册页状态:

autossh 是一个用于启动 ssh 副本并对其进行监视的程序,当其死机或停止传输流量时,根据需要重新启动它。

我在十几台机器上使用它,它的正常运行时间为 100%。

我按如下方式使用它:我将这条线

   su my_name -c /home/my_name/bin/auto

在里面/etc/rc.local启动反向隧道的机器(称为 A)的文件。可执行(*chmod 755 auto)文件 auto 为:

  #!/bin/sh

 /usr/lib/autossh/autossh -M 6527 -f -p 5298 -2 -N -R 8400:localhost:2222 userB@remote_hostB -i /home/my_name/.ssh/crypto-keyB

这里 5298 是远程主机(我称之为 B)的 ssh 端口,2222 是调用机器 A 的 ssh 端口。端口 6527 用于检查连接的状态;为了使此功能正常工作,需要在远程服务器(A)的防火墙上打开它。

这样就设置了反向隧道。现在,我可以通过以下命令从远程服务器 (B) 上的终端连接到启动反向隧道的机器 (A)

 sh -Y userA@localhost -p 8400 -i /home/userB/.ssh/crypto-keyA

你必须记住连接一次从任一机器到另一台机器,然后建立隧道,因为需要以交互方式回答常见问题:机器 A 已使用加密密钥回复...;应该将其写在已知主机中吗?

一旦完成,您就可以开始了。基本上就是发射后不管。

相关内容