一部のネットワークからUbuntuへのキーの交換に成功した後、SSH接続を完了できない

一部のネットワークからUbuntuへのキーの交換に成功した後、SSH接続を完了できない

ある国から別の国へ飛行機で移動した後、Digital Ocean Ubuntu サーバーのいくつかに ssh できなくなりました。ただし、コンソール経由でログインし、あるボックスから別のボックスへ ssh することはできます (それらはすべて同じ物理データ センター内にあります)。

-vvvv を指定して ssh を実行し、time コマンドを実行すると、最後のデバッグ メッセージは次のようになります。

debug2: channel 0: open confirm rwindow 0 rmax 32768
Write failed: Broken pipe

1分37秒後にタイムアウトします。

以下は、SSH キー認証が成功した時点のデバッグ ログです。

debug1: Authentication succeeded (publickey).
Authenticated to 128.199.170.168 ([128.199.170.168]:22).
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug3: packet_set_tos: set IP_TOS 0x10
debug2: client_session2_setup: id 0
debug2: channel 0: request pty-req confirm 1
debug1: Sending environment.
debug3: Ignored env TERM_PROGRAM
debug3: Ignored env SHELL
debug3: Ignored env TERM
debug3: Ignored env TMPDIR
debug3: Ignored env Apple_PubSub_Socket_Render
debug3: Ignored env TERM_PROGRAM_VERSION
debug3: Ignored env TERM_SESSION_ID
debug3: Ignored env USER
debug3: Ignored env SSH_AUTH_SOCK
debug3: Ignored env __CF_USER_TEXT_ENCODING
debug3: Ignored env PATH
debug3: Ignored env MARKPATH
debug3: Ignored env PWD
debug1: Sending env LANG = en_US.UTF-8
debug2: channel 0: request env confirm 0
debug3: Ignored env XPC_FLAGS
debug3: Ignored env PS1
debug3: Ignored env XPC_SERVICE_NAME
debug3: Ignored env SHLVL
debug3: Ignored env HOME
debug3: Ignored env GREP_OPTIONS
debug3: Ignored env LOGNAME
debug3: Ignored env SCALA_HOME
debug3: Ignored env SECURITYSESSIONID
debug3: Ignored env _
debug2: channel 0: request shell confirm 1
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
Write failed: Broken pipe

接続は特に遅くはなく、シェルは bash です (コンソールや他のネットワーク ssh 経由でログインできます)。公開キー認証が行われていることから、ssh 接続をブロックするものは何もないようです。

どのパイプに書き込まれているのかがわかりません。OSX から接続していますが、米国に飛ぶまでは問題はありませんでした。


auth.logログインしようとすると、次の画面が表示されます。

May 17 12:28:01 db1 CRON[24931]: pam_unix(cron:session): session opened for user root by (uid=0)
May 17 12:28:01 db1 CRON[24931]: pam_unix(cron:session): session closed for user root
May 17 12:28:02 db1 sshd[24955]: error: Could not load host key: /etc/ssh/ssh_host_ed25519_key
May 17 12:28:04 db1 sshd[24955]: Accepted publickey for tomo from 24.210.28.151 port 63202 ssh2: DSA 3a:[redacted]
May 17 12:28:04 db1 sshd[24955]: pam_unix(sshd:session): session opened for user tomo by (uid=0)

接続試行中のポート 22 トラフィックの Tcpdump キャプチャ:

    $ sudo tcpdump -i en0 port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:00:40.917870 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [S], seq 3430788632, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1286503697 ecr 0,sackOK,eol], length 0
