金盾対応のPBR

金盾のアクセス制限を回避するのにVPNが使われますが、

中国から中国のサイト(高德地图とか)にアクセスするときは、VPNで日本経由のアクセスにするとあからさまに応答が遅くなるので、接続先サイトのドメインによってVPNを通すか通さないかを変えたいです。

ということで、なんでもかんでもVPNを通すとこまることがあります。

そこでPBRを使って、通信の振り分けをすることにしました。

ドメイン名で振り分ける準備

旅先用ルータのOpenWrtにpbr・luci-app-pbr・dnsmasq-fullをインストール。そして

LuCI > Services > Policy Routing > Basic Configuration

Use resolver set support for domains: Dnsmasq nft set

とセットします。

ふつうのルーティング設定は、宛先IPアドレスを使って経路の振り分けをするものですが、PBRを使うと宛先ドメインでの振り分けができるようになります。

それはルータが「名前解決する都度そのIPアドレスをルーティングテーブルに載せる」というしくみで実現しているので、名前解決はルータ自身でやらないと機能しません。つまり、端末側でDNS設定を8.8.8.8などにしていた場合には振り分けが発動しないんです。

なので端末のChromebook側では、「サイトのルックアップに安全な接続を使用する」をOFFにするだけでなく、DNSをDHCPで自動設定されるままにするなどする必要があります。

しばらくこれに気づかずはまりました。

VPN回線を経路の選択肢に追加する

PBRの経路Interfaceの選択肢には、デフォルト設定ではwanなど限られたものしか表示されないので、ここにVPN回線を追加しておきます。

LuCI > Services > Policy Routing > Advanced Configuration > Supported Interfaces

ここにVPNのデバイス名を追記します。ちなみに「デバイス名」というのは、

LuCI > Network > Interfaces > Devices

ここに一覧表示されるものです。

LuCI > Network > Interfaces > Interfaces

の方ではないので注意。

これもしばらく気づかずはまりました。

PBR振り分けの注意点

ただ単純に、Googleなどの金盾ブロック対象ドメイン宛の通信だけをVPNに通せばいいかというと、そう簡単にはいきません。

金盾は、DNS応答の改ざんでブロックを実現しているケースもあるので、こちらも対応しないと、改ざんされた接続先にVPNを通して接続しようしてしまって回避できません。

かといって、全部のDNS通信をVPNに通す設定にしてしまうと、最初にVPNトンネルを張るためのDNS問い合わせができなくなったりしてこまります。

端末からのDNS問い合わせは、ルータ自身を指さないとPBRが機能しないのでここはいじれない。なのでルータが名前解決する経路だけを制御したい。

そこでまず、特定ドメインの問い合わせだけふだんと別のDNSを指すようにします。

LuCI > Network > DHCP and DNS > Forwards > Additional servers file

/etc/dnsmasq.servers

と入力。そして旅先用ルータ上の/etc/dnsmasq.serversを以下のように編集します。

server=/google.com/1.1.1.2
server=/google.co.jp/1.1.1.2

(などなど、対象ドメインを列挙。このようにルートドメインだけ書いておけばサブドメインにも効きます。)

ちなみに1.1.1.2は1.1.1.1のマルウェアブロック版です。ふだんとちがう設定であれば何でもいいです。

そしてPBRで1.1.1.2宛の通信をVPN経由となるように経路制御します。

LuCI > Services > Policy Routing > Policies

Remote addresses / domains: 1.1.1.2
Chain: output
Interface: (通したいVPNのインタフェース)

というようなルールを追加します。「Chain: output」はフォワードなどでないルータ自身の送信パケットの制御を指します。

追記 2025-07-15
西宁では宿のWi-Fiとモバイル回線ともにCloudflare DNS(1.1.1.1〜3)と疎通ができなかったので、Quad9の9.9.9.10に変更しました。
(9.9.9.9だと、このブログで画像埋め込みに使っているpCloudの公開用ドメインfiledn.euがなぜかブロックされてしまうので、セキュリティ制御のない9.9.9.10の方に。)

その他細かな注意点

今回旅先用ルータ-実家ルータ間に複数経路がある構成ですが、旅先用ルータ側でこのつなぎのVPNセグメントにIPマスカレードをかけておきます。

LuCI > Network > Firewall > Zones

で、VPNセグメントの属するゾーンすべてで

Masquerading

にチェック。

なにかとトラブルの元になる、行きと帰りで別ルートを通ってしまう非対称ルーティングを防ぐ目的です。OpenConnectでは旅先用ルータ側のIPアドレスがランダムに決まってしまうので、そもそも実家ルータ側に戻りのルーティング設定が固定で入れられないという事情もあります。

コメント

読み込み中...