EdgeRouter X – 10. 海外から見られないサイトを見る2 ( Domain Based Routing / Dnsmasq )

さて今回は、対象のサイトを VPN トンネル経由でルーティングする際に、 IP アドレスでなくドメイン名を使う手法で設定してみます。 EdgeRouter 内蔵の軽量 DNS サーバー Dnsmasq を使います。 対象ファームウェアは 1.9.1 です。

なぜドメイン名でルーティングするのか

前回の Policy Based Routing で説明したやり方は、対象となる VPN 経由で見たいサイトの IP アドレスが必要になります。これは、小規模なサイトであれば問題ありませんが、 Netflix や Hulu 等、サーバーがいくつもあり、かつそのサーバーの IP アドレスが時間によって変わる場合は、すべての IP アドレスを調べつくす必要があり非現実的な設定方法となってしまいます。

その際に便利なのが、ドメイン名を指定してルーテイングを行うこの機能です。

この機能を使うと、対象のサイトのドメイン名を指定するだけで、自動的にそのサイト向けのトラフィックが拠点間 VPN を通るようになり、 L2TP VPN をオンにしたりオフにしたりとか面倒な作業をすることなく、あたかもその地域にいるかのように LAN 内のすべての端末から地域制限のかかったサイトが見られるようになります。たった $49 のルーターでそんなことができるなんて、ほんと末恐ろしい世の中になったものです。

Dnsmasq とは

Dnsmasq とは主に小規模ネットワーク向けの DNS サーバー兼 DHCP サーバーソフトウェアです。 BIND 等に比べてものすごく軽量で、ものすごく設定が簡単です。

今回はこのような作業になります。

  1. Firewall で 空のアドレスグループを作る
  2. Dnsmasq に対象ドメイン名の IP アドレスをアドレスグループに記録させる
  3. Firewall で前回と同じく modify ルールを設定
  4. さらに Dnsmasq で、対象ドメイン名にアクセスする際は日本の DNS を使うよう設定する

これで、ドメイン名によるルーティング制御が可能になります。これは Domain Based Routing と呼んでしまって差し支えないでしょう。対象のサイトの IP アドレスが変わっても Dnsmasq がどんどんアドレスグループに記録していくので安心です。

それでは今回は TVer.jp を例に設定してみます。 TVer.jp はテレビ局各局のオンデマンド配信サービスを合わせたサイトなので、 VPN トンネル経由でルーティングしなければならないサイトが各局別にたくさんあり、かつ一定時間で IP アドレスが変わるものが結構あります。前回の IP アドレスベースのルーティングではそれら全てを押さえるのはとても大変ですが、ドメイン名ベースのルーティングならなんとかなりそうです。なんども言うようですが、これらは ER-X の潜在能力の高さを示す設定例です。地域制限のかかったサイトはその地域でみるようにしましょう。

Firewall で 空のアドレスグループを作る

Dnsmasq が IP アドレスを記録するための空のアドレスグループをつくります。名前は tver-ipset にしました。

set firewall group address-group tver-ipset
set firewall group address-group tver-ipset description tver.jp

Dnsmasq に IP アドレスをアドレスグループに記録させる

続いて Dnsmasq が対象のサイトの IP アドレスを tver-ipset アドレスグループに記録するようオプションを設定します。オプションの書式は ipset=/ドメイン名/アドレスグループ です。ちなみにドメイン名を “xxxx.com” と記述した場合は、”*.xxxx.com” が全て含まれることになります。今回は TVer.jp 内のビデオをストリーミングしてそうなドメイン名を列挙しました。ついでに Dnsmasq のキャッシュサイズを増やします。

## キャッシュサイズを増やす
set service dns forwarding cache-size 500

## Dnsamasq が自分自身を DNS サーバーとして参照できるようにする (もう設定してあれば不要)
set service dns forwarding listen-on lo

## 対象のドメイン名を tver-ipset という ipset に記録するよう設定
set service dns forwarding options ipset=/tver.jp/ntv.co.jp/tv-asahi.co.jp/tbs.co.jp/fujitv.co.jp/tv-tokyo.co.jp/presentcast.co.jp/brightcove.com/brightcove.net/streamhub.tv/streamhub.io/stream.ne.jp/durasite.net/interactive-circle.jp/socdm.com/jocdn.jp/dogatch.jp/brightcove.map.fastly.net/d2avdmwlfes962.cloudfront.net/ntvmov-elb-1535922568.ap-northeast-1.elb.amazonaws.com/tver-api-data.s3.amazonaws.com/s3-ap-northeast-1-w.amazonaws.com/e7164.g.akamaiedge.net/vod-prod-728382183.ap-northeast-1.elb.amazonaws.com/log12-interactive-circle-655347476.ap-northeast-1.elb.amazonaws.com/streamhub-collector-blue.us-east-1.elasticbeanstalk.com/tver-ipset

Firewall で前回と同じく modify ルールを設定

それでは前回作った Modify の route_tun0 にルールをを追加します。

