nmtysh.log

Tech系のネタや日々の独り言などを書いています。

IPQoSの設定を変えたらDS-Lite接続でもSSHができるようになった

最近、自宅のネット環境のIPv4接続をPPPoEからDS-LiteIPv4 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/configIPQoS none を追加します。

$ ssh -o IPQoS=none user@host

または

# ~/.ssh/config

Host *
    IPQoS none

いくつかサイトを見た感じでは IPQoS の値は none 以外に 0 などでも良さそうです。
none はOSのデフォルト値を使うということなので、OS側のデフォルト値が変わった場合は接続できないということが再発するかも。
回線側で許容されているプロトコルと優先度の組み合わせが分からないのでなんともいえませんが、OSのデフォルト値が変わった場合は他の通信にも影響が出そうな気がします。

参考サイト