EdgeRouter 6P – 13. 超難しい VPN

どうもどうも、お久しぶりです。今回は、知り合いから超簡単な VPN よりむしろ超難しい VPN の記事を読みたい!とのリクエストがあったこともあり、最新の我が家のネットワークデザインなどと交えてどんなことになってるのか記事にしてみようと思います。盆栽のようにあっちをいじり、こっちをいじりしていたら、こんなになってしまいました、的な。

それでは本編、我が家のネットワークデザインとどんな VPN を使っているのか書いてみます。超難しいので、どっしり腰を据えてお読みください。図とかも超込み入ってるので、なるべくデスクトップで見ることをオススメします。

今回扱う VPN は iPhone などで使う L2TP / IPsec 等のリモートアクセス VPN でなく、ルーター同士をつなぐ拠点間 VPN です。

概要

今の我が家(アメリカの自宅と日本の実家)のネットワークの物理的な配線は、ざっくりこんな感じです。

2019 年に実家への Nuro の誘致に成功し、かつアメリカでも光ファイバーになりました。これによってだいぶ VPN で色々なことができるようになりました。

アメリカ 日本
ISP AT&T Fiber Nuro マンション
回線 GPON 1Gbps GPON 2Gbps
ルーター EdgeRouter 6P EdgeRouter 6P
WAN IPv4 グローバル IP プライベート IP
WAN IPv6 DHCP-PD (/56) RA (/64)
基幹スイッチ EdgeSwitch 8 150W EdgeSwitch 8 150W
部屋スイッチ 3x UniFi Switch 1x UniFi Switch
WiFi AP 3x UniFi nanoHD 2x UniFi nanoHD

アメリカでは eap_proxy を使って AT&T の超絶ダメなゲートウェイ BGW210-700 をバイパスし、 EdgeRouter がグローバル IP を持つメインのルーターになっています。基幹スイッチは EdgeSwitch 8 150W で、アパートの室内の壁に埋まってる Ethernet を利用して各部屋のスイッチにつながってます。

アメリカの住宅は結構な確率で壁に Ethernet が来てることが多いです。壁にこんな感じの Ethernet コンセントありません?

また各部屋に UniFi nanoHD を 5GHz 専用 WiFi アクセスポイントとして配置していて、また基幹スイッチに別途 2.4GHz 専用の nanoHD をつなげてます。またベッドルームのテレビにつながってる Apple TV / Fire TV 用に UniFi Switch Flex Mini が置いてあります。

日本でもルーターと基幹スイッチは同じです。ただ Nuro のゲートウェイ F660A をうまくバイパスできていないので、仕方なく EdgeRouter は Double NAT で F660A の配下にいます。そのため EdgeRouter の IPv4 はプライベートアドレスになってしまっています。一応 F660A の方で DMZ の設定はしてあります。また日本の実家は残念ながら壁に Ethernet が埋め込まれてないので、リビングと寝室は UniFi nanoHD でメッシュ接続にしてます。狭いマンションですが、これでも寝室からリビングにある nanoHD を使うよりは2倍ぐらい実効速度が出ます。

F660A で DMZ を設定して EdgeRouter を使うやり方はこのブログに載ってます。この方は ndppd ( ND Proxy ) を EdgeRouter にインストールして、 /56 のプレフィックスを1契約ごとに割り当てるくせに DHCP-PD ができず RA で /64 しか配下に割り当てられないダメな設計の F660A でプレフィックスを EdgeRouter 配下に割り当てる技も披露されておられます。

EdgeRouter X を NURO 光で使う ― その1: 初期設定

VLAN 概要

それでは続いて我が家の VLAN の状況です。

VLAN とは簡単に言えば Ethernet で配線した LAN の中に、仮想的な LAN をいくつも作れる仕組みです。物理的には同じ配線を利用していても、 VLAN 同士は独立した LAN でお互いのことが(レイヤー2レベルで)見えません。また VLAN を扱うにはスマートスイッチやマネージドスイッチと呼ばれる VLAN 対応のスイッチが必要になります。

VLAN アメリカ 日本
1 メイン LAN メイン LAN
11 IoT
21 VoIP US
22 VoIP JP
32 Nuro JP LAN Nuro JP LAN