set firewall modify route_tun0 rule 20
set firewall modify route_tun0 rule 20 action modify
set firewall modify route_tun0 rule 20 description TVer.jp
set firewall modify route_tun0 rule 20 destination group address-group tver-ipset
set firewall modify route_tun0 rule 20 modify
set firewall modify route_tun0 rule 20 modify table 1

対象のドメイン名の問い合わせは日本の DNS を使うよう設定する

対象サイトにアクセスする際に、念のため Dnsmasq に日本の DNS を使うように指示します。オプションの書式は server=/ドメイン名/DNSサーバーの IP アドレス です。ここでは実家のインターネットプロバイダーの DNS が 208.67.222.123 だったとしますが、お使いのプロバイダーに合わせて変更してください。

## 同じドメイン名の DNS query を日本の DNS サーバーへ送るよう設定
set service dns forwarding options server=/tver.jp/ntv.co.jp/tv-asahi.co.jp/tbs.co.jp/fujitv.co.jp/tv-tokyo.co.jp/presentcast.co.jp/brightcove.com/brightcove.net/streamhub.tv/streamhub.io/stream.ne.jp/durasite.net/interactive-circle.jp/socdm.com/jocdn.jp/dogatch.jp/brightcove.map.fastly.net/d2avdmwlfes962.cloudfront.net/ntvmov-elb-1535922568.ap-northeast-1.elb.amazonaws.com/tver-api-data.s3.amazonaws.com/s3-ap-northeast-1-w.amazonaws.com/e7164.g.akamaiedge.net/vod-prod-728382183.ap-northeast-1.elb.amazonaws.com/log12-interactive-circle-655347476.ap-northeast-1.elb.amazonaws.com/streamhub-collector-blue.us-east-1.elasticbeanstalk.com/208.67.222.123

日本の DNS へのパケットが VPN 経由となるようルールを追加

上の設定で Dnsmasq は特定のドメイン名への query を日本の DNS へ送信しますが、その query が国外発だと CDN などの設定によって国外サーバーの IP アドレスが返ってきてしまったりします。それを防ぐ為に、日本の DNS へは日本経由でアクセスするよう静的ルートを追加します。

set protocols static interface-route 208.67.222.123/32 next-hop-interface v6tun0

ipset をセーブ・ロードする

実は Dnsmasq が ipset に追加した IP アドレスは、 EdgeRouter を再起動すると消えてしまいます。なので、再起動直後にうまくルーティングされないことがあります。これを防ぐため、 ipset に追加された IP アドレスをセーブ・ロードする簡単なスクリプトを書いてみます。

#!/bin/bash
sudo ipset save -! tver-ipset -file /config/user-data/ipset/tver-ipset.txt

これを /config/scripts/save-ipset.sh として保存します。そしてパーミッションを 755 にしておきます。

sudo chmod 755 /config/scripts/save-ipset.sh

このスクリプトを毎週土曜日の早朝 05:30 に実行するよう設定します。

configure
set system task-scheduler task save-ipset crontab-spec "30 5 * * 6"
set system task-scheduler task save-ipset executable path /config/scripts/save-ipset.sh
commit
save

これで ipset が毎週土曜日にテキストファイルとして保存されます。続いてこのテキストファイルをロードするスクリプトを書きます。ちなみに次のステップを行う前に、一度このスクリプトを実行して、きちんとテキストファイルが保存されるか試したほうがいいかもです。

#!/bin/bash
sudo ipset restore -! -file /config/user-data/ipset/tver-ipset.txt

これを /config/scripts/post-config.d/restore-ipset.sh として保存します。このフォルダに保存されたスクリプトは EdgeRouter の起動後、コンフィグのロードが終わったあとに実行されます。パーミッションを 755 にしておきます。

sudo chmod 755 /config/scripts/post-config.d/restore-ipset.sh

これで EdgeRouter を再起動しても ipset に保存しておいた IP アドレスがロードされます。

Dnsmasq を定期的に再起動させる

また対象となるドメインをいっぱい登録してしまって Dnsmasq が不安定になったり、クラッシュしたりする場合は、 task-scheduler を使って Dnsmasq を定期的に再起動する様にしてもいいです。下記のサイトにやり方の例が載ってます。

UBNT Task Scheduler

これで終了です。サイトにアクセスしてみる前に、 Dnsmasq がきちんと IP アドレスを記録するため、ネットワークユーティリティ等の Lookup を使って、予めアクセスしそうなドメインを lookup しておくとスムーズにアクセスできます。でなければサイトが正常に表示されるまで数回リロードが必要だったりします。きちんと設定できているのにうまく表示されない場合は、一度 cookie を全部消去して見るといいでしょう。

今回参考にしたのは下記のスレッドです。

Dnsmasq Ipset

以上、お疲れ様でした。


yabe.jp » Gadgets » EdgeRouter X – 10. 海外から見られないサイトを見る2 ( Domain Based Routing / Dnsmasq )