金盾のアクセス制限を回避するのにVPNが使われますが、
中国から中国のサイト(高德地图とか)にアクセスするときは、VPNで日本経由のアクセスにするとあからさまに応答が遅くなるので、接続先サイトのドメインによってVPNを通すか通さないかを変えたいです。
ということで、なんでもかんでもVPNを通すとこまることがあります。
そこでPBRを使って、通信の振り分けをすることにしました。
ドメイン名で振り分ける準備
- [OpenWrt Wiki] PBR (Policy-Based Routing)
- Install dnsmasq-full over dnsmasq - Installing and Using OpenWrt - OpenWrt Forum
旅先用ルータの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.2Chain: outputInterface: (通したいVPNのインタフェース)
というようなルールを追加します。「Chain: output」はフォワードなどでないルータ自身の送信パケットの制御を指します。
(9.9.9.9だと、このブログで画像埋め込みに使っているpCloudの公開用ドメインfiledn.euがなぜかブロックされてしまうので、セキュリティ制御のない9.9.9.10の方に。)
その他細かな注意点
今回旅先用ルータ-実家ルータ間に複数経路がある構成ですが、旅先用ルータ側でこのつなぎのVPNセグメントにIPマスカレードをかけておきます。
LuCI > Network > Firewall > Zones
で、VPNセグメントの属するゾーンすべてで
Masquerading
にチェック。
なにかとトラブルの元になる、行きと帰りで別ルートを通ってしまう非対称ルーティングを防ぐ目的です。OpenConnectでは旅先用ルータ側のIPアドレスがランダムに決まってしまうので、そもそも実家ルータ側に戻りのルーティング設定が固定で入れられないという事情もあります。
実際に使ってみての改善点の話です。
コメント