最近、自宅のネット環境のIPv4接続をPPPoEからDS-LiteのIPv4 over IPv6に切り替えました。
とある日、インターネット上のサーバーにSSH接続しようとしたら、ログインが終わらず、しばらくするとエラーメッセージが出力されてコマンドが終了するようになってしまいました。
調べてみたら、どうやらパケットの優先度(DSCP値)の問題らしく、優先度設定をSSHのデフォルト値から変更したらSSHできるようになりました。
環境
現象
PPPoE接続の時には問題なくSSHできたサーバーに対して、DS-Lite接続でSSHできなくなりました。
ssh
コマンドでサーバーへの接続に失敗します。
ssh -vvv
を実行するとこんな感じの出力で失敗しました。
(手元にログが残っていなくて、 参考サイト の記述を持ってきたので実際出ていたログとちょっと違っているかも)
$ ssh -vvv user@host (略) debug2: channel 0: open confirm rwindow 0 rmax 32768 (略) Write failed: Broken pipe (もしくは「Timeout, server xxx.xxx.xxx.xxx not responding.」こんなメッセージかも)
解決策
ssh
コマンドに -o IPQoS=none
をつけるか、 ~/.ssh/config
に IPQoS none
を追加します。
$ ssh -o IPQoS=none user@host
または
# ~/.ssh/config Host * IPQoS none
いくつかサイトを見た感じでは IPQoS
の値は none
以外に 0
などでも良さそうです。
none
はOSのデフォルト値を使うということなので、OS側のデフォルト値が変わった場合は接続できないということが再発するかも。
回線側で許容されているプロトコルと優先度の組み合わせが分からないのでなんともいえませんが、OSのデフォルト値が変わった場合は他の通信にも影響が出そうな気がします。
参考サイト
- Can't complete SSH connection after successfully exchanging keys to Ubuntu from some networks - Server Fault
- フレッツ回線 + IPv6 環境で SSH できない - Qiita
- macOSでSSH接続が失敗(client_loop: send disconnect: Broken pipe)する · としつーる
- QoS - DSCP(Differentiated Services Code Point)とは
- フレッツ光ネクスト + IPoE で scp, cvs, rsync の SSH通信ができない問題:tsutsuiの作業記録置き場 - ブロマガ