Rubyでは、Net :: SSH :: Proxyを介して確立されたSSH接続フローがありますclient -> proxy server -> server
(これはRubyの問題ではなくSSHの問題のようです)。接続が確立されると、接続が閉じられるまで、後続のコマンドがトンネルを介して送信されます。これは約99%の場合はうまく機能しますが、トンネルは無期限に開いたままになり、アクティブな接続があるときにサーバーを再起動することに関連しているようです。シナリオを手動で再現しようとすると(アクティブ接続中にサーバーを再起動する)、そうすることはできず、代わりにSSH接続が期待どおりに閉じます。
トンネルがこの不確実な開いた状態で停止している場合、で接続は確立され、client -> proxy server
接続proxy server
も確立されserver
続けます。しかし、server
確かにproxy server
再起動後に意味のある確立された接続を表示します。
各ホストから収集されたデータ:
クライアント(OpenSSHを使用):
ps -o cmd= -p 8029
ssh -o strictHostKeyChecking=no [email protected] -p 2022 -W [10.100.202.65]:22
TZ=UTC0 ps -o lstart= -p 8029
Mon Jul 8 21:17:09 2019
プロキシサーバー(OpenSSHを使用):
sudo netstat -tnpa | grep 'ESTABLISHED.*sshd' | grep 10.100.202.65
tcp 0 0 10.100.201.246:47414 10.100.202.65:22 ESTABLISHED 29135/sshd: user1
サーバー(Dropbearを使用)
netstat -tnpa | grep 'ESTABLISHED.*dropbear' | grep 10.100.202.65
<...no results...>
date; uptime
Tue Jul 9 18:56:49 UTC 2019
18:56:49 up 21:37, load average: 0.50, 0.56, 0.61
^ 接続が確立された後にサーバーが再起動されたことを確認し、server date - uptime
= および client コマンドが実行されていることに注意してください。Mon Jul 8 21:19 UTC
Mon Jul 8 21:17 UTC
私の最初の考えは、プロキシサーバーのsshdがTCPKeepAlive
無効になっているため、サーバーの切断を検出できないことでしたが、sshd_configで有効になっていることを確認しました。
TCPKeepAlive yes
また、プロキシサーバーでtcpdumpを実行しましたが、ターゲットサーバーで見た唯一のトラフィックは断続的に発生するARPでした。
sudo tcpdump -ni eth1 host 10.100.202.65
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:14:45.647479 ARP, Request who-has 10.100.0.2 (ff:ff:ff:ff:ff:ff) tell 10.100.202.65, length 46
11:14:45.660208 ARP, Request who-has 10.100.202.65 (ff:ff:ff:ff:ff:ff) tell 0.0.0.0, length 46
11:15:46.762554 ARP, Request who-has 10.100.0.2 (ff:ff:ff:ff:ff:ff) tell 10.100.202.65, length 46
11:15:46.782608 ARP, Request who-has 10.100.202.65 (ff:ff:ff:ff:ff:ff) tell 0.0.0.0, length 46
11:16:47.956901 ARP, Request who-has 10.100.0.2 (ff:ff:ff:ff:ff:ff) tell 10.100.202.65, length 46
11:16:47.974012 ARP, Request who-has 10.100.202.65 (ff:ff:ff:ff:ff:ff) tell 0.0.0.0, length 46
質問:SSH接続を開いたままにするのは何ですか?これを防ぐために使用できる他のSSHオプション(sshd設定またはコマンドラインパラメータ)はありますか?
編集する:私は問題を発見したと信じています。クライアントには、ssh_config
次のServerAlive *オプションが含まれています。
ServerAliveCountMax 3
ServerAliveInterval 60
これで3分後にアイドルセッションが終了します。このパスのproxy server
エントリは、に接続するクライアントとしても機能しますserver
。proxy server
これらのオプションは設定されていません。これでssh_config
上記の項目に追加しましたproxy server
。成功を報告するために別の編集を行います。