さて今回は、対象のサイトを 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 等に比べてものすごく軽量で、ものすごく設定が簡単です。
今回はこのような作業になります。
- Firewall で 空のアドレスグループを作る
- Dnsmasq に対象ドメイン名の IP アドレスをアドレスグループに記録させる
- Firewall で前回と同じく modify ルールを設定
- さらに Dnsmasq で、対象ドメイン名にアクセスする際は日本の DNS を使うよう設定する
これで、ドメイン名によるルーティング制御が可能になります。これは Domain Based Routing と呼んでしまって差し支えないでしょう。対象のサイトの IP アドレスが変わっても Dnsmasq がどんどんアドレスグループに記録していくので安心です。
route_tun0
をそのまま使う前提です。これを設定していない場合は前回の記事を見てそちらから始めてください。
それでは今回は 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を設定した後は、念のため EdgeRouter を再起動させたほうが良さそうです。 ipset と Dnsmasq を設定しただけで再起動しないと、 ipset にアドレスが記録されないことが何回かありました。
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 を定期的に再起動する様にしてもいいです。下記のサイトにやり方の例が載ってます。
これで終了です。サイトにアクセスしてみる前に、 Dnsmasq がきちんと IP アドレスを記録するため、ネットワークユーティリティ等の Lookup を使って、予めアクセスしそうなドメインを lookup しておくとスムーズにアクセスできます。でなければサイトが正常に表示されるまで数回リロードが必要だったりします。きちんと設定できているのにうまく表示されない場合は、一度 cookie を全部消去して見るといいでしょう。
今回参考にしたのは下記のスレッドです。
以上、お疲れ様でした。
yabe.jp » Gadgets »