アメリカにはメインの LAN 1 の他に、 IoT 家電なんかを接続する IoT VLAN 11、そして実家とテレビ電話するための VoIP VLAN 21 等3つのネットワークが同居してます。日本には日本用の VoIP VLAN 22 と、 Nuro の ゲートウェイ F660A 配下の LAN 192.168.32.0/24 をそのまま流している Nuro JP LAN 32 の2つがあります。

あれ、アメリカ側にも VLAN 32 がありますね・・これについては後ほど。

ほんとは「ネットワーク機器にアクセスする用のマネジメント VLAN 」だとか、「光ファイバーが落ちた時にバックアップ回線となる LTE モデムをつないだ VLAN 」とかがあってもう少し込み入ってるんですが、簡単のため主要な VLAN だけ載せてみました。 VLAN はスイッチにもよりますが、だいたい 4000 個ぐらいまで設定できます。

VLAN 1

こちらがメインの VLAN = VLAN 1 だけを抜き出した図です。

これだけ見ると普通のご家庭の LAN です。日本とアメリカにそれぞれルーターがあり、 eth2 に LAN がつながってます。 LAN すべてが1つのサブネットで、ルーターからの DHCP で各端末にプライベート IP アドレスが割り当てられてます。アメリカ側のサブネットは 10.0.1.0/24 、日本側のサブネットは 10.0.2.0/24 ですね。

図にあるように VLAN 1 は Default VLAN でもあり、どこでも VLAN 識別子である「タグ」のつかない、タグ無しの Ethernet フレームで構成されています。

基本的にはこの VLAN 1 に家族が使う Mac や iPhone なんかが接続されてます。新しい端末を何も設定しないでスイッチや WiFi に接続すると、やはりこの VLAN 1 につながります。

VLAN 11: IoT VLAN

こちらが IoT 用の VLAN = VLAN 11 だけを抜き出した図です。

VLAN 11 は IoT 家電専用のネットワークで、ここでは例としてサウンドバーや空気清浄機がつながっています。このサウンドバーや空気清浄機にはルーターは見えますが、その他の VLAN の端末や通信データはレイヤー2レベルでは見えません。なので、サウンドバーや空気清浄機からすると、自分や他の IoT 機器しかいない独立したネットワークにいるように見えます。もちろんルーターで各 VLAN 間をルーティングできますが、そこは firewall をうまく設定したりします。

ルーターの eth2 ポートには VLAN 11 用の eth2.11 という仮想ポートが設定されています。そこから出た Ethernet フレームは VLAN ID = 11 という識別子(タグ)が付きます。このタグがついたフレームはそのタグの ID を認識するよう設定されたポートのみで送受信されます。ものすごく乱暴に言うと、そのタグの ID を認識するように設定されてないポートや端末ではフレームは無視され、その結果他の VLAN の端末からは VLAN 11 は見えません。また VLAN 11 からも他の VLAN が見えません。

ちなみにサウンドバーがつながっているスイッチのポートには PVID = 11 が設定してあり、 このポートでは内から VLAN 11 のタグのついたフレームが来るとそのタグを取って外に出し、外からタグなしのフレームを受信すると VLAN 11 のタグをつけて他のポートに送ります。その結果、サウンドバーは VLAN タグのついてない普通のフレームとしてデータを送受信してますが、そのデータは VLAN 11 由来のものになります。このようにしてサウンドバー自身は VLAN を意識することなく、ちゃっかり VLAN 11 に参加していることになります。この場合 VLAN 11 のサブネットは 10.0.11.0/24 で、そのためサウンドバーの IP アドレスは 10.0.11.21 になっています。

また同じように空気清浄機がつながる WiFi アクセスポイントでも、 VLAN 11 を設定した SSID として SSID-3 が設定されてます。空気清浄機を SSID-3 につなぐと、 PVID = 11 が設定されたスイッチのポートと同じように、タグなしのフレームが送受信できますが、そのデータは VLAN 11 に所属します。便利ですね!

Router on a Stick

VLAN があると便利な小技としては、ルーターの Ethernet ポートをスイッチと VLAN を使って増やす Router on a Stick があります。

