ハンドシェイクは生きているのにアドレスが消えた:WireGuard の三つの状態
新しいハンドシェイクはピアが応答したことの証拠であり、インターフェースがアドレスを保っていることや、次のパケットが意図した上流リンクを通ることを示すものではない。
WireGuard は新しいハンドシェイクを保ちながら、同時にアドレスを持たないことがあり、その状態は矛盾ではなく整合している。ハンドシェイクはピアの出来事であり、アドレスはインターフェースに属し、ルートがパケットの出る上流リンクを決める。三つの層、三つの所有者があり、他の二つが健全に見えても、それぞれが壊れうる。
これらを一つのステータスとして読むことが、二分で終わる診断を、サービスの再起動で午後いっぱいをつぶすことになる。
ハンドシェイクはピアの出来事であり、アドレスの出来事ではない
WireGuard のハンドシェイクは、設定されたピアが有効な鍵で応答したことと、セッション鍵が最新であることを証明する。インターフェース上のローカルアドレスについては何も語らず、そこへ向かうルートがあるかどうかも語らない。アドレスを割り当てるのはヘルパーやネットワークマネージャーであり、プロトコルの設定はピアと鍵の名前を挙げるだけである。この二つを混同することが、健全なハンドシェイクを動作するトンネルと読み違える原因になる。
だからこそ wg show は、アプリケーションから一つのパケットも受け取れないインターフェースでも、数秒前のハンドシェイクを報告できる。
インターフェースを作り直すマネージャーは、ピアの設定に触れずにアドレスを落とすことがあり、鍵が変わっていないため次のハンドシェイクは即座に成功する。ハンドシェイク成功に関するログ行は正確であり、障害とは無関係である。
| Observation | Which layer it belongs to | Wrong conclusion it invites |
|---|---|---|
| Handshake a few seconds old | Peer and keys | The tunnel is usable for application traffic |
Address present on wg0 | Interface configuration | Traffic actually egresses through it |
Route points at wg0 | Forwarding table | The outer packet uses the intended uplink |
インターフェースのアドレスには専用の所有者がいる
トンネルデバイスのアドレスは、ヘルパーの Address 行から来ることも、インターフェース上で動く DHCP クライアントから来ることも、接続時にそれを作る管理デーモンから来ることもある。いずれにせよ、その構成要素がアドレスを所有し、自らの論理に従って復元するかしないかを決める。所有者を名指しせずにアドレスを読むと、なぜ消えたのかを説明できなくなる。
一つのインターフェースに二人の所有者がいるのが典型的な故障である。同じデバイスの上でヘルパーとデスクトップのネットワークマネージャーを起動すると、一方が他方の設定したばかりのものを消す競合が生まれ、その間もエンドポイントは応答し続ける。
所有者を一人に決め、もう一方のツールには管理ではなく観察をさせる。症状は数週間後に現れてランダムなアドレス喪失のように見えるのだから、この判断は書き残す価値がある。
上流リンクを選ぶのはルートであり、インターフェースではない
wg0 を指す内部ルートは トンネルに入るトラフィック を決める。別の判断が暗号化された外側のパケットをピアへ送り、上流リンクが複数あるホストではその判断は転送テーブルとポリシールールから来る。Wi-Fi のローミングは内部アドレスに触れずに外側の経路を変えうる。
つまり、動作するトンネルと到達できないピアは両立する状態であり、正しいピアと壊れた内部ルートも同じである。三つの観測は同じ瞬間にまとめて取らなければならず、そうでなければ比較は無意味になる。
三つの状態を一度に突き合わせる
読み取り専用の三つのコマンドが、障害を最も早く切り分ける順序で三つの問いに答える。その間は何も変えずに実行する。
ip address show dev wg0
ip route get 10.80.0.1
wg show wg0 latest-handshakes transfer
一つ目はインターフェースがアドレスを持つかどうかを示し、二つ目は特定の宛先が今どのデバイスを使うかを示す。三つ目は最後のハンドシェイク時刻とバイトカウンターを報告し、三つの中でピアを記述する唯一のものである。
タイムスタンプだけでなくカウンターも読む。転送が横ばいのままハンドシェイクだけが更新され続けるなら、ピアは応答しているが有用なものは通っていないということであり、鍵ではなくルーティングか ACL を指す。アドレスがあるのにタイムスタンプが進まなくなるなら、逆に上流を指す。どちらの読みも同じ出力行から得られ、ハンドシェイクの有無だけを確かめていてはどちらも見えない。
間違っている特定の状態を直し、そのうえでトンネルではなくアプリケーションを再試験する。新しいハンドシェイクはピアについての証拠であり、ピアについての証拠は、ブラウザからの次の要求がアドレスとルートと動作する上流リンクを見つけるという証拠ではない。wg-quick のマニュアル は、そのうちどれをヘルパーが設定し、どれがプロトコルに属するかを明示している。