19:00:41.211348 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [S.], seq 4135716624, ack 3430788633, win 28960, options [mss 1460,sackOK,TS val 898678531 ecr 1286503697,nop,wscale 8], length 0
19:00:41.211415 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 1, win 4117, options [nop,nop,TS val 1286503989 ecr 898678531], length 0
19:00:41.215051 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1:22, ack 1, win 4117, options [nop,nop,TS val 1286503992 ecr 898678531], length 21
19:00:41.484824 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [.], ack 22, win 114, options [nop,nop,TS val 898678606 ecr 1286503992], length 0
19:00:41.488532 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 1:42, ack 22, win 114, options [nop,nop,TS val 898678609 ecr 1286503992], length 41
19:00:41.488616 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 42, win 4116, options [nop,nop,TS val 1286504260 ecr 898678609], length 0
19:00:41.490182 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], seq 22:1470, ack 42, win 4116, options [nop,nop,TS val 1286504261 ecr 898678609], length 1448
19:00:41.490183 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1470:1614, ack 42, win 4116, options [nop,nop,TS val 1286504261 ecr 898678609], length 144
19:00:41.491254 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [.], seq 42:1490, ack 22, win 114, options [nop,nop,TS val 898678609 ecr 1286503992], length 1448
19:00:41.592287 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 1490, win 4096, options [nop,nop,TS val 1286504362 ecr 898678609], length 0
19:00:41.760341 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 1490:1674, ack 22, win 114, options [nop,nop,TS val 898678676 ecr 1286504260], length 184
19:00:41.760401 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 1674, win 4090, options [nop,nop,TS val 1286504527 ecr 898678676], length 0
19:00:41.762375 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [.], ack 1614, win 136, options [nop,nop,TS val 898678676 ecr 1286504261], length 0
19:00:41.762409 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1614:1638, ack 1674, win 4096, options [nop,nop,TS val 1286504529 ecr 898678676], length 24
19:00:42.027042 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 1674:1826, ack 1638, win 136, options [nop,nop,TS val 898678743 ecr 1286504529], length 152
19:00:42.027103 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 1826, win 4091, options [nop,nop,TS val 1286504789 ecr 898678743], length 0
19:00:42.028104 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1638:1782, ack 1826, win 4096, options [nop,nop,TS val 1286504790 ecr 898678743], length 144
19:00:42.300304 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 1826:2546, ack 1782, win 148, options [nop,nop,TS val 898678812 ecr 1286504790], length 720
19:00:42.300357 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 2546, win 4073, options [nop,nop,TS val 1286505053 ecr 898678812], length 0
19:00:42.302441 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1782:1798, ack 2546, win 4096, options [nop,nop,TS val 1286505055 ecr 898678812], length 16
19:00:42.600776 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [.], ack 1798, win 148, options [nop,nop,TS val 898678888 ecr 1286505055], length 0
19:00:42.600843 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1798:1850, ack 2546, win 4096, options [nop,nop,TS val 1286505349 ecr 898678888], length 52
19:00:42.857852 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [.], ack 1850, win 148, options [nop,nop,TS val 898678952 ecr 1286505349], length 0
19:00:42.858552 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 2546:2598, ack 1850, win 148, options [nop,nop,TS val 898678952 ecr 1286505349], length 52
19:00:42.858584 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 2598, win 4094, options [nop,nop,TS val 1286505604 ecr 898678952], length 0
19:00:42.859131 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1850:1918, ack 2598, win 4096, options [nop,nop,TS val 1286505605 ecr 898678952], length 68
19:00:43.124310 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 2598:2650, ack 1918, win 148, options [nop,nop,TS val 898679019 ecr 1286505605], length 52
19:00:43.124374 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 2650, win 4094, options [nop,nop,TS val 1286505867 ecr 898679019], length 0
19:00:43.124473 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 1918:2434, ack 2650, win 4096, options [nop,nop,TS val 1286505867 ecr 898679019], length 516
19:00:43.394690 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 2650:2702, ack 2434, win 159, options [nop,nop,TS val 898679086 ecr 1286505867], length 52
19:00:43.394774 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 2702, win 4094, options [nop,nop,TS val 1286506134 ecr 898679086], length 0
19:01:04.685580 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2434:2582, ack 2702, win 4096, options [nop,nop,TS val 1286527239 ecr 898679086], length 148
19:01:04.966270 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 2702:2738, ack 2582, win 170, options [nop,nop,TS val 898684479 ecr 1286527239], length 36
19:01:04.966378 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 2738, win 4094, options [nop,nop,TS val 1286527514 ecr 898684479], length 0
19:01:04.967018 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2582:2702, ack 2738, win 4096, options [nop,nop,TS val 1286527514 ecr 898684479], length 120
19:01:05.269214 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [.], ack 2702, win 170, options [nop,nop,TS val 898684555 ecr 1286527514], length 0
19:01:06.027067 IP [redacted_ip].ssh > 192.168.1.2.50409: Flags [P.], seq 2738:2790, ack 2702, win 170, options [nop,nop,TS val 898684744 ecr 1286527514], length 52
19:01:06.027144 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [.], ack 2790, win 4094, options [nop,nop,TS val 1286528563 ecr 898684744], length 0
19:01:06.027497 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286528563 ecr 898684744], length 460
19:01:06.603432 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286529135 ecr 898684744], length 460
19:01:07.552730 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286530077 ecr 898684744], length 460
19:01:09.250116 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286531762 ecr 898684744], length 460
19:01:12.442790 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286534930 ecr 898684744], length 460
19:01:18.634929 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286541067 ecr 898684744], length 460
19:01:24.068621 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286546451 ecr 898684744], length 460
19:01:34.714519 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286557019 ecr 898684744], length 460
19:01:45.384050 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286567587 ecr 898684744], length 460
19:01:56.051835 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286578155 ecr 898684744], length 460
19:02:06.715163 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286588723 ecr 898684744], length 460
19:02:17.355823 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286599291 ecr 898684744], length 460
19:02:28.042962 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [P.], seq 2702:3162, ack 2790, win 4096, options [nop,nop,TS val 1286609859 ecr 898684744], length 460
19:02:38.690971 IP 192.168.1.2.50409 > [redacted_ip].ssh: Flags [R.], seq 3162, ack 2790, win 4096, length 0

