可能的TIME_WAIT问题的解决方法,防止重新build立破损的SSH隧道?

虽然不打算交叉发布,但是在将这个问题发送到SecurityFocus的OpenSSH列表之后,我注意到这个列表的stream量很低(前一个post大约是5个月前)。 这就是说,我决定在这里重新发布,因为这个问题可能会得到更多的眼球(如果得到回答,将会有更好的机会被其他人使用):

问题:我有一个从内部机器到我的DMZ中的主机的反向SSH隧道,它被设置为在系统启动时启动,并在隧道失败时重新启动。 但是,当隧道中断(例如,由于networking中断)时,由于DMZ主机上的端口正在使用而无法重新build立。 从我读的OpenSSH邮件列表档案和其他地方,这似乎是因为端口处于TIME_WAIT状态。 这很好:我可以在build立隧道的脚本中放入睡眠声明。 但是,这导致了两个问题:

1)如何确定在特定的Linux(或其他)系统上如何定义TIME_WAIT间隔? 虽然我可以睡5分钟,没问题,但最好尽可能多地刮胡子。

2)尽pipeOpenSSH似乎不支持“ClearAllForwardings”选项,但是有没有类似的function可以使auth'd连接自动拆卸并重新创build它之前build立的现有连接?

长时间睡眠可能会“足够好”,但如果可能的话,我宁愿更有效地处理TIME_WAIT条件。

我感谢任何指导或build议!

我会认为你可以玩各种SSH设置,如TCPKeepAlive,ServerAliveInterval,ServerAliveCountMax等设置在连接断开的地方,它将杀死一切。 我有一个类似的设置,我已经做了很多SSHD和SSH两侧的修改,以配合我想要的。 然后,我有一个cron作业,每5分钟运行一次,如果需要的话,重新启动隧道。

#!/bin/bash if ps aux | grep "ssh -fnNTx" | grep -v "grep" then echo "Already Running" else echo "Starting now" ssh -fnNTx -L 1514:127.0.0.1:514 user1@XXXX fi 

到目前为止,这个解决scheme对我来说工作正常 你也可以设置一些types的Nagios检查或其他脚本来查看隧道是否打开,如果没有,就杀死那个pid,这样可以重新启动。

编辑:

以前的文章谈了很多关于TIME_WAIT的问题。 如何在TIME_WAIT中强制closures套接字?

SSHD应该设置SO_REUSEADDR,允许新实例绑定,即使之前的实例仍然处于TIME_WAIT状态。 要么你有一个马车SSHD,或者你有一些禁止这种行为的configuration设置(例如,如果你禁用X11UseLocalHost )。