この図では、ルーターの eth2 に VLAN として eth2.51 / 2.61 / 2.71 を設定しています。これをスイッチにつなぎ、スイッチ側のポートでは PVID = 1 / VID = 51/61/71 と設定します。またスイッチの他のポートにそれぞれ PVID = 1 / PVID = 51 / PVID = 61 / PVID = 71 を設定します。

なんということでしょう!ルーターでは Ethernet ポートは1つしか使っていないのに、スイッチでは4つの違うサブネットを持ったポートが出現しました。 VLAN は 4000 個ぐらいまで増やせるので、これによりルーターの Ethernet ポートが1つしかなくても、いくらでも違うサブネットの物理ポートを増やすことができます。なんだ、ルーターの物理ポートって2個あればよかったんすね!

レイヤー3 VPN

さて、それではここで自宅と実家をつなぐ VPN を見てみます。 VPN には IP プロトコルを通すレイヤー3 VPN と、マルチキャストや ARP などを Ethernet フレームごと通すレイヤー2 VPN がありますが、我が家では両方使って日米両拠点をつないでいます。まずはレイヤー3 VPN から。

レイヤー3 VPN として GRE over IPsec を使っています。また日本側 EdgeRouter の IPv4 がプライベート IP なので、両ルーターの WAN 側に割り当てられた IPv6 アドレスを使って GRE を設定してます。 IPv6 アドレスは全てグローバル IP なので、 NAT の影響を考える必要がなく、 VPN のトンネルを貼るには大変便利です。この場合 IPsec は Transport Mode を使い、アメリカ側 WAN IPv6 から 日本側 WAN IPv6 の区間を暗号化します。

例えは GRE トンネルインターフェース v6tun0 の設定は下記の通りです。

アメリカ 日本
VPN GRE v6tun0 GRE v6tun0
v6tun0 リモート IP 日本側 WAN IPv6 アメリカ側 WAN IPv6
v6tun0 ローカル IP アメリカ側 WAN IPv6 日本側 WAN IPv6
暗号化 IPsec Transport IPsec Transport

この設定をすると、ルーター同士が v6tun0 というインターフェースで直接されたことになり、静的ルートを設定すれば、お互いのサブネットがあたかも隣同士の LAN のように通信できるようになります。我が家では、これでアメリカ側から実家にあるルーターや Mac にアクセスしたりしてます。

ちなみに IPv6 GRE トンネルを使うためには、両拠点で IPv6 ファイアウォールで GRE を通す設定が必要です。ファイアウォールで GRE ( IP Protocol 47 ) を指定して通してもいいですが、我が家では両拠点の EdgeRouter と F660A で両拠点の IPv6 のプレフィックスをファイアウォールで通すように設定しています。

この時に Firewall の rule で state: invalid をドロップするルールがあると、なぜかこれらの VPN がドロップされちゃうことがありました。なので、 state: invalid のルールでこれらの IPv6 のプレフィックスを除外するようにしてます。

set firewall group ipv6-address-group wan-ip6
set firewall group ipv6-address-group wan-ip6 ipv6-address 'XXXX:XXXX:XXXX:XXXX::/60'
set firewall group ipv6-address-group wan-ip6 ipv6-address 'XXXX:XXXX:XXXX:XXXX::/56'

set firewall ipv6-name WANv6_IN rule 30 action drop
set firewall ipv6-name WANv6_IN rule 30 description 'Drop invalid state'
set firewall ipv6-name WANv6_IN rule 30 protocol all
set firewall ipv6-name WANv6_IN rule 30 source group ipv6-address-group '!wan-ip6'
set firewall ipv6-name WANv6_IN rule 30 state invalid enable
set firewall ipv6-name WANv6_IN rule 40 action accept
set firewall ipv6-name WANv6_IN rule 40 description 'Allow wan-ip6'
set firewall ipv6-name WANv6_IN rule 40 protocol all
set firewall ipv6-name WANv6_IN rule 40 source group ipv6-address-group wan-ip6

commit
save

また、 ip6gre を安定して使うには firmware 2.0.9 以降がおすすめです。

VPN 経由のルーティング1

自宅の VLAN 1 と実家の VLAN 1 が相互に通信できるよう静的ルートを設定した場合はこんな感じになります。

