linux – SSHトンネルを確実にオープンにしておくには?

linux networking security shell ssh

私は職場のSSHトンネルを使って、いろいろなアイドックなファイアウォールを迂回しています(上司には問題ないのですが…)。問題は、しばらくすると通常 ssh 接続がハングアップしてしまい、トンネルが壊れてしまうことです

せめてトンネルを自動的に監視することができれば、トンネルがハングアップしたときに再起動できるのだが、その方法すら思いつかなかった

もちろん、私のssh接続がハングアップしないようにする方法を教えてくれる人にはボーナスポイントがあります!

  264  Peltier  2009-09-08


ベストアンサー

autossh が必要なようです。これは ssh トンネルを監視し、必要に応じて再起動します。私たちは数年前からこれを使用していますが、うまく機能しているようです

autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C

Mパラメータの詳細はこちら

320  KeithB  2009-09-08


すべてのステートフルファイアウォールは、しばらくの間その接続のパケットを見ないと、接続を忘れてしまいます(接続を閉じずに両端が死亡した接続でステートテーブルがいっぱいになるのを防ぐため)。ほとんどのTCP実装は、相手側からの連絡がないまま長い時間が経過した後、キープアライブパケットを送信します(2時間が一般的な値です)。しかし、キープアライブパケットを送信する前に接続を忘れてしまうステートフルファイアウォールがある場合、長持ちするがアイドル状態の接続は死んでしまいます

もしそうなら、解決策は接続がアイドル状態になるのを防ぐことです。OpenSSH には ServerAliveInterval というオプションがあり、これを使って接続が長くアイドル状態になるのを防ぐことができます (ボーナスとして、接続がアイドル状態になっていても、相手がいつ死んだかをすぐに検出してくれます)

43  CesarB  2009-09-28


私は以下の Bash スクリプトを使って、前の ssh トンネルが死んだときに新しい ssh トンネルを生成し続けています。スクリプトを使うと、追加のパッケージをインストールしたくないときや、コンパイラを使うことができないときに便利です

while true
do
ssh <ssh_options> [user@]hostname
sleep 15
done

これは自動的に接続を確立するためにキーファイルを必要とすることに注意してください

26  Jawa  2009-09-22


自分のmacやlinuxマシンで、3分ごとにサーバのsshが生きているように設定してください。ターミナルを開いて、あなたの家にある目に見えない .ssh に移動します

cd ~/.ssh/

で1行の設定ファイルを作成します

echo "ServerAliveInterval 180" >> config

も追加する必要があります

ServerAliveCountMax xxxx (high number)

デフォルトは3なので、ServerAliveInterval 180は9分後(ServerAliveIntervalで指定した3分間隔のうち3分)に送信を停止します

24  David Shaw  2010-05-29


Systemdは理想的にはこれに適しています

を含むサービスファイル/etc/systemd/system/sshtunnel.serviceを作成します

[Unit]
Description=SSH Tunnel
After=network.target

[Service]
Restart=always
RestartSec=20
User=sshtunnel
ExecStart=/bin/ssh -NT -o ServerAliveInterval=60 -L 5900:localhost:5900 user@otherserver

[Install]
WantedBy=multi-user.target

(ssh コマンドを適宜変更してください)

  • これはユーザ sshtunnel として実行されるので、まずユーザが存在することを確認してください
  • 課題systemctl enable sshtunnelで起動時に起動するように設定します
  • systemctl start sshtunnelを発行してすぐに開始します

2018年1月のアップデート: 一部のディストロ (Fedora 27 など) は SELinux ポリシーを使用して systemd init からの SSH の使用を防ぐことがありますが、その場合は必要な除外を提供するためにカスタムポリシーを作成する必要があります

24  community wiki  None


ServerAliveCountMaxを誤解しているように見えます。ドキュメントを理解している限りでは、これは接続を終了させずに応答しないことができるサーバーアライブメッセージの数です。ですから、ここで議論しているようなケースでは、この値を高く設定することでハングした接続が検出されずに終了されないことを保証しているのです!

ServerAliveIntervalを設定するだけで、ファイアウォールが接続を忘れてしまうという問題を解決するには十分なはずです

あなたが欲しいのは、1) 通常の状況下では接続を永久に開いたままにしておくこと、2) 接続の失敗を検出して、失敗したときに発信側を終了させること、3) ssh コマンドを終了するたびに再発行することです (どのようにするかは非常にプラットフォームに依存します。Jawa が提案した “while true” スクリプトは一つの方法です。)

13  user2793784  2013-11-28


期限切れのNATセッションでトンネルの問題が発生した場合には、常にServerAliveInterval SSHオプションを使用してください

接続が完全にダウンしてしまった場合に備えて、必ずリスポーン方法を使用してください、ここでは少なくとも3つの選択肢があります

  • autossh program
  • bash スクリプト (while true do ssh ...; sleep 5; done) は sleep コマンドを削除しないでください
  • /etc/inittab、他国に出荷されて設置された箱に、NATの後ろで、箱にポートフォワーディングせずにアクセスできるようにするために、あなたはそれを設定して、あなたに戻ってsshトンネルを作成することができます

    tun1:2345:respawn:/usr/bin/ssh -i /path/to/rsaKey -f -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip 'sleep 365d'
    
  • /etc/inittabが利用できないUbuntu上でのupstartスクリプト

    start on net-device-up IFACE=eth0
    stop on runlevel [01S6]
    respawn
    respawn limit 180 900
    exec ssh -i /path/to/rsaKey -N -o "ServerAliveInterval 180" -R 55002:localhost:22 user@publicip
    post-stop script
    sleep 5
    end script
    

