問題発生
ド◯ールでコーヒー飲みながら作業しようとしたら、いつものSSH接続でわけわからんエラーが出た。
ssh -J hohoge xxxx Connection closed by UNKNOWN port 65535
は?port 65535って何だよ。
ちなみに踏み台のhohogeには普通に接続できる。この問題、ドトールのWiFi + WireGuard VPNの組み合わせでのみ発生する。家では普通に動く。意味がわからん。
デバッグしてみる
とりあえず詳細ログを見る。
ssh -vvv -J hohoge xxxx
出力の最後の方
debug1: kex: algorithm: mlkem768x25519-sha256 debug1: kex: host key algorithm: ssh-ed25519 debug1: kex: server->client cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none debug1: kex: client->server cipher: chacha20-poly1305@openssh.com MAC: <implicit> compression: none debug3: send packet: type 30 debug1: expecting SSH2_MSG_KEX_ECDH_REPLY Connection to UNKNOWN port 65535 timed out
鍵交換(KEX)の途中でタイムアウトしてる。mlkem768x25519-sha256
って見慣れないアルゴリズムが使われてる。
解決方法
調べたら、これ量子耐性アルゴリズムらしい。最新のOpenSSHで導入されたやつ。パケットサイズがデカいのが問題っぽい。
試しに量子耐性アルゴリズムを無効化してみる
ssh -J hohoge -o "KexAlgorithms=-mlkem768x25519-sha256,-sntrup761x25519-sha512" xxxx
接続できた
原因の考察
何が起きてたのか
- mlkem768x25519は通常のKEXアルゴリズムより大きなパケット(1KB超)を生成
- WireGuardのMTU(デフォルト1420バイト)がさらに利用可能なサイズを制限
- ドト◯ルのWiFi環境での追加的な制限
- ProxyJump経由だと断片化したパケットの再構成に失敗
- 結果、鍵交換が完了できずタイムアウト
恒久的な対処
毎回オプション指定するのは面倒なので、~/.ssh/config
に設定を追加:
Host xxxx ProxyJump hohoge KexAlgorithms -mlkem768x25519-sha256,-sntrup761x25519-sha512
まあ今のところド◯ールでしか発生してない問題なので、私はコピペで対応する予定。
別解:WireGuardのMTU調整
/etc/wireguard/wg0.conf
でMTUを小さくする方法もあるかもしれない(試してない)。
[Interface] MTU = 1280
ただし、これは全体的なパフォーマンスに影響するので、SSH設定で対処する方が良さそう。
まとめ
- 最新技術(量子耐性暗号)がレガシー環境と相性悪い典型例
- エラーメッセージの
port 65535
は本質的な問題じゃなかった - カフェWiFi + VPN + SSH多段接続みたいな複雑な環境では、パケットサイズに要注意
◯トール基、カフェなんかで仕事はしないので
趣味レベルなら量子コンピュータに破られるリスクは許容できるためこの対処で問題なし。