アメリカ側のルーターには静的ルートとして、 日本側の VLAN 1 = 10.0.2.0/24 のサブネット宛のパケットは v6tun0 に送るよう設定されてます。また日本側は 10.0.1.0/24 宛がやはり v6tun0 経由で送られます。このおかげで、例えばアメリカ側の iMac 10.0.1.111 から日本側の Mac mini 10.0.2.115 へ ping を送信すると、 ping の返事が Mac mini から帰ってきます。 ping のパケットは、 GRE トンネルの中を通って反対側の LAN に届くので、途中インターネットを通って太平洋を越えたことには気づいていません。

VPN 経由のルーティング2

次はアメリカ・日本に設定してある VoIP VLAN 用に静的ルートを設定した場合です。

これも IoT VLAN の場合とさほど変わりなく、アメリカ側ではビデオ会議の端末が VLAN 21 = 10.0.21.0/24 のサブネットにつながっています。日本側は VLAN 22 = 10.0.22.0/24 です。両拠点のルーターでお互いのサブネットを v6tun0 経由で送るよう静的ルートの設定をしているので、この2台のビデオ会議の端末はお互いの IP アドレスを指定するだけでビデオ会議ができます。またこの VLAN には他の端末が(レイヤー2レベルで)いないので、ビデオ会議の邪魔が入りにくくなります。

VPN 経由のドメイン名ルーティング

EdgeRouter は DNSmasq の ipset への IP アドレス記録機能と、 firewall > modify の Policy Based Routing 機能を組み合わせることで、ドメイン名でのルーティングができます。これと GRE トンネルを組み合わせると、なんと tver.jp や hulu.jp などの特定のドメイン名宛の通信のみ、自動的に VPN ( GRE ) 経由でルーティングさせることができます。

この例ではアメリカ側のルーターの DNSmasq で特定のドメイン名「bbb.com」の IP アドレスを ipset = XXXXX に記録させます。そして eth2 に Policy Based Routing を設定し、 ipset = XXXXX に載ってる IP アドレス宛の通信は、 v6tun0 経由でルーテングするように設定します。

すると LAN 内の端末からの bbb.com 宛の通信はすべて日本経由になります。また他のドメイン宛 aaa.com への通信はそのままアメリカ側の WAN 経由になります。この機能の利点は、

  1. LAN 内にいれば VPN が使えない端末でも地域制限のかかったサイトやコンテンツが観られること
  2. 各端末でいちいち VPN をオン・オフしなくていいこと
  3. 日本経由でなくていいサイトへのアクセスが遅くならないこと

です。

詳しい設定はこちらを見てください。ちなみに下記では IPv4 を使ってトンネルを設定してますが、 IPv6 を使えばループバックやら Policy Based IPsec などを使わずにもっと簡単に設定できます。

EdgeRouter X – 8. 自宅と実家の2つの LAN を拠点間 VPN でつなぐ ( GRE / IPsec )

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

レイヤー2 VPN

IP パケットを通すレイヤー3 VPN に対して、 Ethernet フレームを通すのがレイヤー2 VPN です。レイヤー3 VPN で LAN 同士をつなげるとその LAN 同士でルーティングできるようになります。それに対しレイヤー2 VPN で LAN 同士をつなぐと、まるで巨大なスイッチングハブで2つの LAN をつないだように2つの LAN が一体化します。そのため、 VPN を通じてレイヤー2レベルのプロトコルである DHCP や ARP 、 Airplay / Bonjour / mDNS や DLNA / SSDP などのマルチキャストも行き来できるようになります。レイヤー3 VPN はマルチキャストは通しません。我が家では日米両ルーター間に設けたレイヤー2 VPN トンネルを、ひかり TV のチューナーをアメリカで使ったり、日本に置いてあるピクセラの地デジチューナーをアメリカから観るのに使ってます。

概要はこんな感じです。

アメリカ 日本
VPN L2TPv3 l2tpeth0 L2TPv3 l2tpeth0
l2tpeth0 リモート IP 日本側 WAN IPv6 アメリカ側 WAN IPv6
l2tpeth0 ローカル IP アメリカ側 WAN IPv6 日本側 WAN IPv6
encapsulation ip (=protocol 115) ip (=protocol 115)
暗号化 IPsec Transport IPsec Transport

