我这样设置反向隧道:
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 已使用加密密钥回复...;应该将其写在已知主机中吗?
一旦完成,您就可以开始了。基本上就是发射后不管。