私が試した他のいくつかのこと:

  • サーバーの MTU を減らすと、pmtu に失敗する可能性があります: sudo ip link set mtu 1280 dev eth0
  • OS XでWiFiインターフェースのMTUを1280に減らす
  • ServerAliveInterval をさらに下げて 30 にすると、接続はタイムアウトしますが、パイプが壊れることはありません。
  • 「bash」の代わりに「cat」でsshを実行、またはプロファイル/rcがロードされていないbashを実行
  • OS X の Wi-Fi インターフェイスの IP アドレスを DHCP の代わりに手動で設定する

答え1

パケット トレースを見ると、フローの早い段階で最大サイズのパケットが両方向に交換されていることがわかります。これによって問題は発生していないため、MTU の問題を示唆するものは何もありません。

その後、接続中に、相対シーケンス番号 2702:3162 を持つクライアントからサーバーへのパケットがサーバーから ACK を受信しないことがわかります。

私がすぐに考えたのは、このパケット損失はミドルボックス(NAT、ファイアウォールなど)の障害によって発生したという点です。

TCP 接続中に TOS の変更を処理できない NAT ボックスについて聞いたことがあります。あなたのケースでは、クライアントが TOS が変更されたことを示すと問題が発生します。ただし、tcpdump は TOS を表示しないため、それが問題が発生する正確なポイントであるかどうかは断言できません。

テストでは、-o ProxyCommand='nc %h %p'ssh クライアントが TCP 接続を直接制御しないように を使用できます。IPQoSオプションも試すことができます。TOS の変更が問題である場合、 または を指定すると-o IPQoS=cs0機能-o IPQoS=0しますが、他の設定は失敗します。これは、ssh が認証中に 0 を QoS として使用し、認証後に選択した QoS に切り替えるためです。QoS を 0 に選択すると、QoS 値が変更されず、ミドルボックスが混乱することはありません。

答え2

1.4.0 0.8.0 v0050.0 Build 160518 Rel.50944n他にもこの問題に遭遇した人がいるかもしれないので、TP-Link Archer VR2600 ルーター/モデム (ファームウェア付き)でも同様の問題が発生しました。

@kasperd の提案に従ってを実行すると-o IPQoS=0、ルーターの QoS に何らかの問題があることが示唆されました。ルーターの設定で最も近いものを有効にしました (高度な帯域幅制御この場合、ルータが関連するフラグに注意を払い始める可能性があるという前提で、最大帯域幅を自分の回線で利用可能な帯域幅よりわずかに低く設定します。

これはうまくいったようで、接続が確立されました。このオプションを切り替えることで、接続できるかどうかを確実に制御できます。

答え3

ユーザーの ssh 設定 (~/.ssh/config) はありますか?

そうでない場合は作成し、次の行を追加してみてください。

ServerAliveInterval 120 #ping the server every 120s
TCPKeepAlive no #do not set SO_KEEPALIVE on socket

答え4

残念ながら、私はここでの評判が足りず、上記の Sam Mason の回答に投票したりコメントしたりできませんが、彼の発言に公に +1 したいと思います。私も VR2600 を持っていますが、同じ経験をしました。

  1. 接続(ssh、sftpなど)は確立されるが、その後ハングアップするように見える
  2. tshark は TCP の不正な再送信を表示します
  3. クライアント側から -o IPQoS=0 を(単独で)設定しても何も起こりませんでした
  4. 有効化ルーターの「詳細設定」->「帯域幅制御」設定(以前は無効)を可能な限り最大限(実質的に無制限)に設定すると、ルーターがIPQoSフラグに注意を払うように修正されるようです。
  5. tshark は TCP スプリアス再送信を表示しなくなり、接続がハングしなくなりました (ssh、sftp などのクライアントが VR2600 ルーターの背後にあるサーバーで機能するようになりました)。

これは、VR2600 ルーターに重大なバグがあることを示唆しているようです。残念ながら (執筆時点では)、私は最新のファームウェア (1.4.0 0.8.0 v0050.0 Build 160518 Rel.50944n、Sam と同じ) を使用しており、このルーターは DD-WRT と互換性がなく、テストもされていないようです。

しかし、上で議論したことに加えて、私は次のようにも言います。

  1. 手順 1 から 5 を実行すると、「-o IPQoS=0」を指定しなくても正常に接続できるようになりました。

言い換えると:

ルーター オプションの [詳細設定] -> [帯域幅制御] オプションをオンにするだけで (上限を最大に設定しても)、このルーター NAT が期待どおりに動作するようになります。帯域幅制御が無効になっていると、OP で説明されている問題 (@malasa によって詳細に説明されている) が発生します。

解決策がこのオプションを有効にするだけなのか、または少なくとも一度は-oオプションを使用して接続する必要があるのか​​は不明です。いずれにせよ、このオプションを有効にした後、無効にする「詳細設定」->「帯域幅制御」オプションをオフにすると、ssh/sftpなどが以前と同じように機能しなくなります。有効にする詳細設定 > 帯域幅制御オプションを有効にすると、すべてが再び期待どおりに動作するようになります。また、(このオプションを有効にすると) ルーターを再起動してもすべてが正常に動作するようになります。

したがって、私の観点からすると、クライアント側の変更やメンテナンスを必要としない、かなり優れた回避策/修正です(@leonardoborges の懸念に答えるため)。

関連情報