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

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

相关问题:启动服务器到客户端的 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,即一些“永无止境”的命令,它就可以工作,所以我只是创建了空文件/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 隧道正常运行的正确方法是什么?

答案1

听起来您想要-Nssh 选项。

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

答案2

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

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

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

答案3

我会第二@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 [email protected] nc `echo %h|sed 's/-o//'` %p

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

       SS #1

                                          SS #2

相关内容