VPNなしでGitが止まる?OpenSSHがIPQoSでパケットに印を付ける
OpenSSHは既定でパケットにQoS値を付けます。経路がその印を捨てると、トンネルがパケットの経路を変えるまでpushが止まります。
社内からのクローンは動き、同じクローンをテザリング経由で行っても動き、同じクローンをホテルのネットワークから行うとVPNを入れるまで止まる。SSHのハンドシェイクは終わり、最初の実転送でセッションが黙り込む。クライアント設定に一行足せばgitとsshが同時に治る。一つのクライアント設定が複数の道具を一度に直すとき、不具合はクライアントが送る内容にあり、送る回線にはない。
症状は経路の違いとして読む
問題を治すトンネルはめったに修理ではない。経路、キャリア、中間装置を入れ替えるだけで、ノートPCはまったく同じパケットを作り続けている。ある経路がヘッダを誤って扱い、別の経路がそのまま通すなら、違いは中間装置のポリシーにあり、クライアントにはない。ここでトンネルは証人であって、解決策ではない。
セッションが死ぬ地点で、さらに絞れる。名前解決や鍵交換で失敗するものは、こうは見えない。認証し、バナーを出し、その後の最初の大きな書き込みで固まるセッションは、経路、名前、資格情報がすべて動いていることをすでに示している。
クライアントはすべてのSSHソケットにQoSバイトを刻む
7.8以降のOpenSSH接続はどれも、ルータが通信の優先度付けに使える値をIPヘッダに載せており、端末のセッションにはある値、一括コピーには別の値が付く。人が打つ作業はファイル転送よりよい扱いを受けるべきだ、という理屈である。ほとんどのネットワークはこのヒントを完全に無視するので、何年も気づかれない。一部のWi-Fiドライバ、携帯キャリア、VPN装置だけがこれに反応し、その一部は悪い形で反応する。
その値が通信の途中で書き換えられたり捨てられたりしても、接続は失敗せず、前に進まなくなる。再送が増え、ウィンドウが崩れ、エラーを出したものがないのでアプリは何も報告しない。人々がこの症状を障害ではなく停止と呼ぶのは、その沈黙のためである。
まず ssh -V でクライアントのビルドを確認する。7.8以上ならこの挙動を既定で持つ。
これをMTUとDNSから切り分ける三つのコマンド
設定ファイルを編集する前に、似た二つの原因を除外しておきたい。MTUの不具合は小さなやり取りを通し、最初の大きなパケットで固まる一方、名前の不具合はセッションをそもそも作らない。
ssh -o IPQoS=none -v [email protected]
ssh -G [email protected] | grep -i ipqos
sudo tcpdump -ni any -vv "tcp port 22"
一つ目のコマンドは印を切った状態で失敗する操作を繰り返し、これが成功すれば手に入る中で最も強い単独の証拠になる。二つ目はクライアントがその宛先に実際に適用する設定を出力するので、忘れていたファイルの古い記述を捕まえられる。三つ目は転送が止まっている間のTOSバイトを両方向で示し、興味深いのは壊れた経路には値があり、動く経路にはないという形である。
取得はサーバではなくノートPCで行う(値を決めるのは送信側であり、どちらの方向でも変わりうるからだ)。動く経路と失敗する経路を同じ取得で比べれば、当て推量なしに違いが出る。
例外は一つのファイルに、一ホストずつ書く
例外は適用先のホストのそばに置き、なぜ存在するのかをコメントに書く。
Host gitlab.example.internal
IPQoS none
# direct route rewrites the marking; the tunnel route passes it
値そのものより範囲が重要だ。ワイルドカードの記述はどこでも挙動を切り、行儀のよいネットワークで役立つヒントを捨て、いつ現れたのかを誰にも言えなくする。ホストごとの記述は読めて、戻せて、ネットワークが直れば消すのは簡単だ。個人的な回避策にはユーザーファイルを、全社的に同じ例外が要るときは管理ファイルを使う。
例外が何を覆わないかをはっきりさせる。対象はSSHなので、HTTPSのリモート、パッケージミラー、ブラウザはすべて外にあり、どれかが失敗したらそれぞれの証拠が要る。踏み台を経る連鎖ではどのホップもクライアント設定を使うので、止まるホップこそ範囲を絞る価値がある。
ネットワークの所有者と輪を閉じる
発見は四つの事実として渡す:クライアントの版、試した経路、使っているVPNクライアント、印を運んだ方向。この四つがあれば、ネットワークの所有者は扱いを再現し、意図的かどうかを決められる。
例外が停止を治さないなら、外す。失敗した実験を生き延びた回避策は言い伝えになり、次の人が一時間かけて何の効果もないことを証明する。治るなら、その経路はそこを通る他のあらゆる道具にとって依然として間違っており、修理は中間装置を運用する者の仕事である。
クライアント側の変更は期限付きの応急処置だ。その期限をコメントに書く。