web-dev-qa-db-ja.com

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

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

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

それは今動作します!しかし、この解決策は少し見苦しいようです。さらに、その動作の実際の理由がよくわかりません。たまたま、tail -fの代わりにbashを呼び出そうとしましたが(bashも "neverending"コマンドのように見えます)、機能しません。

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

42
Dmitry Frank

-N sshのオプション。

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

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

たとえば、Ubuntuを使用している場合は、autossh upstartをWeb検索して、Ubuntuを構成してトンネルが持続的に維持されるようにするための便利な例を見つけることができます。

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

16
0xC0000022L

次に @ 0xC0000022Lの提案 を使用し、autosshも使用します。私はラップトップからの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

次に、ホスト$HOME/.ssh/configimap-oファイルにHostエントリを保持します。

$ 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

9
slm