永久后台ssh连接以创建反向隧道:正确的方法是什么?


41

相关问题:启动从服务器到客户端的ssh连接

那里的答案对我很有帮助,此命令可以满足我的需要:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

因此,我编写了脚本来始终重新连接:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

并将其添加到中/etc/crontab。但是我发现,只要我从shell中“手动”执行它,它就会起作用,但是如果被cron调用,ssh将连接并立即完成。(因此,上面的脚本一直都在重新连接)

从中man ssh,我发现对于后台连接,我应该使用-nkey 来调用它,但这没有帮助。然后,我只是四处寻找类似的脚本,发现如果调用tail -f something,它可以工作,即一些“ neverending”命令,所以我刚刚创建了一个空文件/tmp/dummy_file,现在我的ssh命令如下所示:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

现在可以使用!但是,这种解决方案似乎有点丑陋,而且我还不太了解这种行为的实际原因。只是偶然,我尝试调用bash而不是tail -fbash我也觉得它是“无休止的”命令)而不是调用。

因此,任何人都可以解释这种现象吗?创建后台ssh连接以保持反向ssh隧道正常的正确方法是什么?


&在ssh命令末尾使用该怎么办:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker 2014年

但是然后我的while循环将一次又一次地运行,ssh每5秒启动一次新的后台连接,对吗?这不是我所需要的。
德米特里·法兰克

Answers:


37

听起来像您想要-Nssh选项。

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

我强烈建议您考虑autossh。它具有某些启发式功能,可以确定连接丢失是否是根本原因,并且可以降低重新连接尝试的频率。此外,它使用额外的隧道监视连接,这对于您所询问的场景非常有用。

例如,如果您使用的是Ubuntu,则可以进行网络搜索autossh upstart以找到一些有关如何配置Ubuntu的有用示例,以便以持久的方式保持隧道。

我正在使用它来保持某些服务始终打开到服务器的隧道连接。


我实际上已经尝试过autossh,已经读过这篇文章:goo.gl/jVuuSR,但是它仅在系统启动时立即具有Internet连接的情况下才对我有用。但是如果以后建立连接,则无法正常工作。不确定,也许我做错了什么,但是即使在本文中,作者也已sleep 10在其中/etc/rc.local,以确保在调用autossh时已经准备好互联网连接。
德米特里·法兰克

2
@DmitryFrank:如果您尝试过,在您的问题中不提及这一点是不公平的。我仍然推荐它。使用upstart和其他init替代品,您可以将隧道的启动与正在启动的一个或多个网络设备联系在一起。网络上最好的解决方案(IMO)就是这样的:erik.torgesta.com/tag/ssh-upstart ... sleep 10在某些情况下,无济于事。
0xC0000022L 2014年

抱歉,我没有提及,说实话,当它对我不起作用时,我决定只是“手动”执行此操作,而完全忘记了autossh。谢谢ssh-upstart,我来看看!
德米特里·法兰克

晚会晚了,但我想补充一点,我无法可靠地获得autossh来维持反向隧道。如果反向隧道由于某种原因失败,则autossh不会发出通知,也不会重建连接。我需要来自多个服务器的多个隧道,这使事情变得复杂
DeveloperChris

@DeveloperChris:嗯,我正好在这种情况下运行-并且可靠。除非远程服务器确实出现故障,并且您需要将其重新打开,否则始终会重新建立隧道。也许您应该写自己的问题并提供详细信息。当然可以做到。我已经使用它几个月来解决VPN问题。
0xC0000022L

9

我将第二次使用@ 0xC0000022L的建议并使用autossh它。我使用它来维护笔记本电脑上的SSH连接,因为它可以随处携带,并且可以正常工作。我使用此连接将端口25和2143反向传输以访问我的个人SMTP和IMAP服务器。

这是我使用的脚本:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

然后Host,我$HOME/.ssh/config在host的文件中维护一个条目imap-o

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

autossh_mail.sh脚本在登录时作为我桌面的一部分运行。您可以通过访问它gnome-session-properties

       SS#1

                                          SS#2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.