拠点間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 ModeEnable へ。
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 でトンネルインタフェースの状態確認してみたり nslookuptraceroute でどこに問題ががあるか切り分けていこう。
後述するが、フィルタの設定が不適切でネットボランチDNSで相手側ホストが名前解決できなかったりしたので、VPN対向側のネットボランチDNSホスト名と解決後のグローバルIPに対してそれぞれpingを打ってみても良い。
syslog debug on して show log すると名前解決ができなかったような事情もログに出ている。

VPN(IPsec)接続ができない

米国のLAN3セグメントを日本経由にする

さて、VPNトンネル越しにお互いのセグメントを行き来できるようになったら、いよいよ本題の「特定のSSIDWiFiに接続すれば何も考えずとも日本経由でインターネットに出ていく」件を設定する。

  1. LAN3セグメントを 192.168.33.0/24 ゲートウェイ192.168.33.1 とする
  2. ソースアドレス 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を使うのが簡単。

  1. firmware release for Yamaha Network Products ここからファームウェアをダウンロード。md5sumを取って念の為確認。
  2. ルータで tftp host any or tftp host クライアントPCのIP で許可
  3. 次のコマンドの通り
tftp ルータのIP
tftp> mode binary
tftp> put rtx1100.bin exec

mode binary がミソ

僕が2005年ぐらいにプロになって初めて使ったルータなのでつい思い入れを持って10年以上愛用してしまっている。まあ良いルータですね!

*1:理由は察して欲しい

*2:2つの拠点間で同一セグメントのネットワークを構築する

*3:どこでも良い。ただし接続するのは1ポートのみ。

*4:VLANをサポートするWiFiルータを持っていればハードウェアを買い足す必要もないとの指摘を受けた。