拠点間VPNで日米それぞれのネット環境を活用する
様々な理由で日本経由でインターネットに接続したいケースがある*1。
ここでは日本(Bフレッツ)と米国(Xfinity)間でVPN接続し、ユーザは接続するWiFi SSIDを変えることで透過的にそれぞれの経路でインターネットに出ていけるようにすることをゴールとする。
なお、自分がたまたまYAMAHA RTX1100を2つ持っていたという理由だけでこれらを日米に配して拠点間VPNを構築したが、RTX1200以降のモデルは2つの拠点間で同一セグメントを構築できるらしい*2ので、もう少し簡略化できる可能性がある。また、最近はEdgeRouterXというルータが低価格かつ高性能らしいので、そういったものを使ったほうが近代的かも知れない。
ただ、基本的なルーティングの考え方は製品に依らず普遍的なので、同じようなことを検討している方には参考になるかも知れない。
Xfinity設定
Xfinity(Comcast)は本質的にケーブルテレビ網を使ったインターネット接続なので、WAN側アドレスはDHCPで割り振られる。そこを押さえておけば設定は容易い。
ComcastモデムのBridge Modeを有効化
Comcastのモデム(兼ルータ+WiFiスポット)はデフォルトで 10.0.0.0/24
のLANなので 10.0.0.1
でモデムの管理画面に入る。認証は初期状態で admin/password
Bridge Mode
を Enable
へ。
Turn Bridge Mode On and Off on Your Wireless Gateway
この時点でモデムはグローバルIPを失う(当然)ので注意。
ルータをとりあえずネット接続
前述の通りWAN側アドレスをDHCPでもらう。ここではLAN2ポートをモデムのLAN1*3に接続する。
LAN1の4ポートを室内LANとしてこのセグメントを 192.168.22.0/24
ゲートウェイを 192.168.22.1
とした。
ip lan1 address 192.168.22.1/24 ip lan2 address dhcp ip lan2 nat descriptor 1 ip route default gateway dhcp lan2 nat descriptor type 1 masquerade nat descriptor address outer 1 primary dhcp service server dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.22.100-192.168.22.199/24 expire 12:00 maxexpire 12:00 dns server 8.8.8.8 8.8.4.4 1.1.1.1 dns server dhcp lan2 dns private address spoof on
Bridge Modeを有効化した直後は設定が合っているのになぜかうまくWAN側アドレスをもらえなかったのでモデムを再起動したりしてるうちに5分ほどで降ってきた。
拠点間VPN設定
ネットボランチDNS
YAMAHAが無料で提供するDDNSサービス。VPNを利用するためには両拠点にグローバル固定IPが必要だけどこれでほぼ解決できる。
僕がYAMAHAのルータの大ファンなのはこのネットボランチDNSも理由のひとつ。
[PPPoEの場合] netvolante-dns hostname host pp [希望するアカウント名] netvolante-dns go pp 1
[CATVの場合] netvolante-dns hostname host lan2 [希望するアカウント名] netvolante-dns go lan2
振り出されたホスト名をメモしておく。
VPN設定
ここではまず簡易的にIPSecトンネルで設定しているが、適宜L2TP等利用して欲しい。
なお日本側LANは 192.168.11.0/24
ゲートウェイは 192.168.11.1
とした。
[米国側] tunnel select 1 tunnel name VPN-USA ipsec tunnel 1 ipsec sa policy 1 1 esp 3des-cbc sha-hmac ipsec ike hash 1 sha ipsec ike keepalive log 1 off ipsec ike keepalive use 1 on ipsec ike local address 1 192.168.22.1 ipsec ike pre-shared-key 1 [passphrase] ipsec ike remote address 1 tokyo.foo.netvolante.jp tunnel enable 1 nat descriptor masquerade static 1 1 192.168.22.1 udp 500 nat descriptor masquerade static 1 2 192.168.22.1 esp ipsec auto refresh on ip route 192.168.11.0/24 gateway tunnel 1
[日本側] tunnel select 1 tunnel name VPN-USA ipsec tunnel 1 ipsec sa policy 1 1 esp 3des-cbc sha-hmac ipsec ike hash 1 sha ipsec ike keepalive log 1 off ipsec ike keepalive use 1 on ipsec ike local address 1 192.168.11.1 ipsec ike pre-shared-key 1 [passphrase] ipsec ike remote address 1 usa.bar.netvolante.jp tunnel enable 1 nat descriptor masquerade static 1 1 192.168.11.1 udp 500 nat descriptor masquerade static 1 2 192.168.11.1 esp ipsec auto refresh on ip route 192.168.22.0/24 gateway tunnel 1
これでトンネルと相手側LANとのルーティングは完了。対向側にpingを投げてみて応答があるか確認する。
うまく通らない場合は show status tunnel 1
でトンネルインタフェースの状態確認してみたり nslookup
や traceroute
でどこに問題ががあるか切り分けていこう。
後述するが、フィルタの設定が不適切でネットボランチDNSで相手側ホストが名前解決できなかったりしたので、VPN対向側のネットボランチDNSホスト名と解決後のグローバルIPに対してそれぞれpingを打ってみても良い。
syslog debug on
して show log
すると名前解決ができなかったような事情もログに出ている。
米国のLAN3セグメントを日本経由にする
さて、VPNトンネル越しにお互いのセグメントを行き来できるようになったら、いよいよ本題の「特定のSSIDのWiFiに接続すれば何も考えずとも日本経由でインターネットに出ていく」件を設定する。
- LAN3セグメントを
192.168.33.0/24
ゲートウェイを192.168.33.1
とする - ソースアドレス
192.168.33.0/24
はトンネルインタフェースをゲートウェイとしてインターネットに出る
これを念頭に設定する。繰り返しになるが最近のルータは拠点間で同一セグメントを利用できたりするらしいので、その場合はこの設定は必要ない可能性がある。
[米国側] ip route default gateway dhcp lan2 filter 1 2 3 4 gateway tunnel 1 ip lan3 address 192.168.33.1/24 ip filter 1 pass * * udp * 500 ip filter 2 pass * * esp * * ip filter 3 pass * * udp,tcp domain * ip filter 4 pass 192.168.22.0/24 * dhcp scope 2 192.168.33.100-192.168.33.199/24 expire 12:00 maxexpire 12:00
[日本側] ip route 192.168.33.0/24 gateway tunnel 2
見ての通り、フィルタ1, 2でVPNのネゴシエーション用のパケットを、フィルタ3でDNS問い合わせのパケットを、フィルタ4でソースアドレス 192.168.22.0/24
のパケットをComcast側に通し、それ以外は全部トンネル経由で日本側から出すルールを書いた。
当初DNSを見落としており、なぜかVPN接続が確立できなくてログをみていたら、対向側ホスト名の名前解決に失敗していた^^;
あとは適当な無線LANルータを買ってきて米国側LAN3ポートにぶらさげれば*4、このWiFiルータに接続した端末は特に何も意識しなくても日本経由でインターネットに出ることができる。この方法だとデスティネーションアドレスごとにルーティングの設定を変えたりする必要がなくて非常に楽である。めでたしめでたし。
全体像
一応全体を見渡せるように。
言うまでもなく、これは必要な部分だけを抜粋しているので、実際の運用はご自身でルールを追加してください。当方は結果に一切責任を負いません。
[日本側] login password * administrator password * login user foo * security class 2 off on timezone +09:00 console character ascii console prompt [RTX] login timer 3600 ip route default gateway pp 1 ip route 192.168.22.0/24 gateway tunnel 1 ip route 192.168.33.0/24 gateway tunnel 1 ip lan1 address 192.168.11.1/24 pp select 1 pp name [Provider] description pp [Provider] pp always-on on pppoe use lan2 pppoe auto connect on pppoe auto disconnect off pp auth accept pap chap pp auth myname *** *** ppp lcp mru on 1454 ppp ipcp ipaddress on ppp ipcp msext on ppp ccp type none ip pp mtu 1454 ip pp nat descriptor 1 netvolante-dns hostname host pp server=1 japan.foo.netvolante.jp pp enable 1 tunnel select 1 tunnel name VPN-USA ipsec tunnel 1 ipsec sa policy 1 1 esp 3des-cbc sha-hmac ipsec ike hash 1 sha ipsec ike keepalive log 1 off ipsec ike keepalive use 1 on ipsec ike local address 1 192.168.11.1 ipsec ike pre-shared-key 1 *** ipsec ike remote address 1 usa.bar.netvolante.jp tunnel enable 1 nat descriptor type 1 masquerade nat descriptor address outer 1 ipcp nat descriptor address inner 1 auto nat descriptor masquerade incoming 1 discard nat descriptor masquerade static 1 1 192.168.11.1 udp 500 nat descriptor masquerade static 1 2 192.168.11.1 esp ipsec auto refresh on telnetd service off dhcp service server dhcp duplicate check 100 off dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.11.100-192.168.11.199/24 expire 12:00 maxexpire 12:00 dns server 8.8.8.8 8.8.4.4 1.1.1.1 dns server pp 1 dns private address spoof on httpd host lan sshd service on sshd host 192.168.11.1-192.168.11.254 sshd host key generate *
[米国側] login password * administrator password * login user foo * security class 2 off on timezone -07:00 console character ascii console prompt [RTX] login timer 3600 ip route default gateway dhcp lan2 filter 1 2 3 4 gateway tunnel 1 ip route 192.168.11.0/24 gateway tunnel 1 ip lan1 address 192.168.22.1/24 ip lan2 address dhcp ip lan2 nat descriptor 1 netvolante-dns hostname host lan2 server=1 usa.bar.netvolante.jp ip lan3 address 192.168.33.1/24 tunnel select 1 tunnel name VPN-USA ipsec tunnel 1 ipsec sa policy 1 1 esp 3des-cbc sha-hmac ipsec ike hash 1 sha ipsec ike keepalive log 1 off ipsec ike keepalive use 1 on ipsec ike local address 1 192.168.22.1 ipsec ike pre-shared-key 1 * ipsec ike remote address 1 japan.foo.netvolante.jp tunnel enable 1 ip filter 1 pass * * udp * 500 ip filter 2 pass * * esp * * ip filter 3 pass * * udp,tcp domain * ip filter 4 pass 192.168.22.0/24 *** nat descriptor type 1 masquerade nat descriptor address outer 1 primary nat descriptor masquerade static 1 1 192.168.22.1 udp 500 nat descriptor masquerade static 1 2 192.168.22.1 esp ipsec auto refresh on telnetd service off dhcp service server dhcp server rfc2131 compliant except remain-silent dhcp scope 1 192.168.22.100-192.168.22.199/24 expire 12:00 maxexpire 12:00 dhcp scope 2 192.168.33.100-192.168.33.199/24 expire 12:00 maxexpire 12:00 dns server 8.8.8.8 8.8.4.4 1.1.1.1 dns server dhcp lan2 dns private address spoof on httpd host lan sshd service on sshd host 192.168.22.1-192.168.22.254 sshd host key generate *
その他
久しぶりにRTXを触ったのと、シリアルクロスケーブルとかも忘れてきたので、その状態で設定をリセットしてIPを振ってファームウェアを更新するまでにちょっと苦労した。
自分のためにメモを残す。
リセット
背面INIT近くの穴をピンで推しながら電源を入れる。LAN側IPアドレスも失うので注意。
IPを振る
シリアルクロスケーブルがあれば最も話が早いんだけどそれがない場合、RARPを使って設定してもいいんだけどこれが結構面倒くさいのでIPv6のマルチキャストを使う。
RTX1100と自機をLANケーブルで接続して
# eth0はケーブルを挿したネットワークインターフェース名 ping6 -I eth0 ff02::2
すると 64 bytes from xxx::xxx:xxx:xxx:xxx%eth0: icmp_seq=1 ttl=64 time=1.00 ms
みたいに応答があるので telnet xxx::xxx:xxx:xxx:xxx%eth0
するだけ。あとは好きなように設定できる。超簡単!
ファームウェア更新
tftpを使うのが簡単。
- firmware release for Yamaha Network Products ここからファームウェアをダウンロード。md5sumを取って念の為確認。
- ルータで
tftp host any
ortftp host クライアントPCのIP
で許可 - 次のコマンドの通り
tftp ルータのIP tftp> mode binary tftp> put rtx1100.bin exec
mode binary
がミソ
僕が2005年ぐらいにプロになって初めて使ったルータなのでつい思い入れを持って10年以上愛用してしまっている。まあ良いルータですね!