DNS が流し込む nftables セットから WireGuard へ:受け渡しの仕組み
DNS の応答は nftables セットに流し込めますが、セットそのものは何もルーティングしません。誘導が機能するかを決める四つの受け渡しと三つの寿命を追います。
名前はアドレスに解決され、そのアドレスは後でルーティングに影響するファイアウォールのセットに入ることがあります。これにより、プロキシなしで 名前ベースの誘導 が可能になります。落とし穴は、四つの構成要素が正しく受け渡さなければならないことです。リゾルバ、セット、新しいフローを印付ける分類器、そしてそれを運ぶピアです。受け渡しごとに失敗の仕方が違い、それぞれが自分の時間を保ちます。
設計は設定ではなく連鎖として捉えてください。各段階の問いは、どの構成要素が判断を所有し、その入力が欠けたときに何が起きるかです。
DNS の応答にできることとできないこと
dnsmasq は応答からアドレスを取り出して nftables セットに写せますが、これは流し込みであってルーティングの判断ではありません。dnsmasq のマニュアル に記されているそのオプションは、アドレスファミリ、テーブル、セットを指定し、先頭の 4# は A レコードだけを選ぶため、v6 の宛先には別の仕掛けが要ります。セットはあらかじめ存在している必要があります。リゾルバはファイアウォールの所有者が作ったものに要素を足すだけだからです。この段階ではインターフェースもテーブルもピアも選びません。
クライアント側もそのリゾルバを名前解決に使わなければなりません。独自の暗号化 DNS を使うアプリや、方針ができる前のキャッシュ応答は、セットに項目を一つも作らずに接続します。
セットは入力であり、経路ではない
セットの要素は照合条件です。何かがそれを見て、このパケットが新しいフローを始めると判断し、フローをトンネルへ送る方針を適用する必要があります。Linux では通常、印を付けられるルーティング対応の出力経路、印の付いたパケットを専用テーブルへ送る規則、そのテーブルから WireGuard デバイスを指す経路が必要です。所属だけではどれも導入されません。
nft add set inet vpn_select office_v4 { type ipv4_addr\; }
ip rule add fwmark 0x40 table 200
ip route add default dev wg0 table 200
wg show wg0 allowed-ips
ピアは忘れられがちな二つ目の網羅性検査を行います。WireGuard は許可アドレスに宛先が含まれるピアにしかパケットを暗号化しないため、ピアの一覧がその前置きを除いていると、インターフェースへの方針経路だけでは足りません。一覧はマネージャがたまたま作る経路に任せず、ルーティングの所有者の管理下に置いてください。
印、テーブル、ピアの網羅性
印は共有の名前空間なので、値もマスクも、それを使う他のすべてと合意する必要があります。印の付いた通信を専用テーブルへ送る規則は、そのテーブルに一致する経路がないときの結果を定めておく必要があります。答えのない照会は次の規則へ進み、パケットを物理インターフェースから出してしまうことがあるからです。専用テーブル内の blackhole 既定経路は、その静かな脱出を見える破棄に変えます。それでも設計ができないのは、セットに一度も入らなかった宛先に対して閉じた動作をすることです。
トンネル自身の外側パケットは分類器を逃れる必要があります。WireGuard のツールはまさにそのためにソケット印を用意しており、これを使えばカプセル化が自分が作っているインターフェースへ戻されることはありません。
寿命を一つずつ試す
三つの保管場所が三つの予定で古くなります。リゾルバのキャッシュ、セットの要素、追跡される接続です。この順に試し、それぞれが動くべきときに動くかを見ます。以下のコマンドは何も変えずにリゾルバ、セット、接続テーブル、方針規則を読むだけです。
dig +short office.example
nft list set inet vpn_select office_v4
conntrack -L -d 10.60.8.15
ip rule show
要素を足す新しい照会は流し込みが働いている証拠であり、応答より長く残る古い要素は書き留める価値のある寿命のずれです。接続テーブルに期待した印で新しい接続が現れれば分類器が動いた証拠で、古い接続が元の印を保つのは不具合ではなく正しい挙動です。規則の一覧は方針の照会がそもそも存在するかに答え、これは一致したかとは別の問いです。四つの出力をこの順に読めば、失敗している受け渡しが自ら名乗り出ます。
特定の名前が常に一つの経路を使うことが要件なら、DNS が流し込むセットでは証明できません。共有されたアドレスは他の名前も運ぶからです。プロキシやアプリケーション層の仕組みが、その保証のための道具です。