リバーストンネルを作成するための永続的なバックグラウンド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。しかし、シェルから「手動」で実行するだけで機能することがわかりましたが、cronから呼び出された場合、sshは接続してすぐに終了します。(したがって、上記のスクリプトは常に再接続します)

からman ssh、バックグラウンド接続では-nキーで呼び出す必要があることがわかりましたが、助けにはなりませんでした。次に、同様のスクリプトを探してみたところ、を呼び出すと機能することがわかりましたtail -f something。つまり、「ネバーエンディング」コマンドなので、空のファイル/tmp/dummy_fileを作成したところ、sshコマンドは次のようになります。

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

今すぐ動作します!しかし、この解決策は少しいように思えますが、実際にその動作の実際の理由はわかりません。偶然に、私bashtail -f(代わりにbash「永遠に」コマンドでもないように思える)の代わりに電話をかけようとしましたが、うまくいきません。

だから、誰もこの動作を説明してもらえますか?バックグラウンドssh接続を作成してリバースsshトンネルを維持する正しい方法は何ですか?


&sshコマンドの最後に使用するのはどうssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
ですか

しかし、その後、whileループが繰り返し実行され、ssh5秒ごとに新しいバックグラウンド接続が開始されますよね?これは私が必要とするものではありません。
ドミトリーフランク

回答:


37

-Nssh のオプションが必要なようです。

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

16

検討することを強くお勧めしますautossh。接続の損失が根本的な原因であるかどうかを判断できる特定のヒューリスティックがあり、再接続の試行の頻度が低くなります。さらに、追加のトンネルを使用して接続を監視するため、求めているようなシナリオに非常に役立ちます。

たとえば、Ubuntuを使用している場合は、Web検索を実行して、autossh upstartUbuntuを構成してトンネルが永続的に維持されるようにする方法に関する有用な例を見つけることができます。

私はこれを使用して、特定のサービスのために常にサーバーへのトンネル接続を開いたままにします。


実際に試してみautosshましたが、この記事goo.gl/jVuuSRを読みましたが、システム起動時にすぐにインターネットに接続できる場合にのみ機能しました。しかし、後で接続が確立された場合、機能しませんでした。確かではありませんが、私は何か間違ったことをしたかもしれませんが、この記事でも、autosshが呼び出されたときにインターネット接続が既に準備されていることを確認するために、著者はにsleep 10して/etc/rc.localいます。
ドミトリーフランク

2
@DmitryFrank:あなたが試したことがあるなら、あなたの質問でそれを言及しないのは不公平です。私はまだそれをお勧めします。でupstart、その他のinit代替あなたはアップされて、1つまたは複数のネットワークデバイスへのトンネルの開始を結び付けることができます。Web上での最高のソリューション(IMO)は、erik.torgesta.com / tag / ssh-upstart ... sleep 10です。とにかく、いくつかのエッジケースで問題を解決することはできません。
0xC0000022L

それについて言及していないことを残念に思います。それがうまくいかなかったときに正直に言うと、私はそれを「手作業」で行うことにし、autosshを完全に忘れました。おかげでssh-upstart、私はそれを見てみましょう!
ドミトリーフランク

パーティーに遅れましたが、逆トンネルを維持するためにautosshを確実に取得できなかったと付け加えました。何らかの理由でリバーストンネルが失敗した場合、autosshは通知せず、接続を再構築しません。私は、複数のサーバから複数のトンネルを必要とし、これが問題を複雑に
DeveloperChris

@DeveloperChris:まあ、私はまさにこのシナリオを実行しています-そして確実に。リモートサーバーが文字通りダウンして、再びオンにする必要がない限り、トンネルは常に再確立されます。おそらく、独自の質問を書いて詳細を提供する必要があります。確かにこれを行うことができます。これを使用して、VPNの問題を数か月間回避しました。
0xC0000022L

9

@ 0xC0000022Lの提案と使用autosshも2回目にします。私はそれを使ってラップトップからSSH接続を維持し、それをあちこち持って行って、それがうまくいくようにします。この接続を使用して、個人用のSMTPおよびIMAPサーバーにアクセスするためにポート25および2143をトンネルバックします。

私が使用するスクリプトは次のとおりです。

$ 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のファイルにHostエントリを保持$HOME/.ssh/configします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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.