または常に両方の方法を使用します

9  claudiuf  2014-03-08


これで解決しました

Edit

~/.ssh/config

And add

ServerAliveInterval 15
ServerAliveCountMax 4

ssh_config の man ページ によると

ServerAliveCountMax
Sets the number of server alive messages (see below) which may be
sent without ssh(1) receiving any messages back from the server.
If this threshold is reached while server alive messages are
being sent, ssh will disconnect from the server, terminating the
session.  It is important to note that the use of server alive
messages is very different from TCPKeepAlive (below).  The server
alive messages are sent through the encrypted channel and there‐
fore will not be spoofable.  The TCP keepalive option enabled by
TCPKeepAlive is spoofable.  The server alive mechanism is valu‐
able when the client or server depend on knowing when a connec‐
tion has become inactive.

The default value is 3.  If, for example, ServerAliveInterval
(see below) is set to 15 and ServerAliveCountMax is left at the
default, if the server becomes unresponsive, ssh will disconnect
after approximately 45 seconds.  This option applies to protocol
version 2 only.

ServerAliveInterval
Sets a timeout interval in seconds after which if no data has
been received from the server, ssh(1) will send a message through
the encrypted channel to request a response from the server.  The
default is 0, indicating that these messages will not be sent to
the server.  This option applies to protocol version 2 only.

6  nachopro  2013-05-30


ExitOnForwardFailure yesは、他の提案の良い補助的なものです。接続してもポート転送を確立できない場合は、全く接続していないのと同じように役に立たない

5  jcomeau_ictx  2015-06-06


私は、SSHトンネルを長期的に維持する必要がありました。私の解決策はLinuxサーバから実行していたのですが、それは鍵ベースの認証を使ってsshをリスポーンする小さなC言語のプログラムです

吊りはよくわからんが、タイムアウトでトンネルが死んだことがある

レスポ用のコードを提供したいのですが、今は見つからないようです

1  baumgart  2009-09-08


autossh のようなツールは ssh セッションを再起動するのに役立ちますが、私が本当に便利だと思うのは ‘screen’ コマンドを実行することです。これを実行すると、接続を切断した後でも ssh セッションを再開することができます。接続の信頼性が低い場合には特に便利です

…それはあなたを助ける場合は、これが「正解」であることをマークすることを忘れないでくださいk! 😉

1  koss  2009-09-08


ちょっとしたハックですが、これをキープするために画面を使うのが好きです。現在、リモートフォワードが何週間も続いています

例:ローカルでのスタート

screen
ssh -R ......

リモートフォワードが適用されていて、リモートコンピュータ上にシェルがある場合

screen
Ctrl + a + d

これで途切れないリモートフォワードができました。コツは両端で画面を実行することです

1  landypro  2012-03-13


最近、この問題が発生しました。これらのソリューションでは、パスワードログインを使用する場合、毎回パスワードを再入力する必要があるため、バッチファイルにパスワードを入れないように、テキストプロンプトと一緒にsshpassをループで使用しました

誰もが同じ問題を抱えている場合に備えて、私の解決策を共有したいと思いました

#!/bin/bash
read -s -p "Password: " pass
while true
do
sshpass -p "$pass" ssh user@address -p port
sleep 1
done

1  Andy C  2015-07-30


私は以前使っていたISPで同じような問題を抱えていました。私にとっては、TCP接続でも、ウェブサイトを訪問したり、メールを送信したりしても同じでした

解決策は、UDP上でVPN接続を設定することでした(私はOpenVPNを使用していました)。この接続は、切断の原因が何であれ、より耐性がありました。そして、この接続を介してあらゆるサービスを実行することができます

接続にはまだ問題があるかもしれませんが、トンネルはより寛容になるので、どのような ssh セッションでも切断されるのではなく、短いホールドアップを感じるようになります

これを行うには、自分のサーバーで設定できるオンラインVPNサービスが必要になります

0  hultqvist  2009-09-28


autosshではニーズを満たしていないので(最初の試みでサーバに接続できないとエラーで存在する)、純粋なbashアプリケーションを書きました。https://github.com/aktos-io/link-with-server

これは、デフォルトではサーバ上のノードのsshdポート(22)のための逆トンネルを作成します。他のアクション(追加ポートの転送、接続時のメール送信など)を行う必要がある場合は、スクリプトをon-connecton-disconnectのフォルダに配置することができます

0  ceremcem  2017-07-15


リモートサーバ上で tmux コマンドを使うことができます。これにより、リモートマシン上で “セッション” を開き、リモートコードを実行することができます

そうすれば、あなたのコードはtmuxセッションで安全に実行されているので、心配することなくリモートマシンを終了することができます(あなたの場合は接続を失うこともあります)

最後に、リモートサーバで再接続するときは、tmux attachで以前開いていたセッションに戻ればいいだけです

0  Mat A  2020-02-20


タイトルとURLをコピーしました