基本的に怠Diary

主に日常と作ったものを書いていく。

SSH + WireGuard + カフェWiFiで謎のエラーと格闘した話

問題発生

ド◯ールでコーヒー飲みながら作業しようとしたら、いつもの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

接続できた

原因の考察

何が起きてたのか

  1. mlkem768x25519は通常のKEXアルゴリズムより大きなパケット(1KB超)を生成
  2. WireGuardのMTU(デフォルト1420バイト)がさらに利用可能なサイズを制限
  3. ドト◯ルのWiFi環境での追加的な制限
  4. ProxyJump経由だと断片化したパケットの再構成に失敗
  5. 結果、鍵交換が完了できずタイムアウト

恒久的な対処

毎回オプション指定するのは面倒なので、~/.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多段接続みたいな複雑な環境では、パケットサイズに要注意

◯トール基、カフェなんかで仕事はしないので

趣味レベルなら量子コンピュータに破られるリスクは許容できるためこの対処で問題なし。

参考

  • OpenSSHの量子耐性アルゴリズム(PQC)対応は2024年から本格化
  • WireGuardのデフォルトMTUは1420バイト(通常のEthernetは1500バイト)
  • SSHのProxyJumpは-Jオプション(OpenSSH 7.3以降)