トラフィックは保護され、トンネルは上がっている。そして次の鍵更新で死ぬ。XFRM インターフェース経由のデフォルトルートは、保護したいトラフィックを記述していた。それは保護を続けるのに必要なパケットまで飲み込んだ。

関係する二つの宛先は交換可能ではない。ルーティングはそれを明示しなければならない。

ピアの検索は実際どこへ行くのか

有効なルール、XFRM ルートを持つテーブル、ピアの公開アドレスを記録する。次に、外側の接続が実際の送信元とマークでたどる経路を見る。一般的な宛先では、その制御経路について何も分からない。実際の送信元とマークだけが有用な答えを与える。

最初の接続が成功しても、ほとんど証明にならない。障害は、ルートのインストールが答えを変えた後に現れることが多い。起動は成功し、その後の最初の更新が失敗する。

ip rule show
ip route show table 220
ip -4 route get 198.51.100.44 from 10.40.0.2
ip xfrm policy list

ピアの検索が XFRM インターフェースに解決されるなら、外側のパケットは自分たちが作るトンネルにルーティングされている。それがループであり、一つのコマンドで見える。

現代のゲートウェイでの除外オプション

strongSwan の ルートベース VPN に関するドキュメント は二つの実用的な答えを示している。一つは IKE と ESP にマークを付け、XFRM テーブルを指すルールに一致させない。もう一つはピアへのルートや除外を残し、検索がそこに届くようにする。

副作用なしにルールセットで表現できる方を選ぶ。スタックの残りがすでにマークを使っているなら、マークはきれいだ。同じマスクが別のルールで別の意味を持つなら危険だ。どちらのパケット種別も、いずれにせよこの扱いが必要になる。

IKE だけにマークを付けると、データパケットは取り込まれた経路に残る。ハンドシェイクだけして何も運ばないトンネルができる。

マークは、ゲートウェイ上で他に誰も要求していないパケットの fwmark の単一ビットだ。0x1 とマスク 0x1 が通常の選択で、除外を機能させるには二か所で設定する必要がある。Charon は IKE ソケットでそれを必要とし、子接続の受信と送信のマーク設定にも同じ値が必要で、カプセル化されたパケットもマークされて出ていく。マスクを 0xffffffff ではなく 0x1 にすると残りのビットが自由になり、同じホストで別のサブシステムがすでにパケットにマークを付けている場合に重要になる。両方を設定すると、ルールは除外として書かれ、マークされたパケットは XFRM ルートを持つテーブルを飛ばしてメインテーブルに落ちる:

ip rule add not fwmark 0x1/0x1 lookup 220 pref 1000
ip -4 route get 198.51.100.44 from 10.40.0.2 mark 0x1

次に、マークを適用した状態で答えを読む。それがなければ、保護されたトラフィックがたどる経路を調べることになり、この節の問いの逆になる。

自動インストールがビルドについて何を前提にするか

XFRM インターフェースの自動ルートインストール は strongSwan のバージョンとその設定に依存する。インターフェース ID、インストールされたポリシー、アソシエーションのすべてが意図したオブジェクトを指す必要がある。不一致は、実際のどこかを静かに指すルートとして現れる。

別のゲートウェイからテーブル番号やマークマスクをコピーすることが衝突の始まりだ。まず何がすでにそれを使っているかを確認する。衝突は変更しようとしたトンネルのはるか先のトラフィックに影響し、症状がコピーを指すことはほとんどない。

ピアアドレスの変更は設計に含める。昨日のアドレスへのホストルートはエンドポイント復旧の計画ではないが、マークはその変更を生き延びる。

最初の更新を監視する

保護されたルートがインストールされた後に外側の経路を確認する。その前ではない。次に、次の更新とアプリケーションのやり取りを一つ監視する。障害は通常、起動時ではなくその切り替わりで現れる。

ip -4 route get 198.51.100.44
sudo swanctl --list-sas
sudo tcpdump -ni any 'udp port 500 or esp'

保護されたデフォルトを一時的に外すと、たいてい接続は戻る。その結果は診断であって、最終的なものではない。

目標は、内側のトラフィックとそれを運ぶ外側のパケットの安定した分離だ。選んだ仕組みとそのテーブルまたはマークをゲートウェイのメモに書く。そうしなければ、ルールに触る次の人がループを再び持ち込む。

関連記事