ハブにおけるWireGuardのピアグループ:送信元の所有権とポリシー
ピアごとに狭い送信元アドレスを使い、転送ポリシーと組み合わせてピアグループを分離します。グループごとに別のトンネルインターフェースは不要です。
WireGuardを動かすハブは、グループごとに別のインターフェースやルーティングテーブルを持たなくてもピアグループを分離できます。この仕事をする仕組みは二つあり、両者を混同することが、ポリシーが正しく見えるのに何も機能しないよくある原因です。一方の層は誰が送信元アドレスを主張できるかを決めます。もう一方は、そのパケットがどこへ向かえるかを決めます。
二つの仕事を分けて考える
トンネル層は狭い問いに答えます。このピアの鍵がこの内部送信元アドレスを認可したかどうかです。転送層はより広い問いに答えます。このパケットがその宛先へ出てよいかどうかです。どちらも相手の問いには答えておらず、どちらも単独では完全なアクセスポリシーになりません。
この分離があるため、ピアが認証され正しくアドレスを与えられていても、本来届くべきでないホストに届かないということが起こります。逆も説明できます。すべてを許可するファイアウォール規則は、誰がどのアドレスを主張できるかについて何も証明しません。
二つの層をまとめて設計し、そのうえで両方を試験します。片方の層で正しく、もう片方で未試験の設定は、既定値によって開いたまま、あるいは閉じたまま失敗します。
各ピアには自分のアドレスだけを与える
複数ホストのピアは、サーバ側でグループ全体の範囲を与えたくなります。その許可は送信元アドレスの主張なので、侵害された、あるいは設定を誤ったクライアントが範囲内の任意のアドレスを提示でき、トンネルはそれを受け入れます。各自の内部アドレスにはピアごとに/32を割り当てます。グループ範囲はクライアント側だけで設定します。そこでは、そのクライアントが到達できる宛先を表すのであって、使える送信元を表すのではありません。
そうすればファイアウォールは信頼できる送信元と照合できます。グループの範囲に対して書いた規則は有用なまとまりであり続け、どの単一のピアも他のメンバーのアドレスを主張できないときにだけ意味を持ちます。
グループを分ける転送ポリシーを書く
ここで扱う通信は同じトンネルインターフェースを出入りするため、ホストの入力経路ではなく転送経路を通ります。規則は、ホストを所有するファイアウォール管理機構の既存の転送チェーンに入れるものであり、完全な規則セットではなく断片です。
iifname "wg0" oifname "wg0" ip saddr 10.66.10.0/24 ip daddr 10.66.10.0/24 accept iifname "wg0" oifname "wg0" ip saddr 10.66.20.0/24 ip daddr 10.66.20.0/24 accept iifname "wg0" oifname "wg0" drop
最初の二つの規則は各グループ内の通信を許可します。最後の一つは、そのインターフェースを通るそれ以外のすべてを遮断し、これがグループ間の分離を生みます。もう一方のアドレスファミリが必要なら明示的な規則を追加してください。IPv4向けに書いたdropはIPv6の挙動を許可も記述もしません。
順序がポリシーを適用するかどうかを決める
規則の順序は断片そのものより重要です。確立済み接続を受け入れる汎用の規則がこれらの項目より前に置かれていると、古いグループ間フローが継続し、分離は新規接続にしか効きません。再読み込みの前に、どちらの結果を望むかを決めてください。
受け入れの判定も、同じフック上のチェーン間で常に最終とは限りません。別の基本チェーンが後から走るなら、実効ポリシーはその組み合わせなので、編集したファイルではなくカウンタを確認します。カウンタは入手できる最も安価な証拠です。パケット数のない規則は一致しておらず、一致しているのに後続のチェーンが受け入れている規則は、dropの位置が誤っていることを示します。
ファイル数ではなくマトリクスを試験する
期待する結果の小さなマトリクスを作り、すべてのセルを確認します。グループAからグループAは通るべきで、グループBからグループBも通るべきで、AからBは通るべきではありません。両方向で、対応するなら両方のアドレスファミリで確認します。
nft list ruleset wg show wg0 allowed-ips ping -c 2 10.66.10.5 conntrack -L -s 10.66.20.7 2>/dev/null | head
最初の二つは何が設定されているかを示します。誤ったグループのメンバーからのpingは実際に何が起きるかを示します。conntrackの一覧は古いフローがいまも受け入れられているかを示し、分離の変更が静かに効かないのはまさにこの形です。
ハブ上のホスト向けサービスと、その背後のLANへのアクセスは、別々のポリシーを持つ別々の経路です。マトリクスがどちらを覆うのかを記録してください。ピア間の通信だけを確認する試験は、どちらについても何も語りません。