レイヤー2 VPN として L2TPv3 のトンネルを使っています。レイヤー2 VPN は Ethernet のフレームをそのままカプセル化してトンネルの反対側まで送れるのが特徴です。

設定は実は IPv6 GRE とあまり変わりません。同じように日米両方のルーターの WAN 側 IPv6 アドレスを使ってトンネルを作り、暗号化は GRE の時に作った Trasnport Mode IPsec の設定がそのまま L2TPv3 のパケットも暗号化してくれます。

L2TPv3 の encapsulation は UDP と IP の2つが選べますが、 IPv6 は NAT がないので、オーバーヘッドの少ない ip にしています。 ip にした場合は port 番号は無視されるようです。

違うところは、ブリッジです。上の図にあるように l2tpeth0 はルーター内で eth3 とブリッジされています。ブリッジとは乱暴に言えばソフトウェアのスイッチングハブです。つまり eth3l2tpeht0l2tpeth0eth3 がすべてスイッチングハブとして接続されているという感じです。つまり、もっと簡略化して言えば eth3eth3 が巨大なスイッチングハブになっていると言えます。(我が家ではこのスイッチングハブに特定の VLAN のみを通して使っており、実際には eth3.32eth3.32 が巨大なスイッチングハブになっています。詳しくは後ほど。)

このため、同じ LAN 内でしか動かない Airplay / Bonjor / mDNS や DLNA / SSDP のようなプロトコルが、太平洋を越えて行き来するようになります。

ちなみに IPv6 L2TPv3 トンネルを使うためには、両拠点で IPv6 ファイアウォールで L2TPv3 を通す設定が必要です。ファイアウォールで L2TPv3 のポート ( UDP 1701 等 ) を指定して通してもいいですが、我が家では両拠点の EdgeRouter と F660A のファイアウォールで両拠点の IPv6 のプレフィックスを通すように設定しています。

また、 L2TPv3 over IPv6 を安定して使うには firmware 2.0.9 以降がおすすめです。

では実際に我が家ではこれをどう使ってるか見てみましょう。

VLAN 32

日本側の EdgeSwitch 8 のポート8で PVID = 32 が設定され、そのポートと F660A の LAN 1 ポートがつながっています。これにより、 F660A を出たフレームには EdgeSwitch で VLAN 32 のタグがつきます。このフレームは eth3.32eth3.32 スイッチングハブを通り、アメリカ側まで運ばれます。アメリカ側の LAN でも VLAN 32 が設定されており、設定されたポート・端末だけにフレームが届きます。

アメリカに置いてあるひかり TV のチューナーが接続されているスイッチのポートには PVID = 32 が設定されているので、チューナには普通のタグ無しフレームとして VLAN 32 のデータが届きます。 VLAN 32 の経路はレイヤー2レベルで1つの LAN になっているので、F660A からチューナーまでマルチキャスト ( MLD ) が届きます。なので、ひかり TV が観られるというわけです。

もちろん両拠点を行き来する Ethernet フレームは L2TPv3 トンネルの中を通って反対側の LAN に届くので、途中インターネットを通って太平洋を越えたことには気づいていません。また メイン の LAN をレイヤー2で一体化させない理由は、日本からのマルチキャストを届かせる端末とそうでない端末をしっかり分けるためです。

日本に置いてあるピクセラの地デジチューナーも、アメリカ側で VLAN 32 に所属している端末からなら SSDP で発見でき観られます。アメリカ側の VLAN 32 にはひかり TV のチューナー以外にも Apple TV や iPad 、 Fire TV などの端末がつながっており、多種多様な端末から地デジが観られるようになっています。ピクセラの地デジチューナー PIX-BR320 / PIX-BR321NexTV-FDTCP+ 策定より前に出たので、 RTT = 7ms 以下の制限がなく、なので VPN 経由で地デジが観られます。

詳しい設定はこちらを見てください。ちなみに下記では IPv4 を使ってトンネルを設定してますが、 IPv6 を使えばもっと簡単です。

EdgeRouter 6P – 12. 自宅と実家を L2 VPN で一体化する ( L2TPv3 Bridging )

なーんだ、設定は数年前からブログに載ってたんですね!

ちなみに Airplay や DLNA は LAN 内の端末の発見にのみマルチキャストを使い、実際の映像配信にはユニキャストを使います。

対して、ひかり TV は映像配信そのものにもマルチキャスト ( MLD ) を使う画期的なシステムです。これは映像配信の消費帯域を減らすのにとても効率がいいのですが、そのかわり普通のスイッチングハブでは映像配信を必要としない端末や WiFi アクセスポイントにまで映像ストリームが送られてしまい、うまく LAN を設計しないと WiFi の輻輳などの問題が起こったりします。スイッチに MLD スヌーピング の機能があると、必要なポートにだけマルチキャストを送信してくれるようになります。

詳しいマルチキャストと MLD スヌーピングの仕組みはこちらを見てください。

MLD スヌーピングとひかり TV

他のレイヤー2 VPN

さらに、レイヤー2 VPN したいけどわざわざルーター買うのもなぁ、という人には、超絶高機能 VPN ソフトウェア群ソフトイーサがおすすめです。

アメリカと日本に PC か Mac を1台ずつ置いて、ソフトイーサ Server をインストールし、追加の USB-Ethernet アダプタローカルブリッジカスケード接続を使ってつなげれば、 USB-Ethernet – Mac – Mac – USB-Ethernet という巨大スイッチングハブが出来上がります。そして何よりもソフトイーサはどんなに困難な状況でもつながる様々な機能と強力な接続性、高いスループットがあるので、多分成功率は EdgeRouter より高いです。

ソフトイーサは、 VPN の難題を解決するありとあらゆる機能を備えています。内蔵の DDNSUDP ホールパンチング、ポート番号も選び放題、パケットのフラグメントによるスループット低下を減らす工夫、 NTP パケットにすら VPN を載せられる等々、絶対に VPN を成功させるソフトウェアになっています。しかも全部無料です。拠点間だけでなく、リモートアクセス VPN も L2TP / OpenVPN / SSTP に対応してます。極端な話、家に1台パソコンがあれば、ソフトイーサをインストールしておけばほぼ何でもできます。

最近ではフレッツ網内で万一 IPv6 プレフィックスが変わった時のための IPv6 DDNS を無料で提供してます。しかもこれフレッツ外の端末でも使えてしまいます。こんなにけしからんソフトウェアを次々に開発する登さんはほんとに凄いお方です・・。でも Mac には塩対応なんすよね・・。

そういえばソフトイーサはあの NTT 特殊局シン・テレワークの元になったソフトの1つです。

Mac を2台を使ったソフトイーサでのレイヤー2 VPN 設定の例はこちらを見てください。この記事では eth5eth5 が巨大スイッチングハブになってます。

EdgeRouter X – 番外編1. Mac と SoftEther で拠点間 L2 VPN を構築する

この時はまだ若かったので、両拠点のメイン LAN をがっつり合体させちゃってますね。ただしソフトイーサのフィルタリング機能で DHCP を遮断し、両拠点のルーターからの DHCP パケットが混ざらないようにしています。今であれば、アメリカ側の eth5 には日本のコンテンツを見るのに必要な一部の端末のみつなぐようにし、 eth5 をメインの LAN にはつながないようにすると思います。

おわりに

いやーお疲れ様でした。超難しかったすね。

2016 年に面白いルーターを見つけたなぁと始めた EdgeRouter の記事ですが、もう5年になるんですね。5年の間に色々なことがありましたが、 EdgeRouter にもやはり色々なことがありました。デビュー時こそ圧倒的な価格性能比を見せつけて世の中をあっと言わせた EdgeRouter ですが、最近は MIPS プラットフォームの時代遅れ感によりどうも先行きが怪しい気がします。 UniFi の方はもう ARM ベースになっちゃってますしね。ソフトウェアアップデートの出る速度も遅くなってきたような気がします。

だがしかし、様々なプロトコルが扱え、スループットもギガビット超え、そこそこの GUI があり、かつ Linux のコアの部分が自由にいじれて、それでいてオンラインで普通に買えるルーターが他になかなかないのも事実です。我が家はまだしばらく EdgeRouter のお世話になりそうです。他に L2TPv3 と eap_proxy が使えるイケてるルーターをご存知の方はぜひお知らせください。


yabe.jp » Gadgets » EdgeRouter 6P – 13. 超難しい VPN