EdgeRouter X – 14. L2 VPN アプライアンスとして使う

さて今回は EdgeRouter X をレイヤー2 VPN アプライアンスとして設定してみようと思います。 EdgeRouter X はハードウェア offload 対応かつ VPN や Firewall 機能も満載なので、これを活かして $59 の激安レイヤー2 VPN 専用端末として使ってやろうという魂胆です。

前回の記事ではルーターに EdgeRouter 6P を使い、ブリッジや VPN を使って日本の LAN をアメリカに延長するやり方を紹介しました。今回は EdgeRouter X にブリッジと VPN を設定して、自宅でお使いのルーターにそのまま繋ぐだけで手軽に LAN の延長ができるようにしてみます。概要はこんな感じになります。

レイヤー2 VPN とは

Ethernet フレームをそのままカプセル化する VPN です。この VPN を使うと、自分の家の LAN ケーブルがそのまま VPN 接続先に延長されたようになり、レイヤー3 VPN では通らない様々なプロトコル、例えば DLNA / SSDP 、 AirPlay / mDNS やひかり TV の MLD マルチキャストなどが VPN を超えて行き来できるようになります。

ただ DHCP なども行き来してしまうので、既存の DHCP と問題を起こしたりしないよう適切にネットワークの設計をしたり、ファイアーウォールでフィルタリングしたり等注意が必要です。

レイヤー2 VPN アプライアンスとは

お使いのルーターにつないで使う、レイヤー2 VPN 専用のハードウェアです。既存のルーターに追加して使い、手軽に2拠点で LAN を延長できます。市販の製品としては下記のようなものがあります。価格は最低でも 10 万円〜となかなかのお値段です。

このような高いハードウェアを買わなくとも、 EdgeRouter X なら $59 で月額料金も不要です。

レイヤー2 VPN のプロトコル

レイヤー2 VPN として使うことができる、つまり Ethernet フレームをカプセル化できる VPN プロトコルには下記のようなものがあります。

今回はこの中で IPv6 でも使え、かつ設定の自由度が高い L2TPv3 を使います。なぜ IPv6 かと言うと、 IPv4 と違って必ずグローバル IP アドレスで、かつほぼ固定アドレスだからです。拠点間で VPN を使う場合は、 NAT の必要のない、固定のグローバル IP アドレスが使えると設定がとても簡単になります。

もちろん IPv4 の固定アドレスをたくさん持っていて、 EdgeRouter の eth0 に固定のグローバル IPv4 アドレスを割り当てられる人は IPv4 で全く問題ありません。また IPv6 が無く、また IPv4 アドレスがダイナミックな場合は、上記の EoGRE の設定で、 GRE bridge の代わりに L2TPv3 を使えば、設定はややこしいですが動作します。

レイヤー2 VPN に必要なもの

レイヤー2対応 VPN に Ethernet フレームを送るには、必ずその VPN インターフェースと既存の Ethernet インターフェースをブリッジ接続する必要があり、かつその Ethernet インターフェースが promiscuous モードで動作する必要があります。 EdgeRouter はどちらも対応しています。

ブリッジとは簡単に言うとソフトウェアで動作するスイッチングハブです。つまりブリッジ接続とは、インターフェイス同士をスイッチングハブでつなぐような接続です。ちなみに EdgeRouter X はブリッジもハードウェア offload 対応です。

やりたいこと

今回は、日本の実家の LAN をアメリカに延長し、アメリカの端末のうちいくつかを日本の LAN 所属にしてみます。この日本の LAN に所属した端末は、インターネットが全て日本経由になるので、 TVer や NHK+ が観られるようになります。また、日本の LAN と同じ LAN にいるように見えるので、日本に置いたピクセラの PIX-BR320 を使って地デジを観たり、ひかり TV のチューナー ST-3400 をアメリカで使ったりできるようになります。

EdgeRouter X の eth0 を LAN に接続する uplink として使います。そして eth1 を L2TPv3 インターフェースとブリッジ接続し、 Ethernet フレームが VPN を越えて行き来する窓口にします。この設定をした EdgeRouter X を既存のルーターに接続するだけで、反対側の EdgeRouter X に Ethernet フレームがそのまま送られる、レイヤー2 VPN のトンネルが使えるようになります。

前提条件

  • 日本とアメリカで IPv6 が使えること
  • 日本とアメリカで低遅延な光ファイバーが使えること
  • お使いのルーターのファイアウォールで、お互いの IPv6 アドレスもしくは IPv6 プリフィックスが通過するよう設定されていること
  • ファームウェアは 2.0.9 – hotfix.2
  • EdgeRouter X の eth0 を既存のルーターに、 eth1 を L2 VPN とブリッジ接続する

ルーター同士、そして EdgeRouter X 同士が IPv6 でお互いに Ping6 が通るようにお使いのルーターの Firewall を設定してください。片側だけしばらく時間が経つと通らなくなる、とかあるあるなので、時間をおいてしっかりどちらから Ping6 を打っても必ず通ることを確認しましょう。

設定する

それではアメリカ側の EdgeRouter X を設定してみます。初期設定が済んだ状態から設定します。


eth0 をルーターにつなぐ

EdgeRouter X の eth0 を既存のルーターに LAN ケーブルで接続します。そうすると eth0 に DHCP 経由でプライベート IP アドレスが割り当てられます。


eth4 に Mac をつないでログイン

EdgeRouter X の eth4 に設定で使う Mac を LAN ケーブルで接続し、 EdgeRouter X にログインします。


eth1 を switch0 から除外

ブリッジ接続に使う eth1switch0 から除外します。 Dashboard の switch0 の Actions > Config をクリックし、 eth1 のチェックを外して Save します。


ハードウェア offload を有効にする

ハードウェア offload 機能を有効にします。これにより IPv4 / IPv6 のフォワーディングやブリッジ等が高速になります。

configure
set system offload hwnat enable
commit
save

Firewall を外す

Basic Setup で設定された Firewall を外します。 IPv4 の Firewall は GUI の Firewall/NAT > Firewall Policies にある WAN_INWAN_LOCAL の Interface 欄で eth0 を削除し Save します。


IPv6 は Config Tree もしくは CLI で下記のように Firewall を eth0 から外します。

configure
delete interfaces ethernet eth0 firewall in ipv6-name WANv6_IN
delete interfaces ethernet eth0 firewall local ipv6-name WANv6_LOCAL
commit
save

今後は configure / commit / save は省略しますね。


IPv6 を設定する

eth0 で IPv6 が使えるように設定します。お使いのルーターで LAN 内の端末で IPv6 が使えるように設定が済んでいるものとします。

set interfaces ethernet eth0 ipv6 address autoconf

これでしばらく待つと、 eth0 に IPv6 アドレスが割り当てられます。お使いのプロバイダーによっては 10 分くらい待つ場合もあります。

フレッツ、 Nuro 光、 Comcast 、 AT&T Fiber ではこの設定で IPv6 が使えました。


わかりやすい IPv6 アドレスを設定する

割り当てられる IPv6 アドレスは長くてわかりにくいことが多いので、わかりやすいアドレスを同じプリフィックスで設定します。

例えば EdgeRouter X に割り当てられた IPv6 アドレスが 2601:11:222:3333:feec:daff:fe32:6618 だった場合、プリフィックスは 2601:11:222:3333 です。同じプリフィックスでわかりやすい好きなアドレスを追加します。ここでは 2601:11:222:3333::1:1 にします。

set interfaces ethernet eth0 address '2601:11:222:3333::1:1/64'

同じように日本側のわかりやすいアドレスは 2401:44:555:6666::1:1 と設定するとします。

この、手動で設定したわかりやすい IPv6 アドレスで問題が出る場合は、素直に autoconf (slaac) で割り当てられたアドレスを使ってください。

また忘れずに、お使いのルーターのファイアウォールでお互いのプリフィックスを用いたネットワークアドレス 2601:11:222:3333::/642401:44:555:6666::/64 を許可するようにあらかじめ設定しておいてください。


ブリッジインターフェースを作る

L2TPv3 と Ethernet をブリッジするためのブリッジインターフェース br0 を作ります。

set interfaces bridge br0
set interfaces bridge br0 multicast enable
set interfaces bridge br0 promiscuous enable

L2TPv3 インターフェースを作る

L2TPv3 のインターフェース l2tpeth0 を下記のように設定します。

set interfaces l2tpv3 l2tpeth0 description L2-VPN
set interfaces l2tpv3 l2tpeth0 destination-port 52000
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 local-ip '2601:11:222:3333::1:1'
set interfaces l2tpv3 l2tpeth0 mtu 1500
set interfaces l2tpv3 l2tpeth0 peer-session-id 2000
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 2000
set interfaces l2tpv3 l2tpeth0 remote-ip '2401:44:555:6666::1:1'
set interfaces l2tpv3 l2tpeth0 session-id 1000
set interfaces l2tpv3 l2tpeth0 source-port 51000
set interfaces l2tpv3 l2tpeth0 tunnel-id 1000

ブリッジ接続

eth1l2tpeth0br0 に登録します。

set interfaces ethernet eth1 bridge-group bridge br0
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

これでアメリカ側の基本的な設定が済みました。次は日本側を同じように設定します。


日本側を設定する

基本的には L2TPv3 のローカル・リモート IP とポート番号等を入れ替えるだけです。

configure
delete interfaces ethernet eth0 firewall in ipv6-name WANv6_IN
delete interfaces ethernet eth0 firewall local ipv6-name WANv6_LOCAL
set system offload hwnat enable
set interfaces ethernet eth0 ipv6 address autoconf
set interfaces bridge br0
set interfaces bridge br0 multicast enable
set interfaces bridge br0 promiscuous enable
commit
save

ここで IPv6 アドレスが割り当てられるのを待ちます。

configure
set interfaces ethernet eth0 address '2401:44:555:6666::1:1/64'
set interfaces l2tpv3 l2tpeth0 description L2-VPN
set interfaces l2tpv3 l2tpeth0 destination-port 51000
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 local-ip '2401:44:555:6666::1:1'
set interfaces l2tpv3 l2tpeth0 mtu 1500
set interfaces l2tpv3 l2tpeth0 peer-session-id 1000
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 1000
set interfaces l2tpv3 l2tpeth0 remote-ip '2601:11:222:3333::1:1'
set interfaces l2tpv3 l2tpeth0 session-id 2000
set interfaces l2tpv3 l2tpeth0 source-port 52000
set interfaces l2tpv3 l2tpeth0 tunnel-id 2000
set interfaces ethernet eth1 bridge-group bridge br0
set interfaces l2tpv3 l2tpeth72 bridge-group bridge br0
commit
save

これで日本側も済みました。

レイヤー2 VPN トンネルの完成

この状態で、日本側の eth1 を ルーターの LAN ポートか、同じ LAN 内のスイッチングハブに LAN ケーブルでつなぐと、その Ethernet フレームがアメリカ側の eth1 に届くようになります。つまり日本とアメリカが eth1eth1 経由の巨大なスイッチングハブでつながったことになります。

アメリカ側の eth1 に市販のスイッチングハブをつなぎ、そこにお好きな Fire TV や Apple TV をつなぎます。そうするとそれらの端末は L2TPv3 トンネルを越えて日本のルーターから DHCP でアドレスを受け取り、常時日本のルーターをゲートウェイとしてインターネットにアクセスするようになります。その代わり、アメリカのサイトも日本経由でアクセスするようになるので、遅くなります。2回も太平洋越えるからしょうがないですね。

この日本の eth1 をフレッツもしくは Nuro 光の IPv6 およびひかり TV 対応ルーターの LAN ポートにつなぎ、アメリカの eth1 をひかり TV チューナーにつなげば、アメリカでひかり TV が観られるようになります。我が家では更に高速な EdgeRouter 6P をルーターかつ VPN 終端として使っていますが、この EdgeRouter X の設定であればお使いのルーターを替えることなく使えるので、手軽です。

その他諸々

この設定で基本的にレイヤー2 VPN が使えるようになりますが、それに関連する諸々の設定をいくつか。


IPsec で L2TPv3 トンネルを暗号化する

L2TPv3 は VPN ではありますが、暗号化機能がありません。なので、 IPsec の transport mode を使ってトンネルを暗号化します。

アメリカ側:

configure

set system offload ipsec enable

set vpn ipsec allow-access-to-local-interface disable
set vpn ipsec auto-update 3600
set vpn ipsec auto-firewall-nat-exclude disable

set vpn ipsec ike-group IKE-1 ikev2-reauth no
set vpn ipsec ike-group IKE-1 key-exchange ikev2
set vpn ipsec ike-group IKE-1 lifetime 86400
set vpn ipsec ike-group IKE-1 proposal 1 dh-group 2
set vpn ipsec ike-group IKE-1 proposal 1 encryption aes256
set vpn ipsec ike-group IKE-1 proposal 1 hash sha1

set vpn ipsec esp-group ESP-2 compression disable
set vpn ipsec esp-group ESP-2 lifetime 43200
set vpn ipsec esp-group ESP-2 mode transport
set vpn ipsec esp-group ESP-2 pfs disable
set vpn ipsec esp-group ESP-2 proposal 1 encryption aes128
set vpn ipsec esp-group ESP-2 proposal 1 hash md5

set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' authentication id usa
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' authentication mode pre-shared-secret
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' authentication pre-shared-secret XXXXXXXX
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' authentication remote-id japan
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' connection-type initiate
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' description IPsec
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' ike-group IKE-1
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' ikev2-reauth inherit
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' local-address '2601:11:222:3333::1:1'
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer '2401:44:555:6666::1:1' tunnel 1 esp-group ESP-2

commit
save

日本側:

configure

set system offload ipsec enable

set vpn ipsec allow-access-to-local-interface disable
set vpn ipsec auto-update 3600
set vpn ipsec auto-firewall-nat-exclude disable

set vpn ipsec ike-group IKE-1 ikev2-reauth no
set vpn ipsec ike-group IKE-1 key-exchange ikev2
set vpn ipsec ike-group IKE-1 lifetime 86400
set vpn ipsec ike-group IKE-1 proposal 1 dh-group 2
set vpn ipsec ike-group IKE-1 proposal 1 encryption aes256
set vpn ipsec ike-group IKE-1 proposal 1 hash sha1

set vpn ipsec esp-group ESP-2 compression disable
set vpn ipsec esp-group ESP-2 lifetime 43200
set vpn ipsec esp-group ESP-2 mode transport
set vpn ipsec esp-group ESP-2 pfs disable
set vpn ipsec esp-group ESP-2 proposal 1 encryption aes128
set vpn ipsec esp-group ESP-2 proposal 1 hash md5

set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' authentication id japan
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' authentication mode pre-shared-secret
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' authentication pre-shared-secret XXXXXXXX
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' authentication remote-id usa
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' connection-type initiate
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' description IPsec
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' ike-group IKE-1
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' ikev2-reauth inherit
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' local-address '2401:44:555:6666::1:1'
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer '2601:11:222:3333::1:1' tunnel 1 esp-group ESP-2

commit
save

IPsec の offload の設定を変更した場合は、一度 EdgeRouter X を再起動するのが良さそうです。


不要なマルチキャストをフィルタリングする

この太平洋を越えるレイヤー2 VPN は便利ですが、どうしても遅延 = RTT が 100ms 以上になります。そのため SSDP や mDNS 等あまり遅延に強くないプロトコルでは問題が出ることもあります。その場合は Firewall を br0 に設定して、問題の起きるパケットを遮断します。下記では AirPlay / mDNS を遮断しています。

configure

set firewall name BRIDGE_IN default-action accept
set firewall name BRIDGE_IN rule 10 action drop
set firewall name BRIDGE_IN rule 10 description Drop-mDNS
set firewall name BRIDGE_IN rule 10 destination address 224.0.0.251
set firewall name BRIDGE_IN rule 10 destination port 5353
set firewall name BRIDGE_IN rule 10 protocol udp

set firewall ipv6-name BRIDGEv6_IN default-action accept
set firewall ipv6-name BRIDGEv6_IN rule 10 action drop
set firewall ipv6-name BRIDGEv6_IN rule 10 description Drop-mDNS
set firewall ipv6-name BRIDGEv6_IN rule 10 destination address 'ff02::fb'
set firewall ipv6-name BRIDGEv6_IN rule 10 destination port 5353
set firewall ipv6-name BRIDGEv6_IN rule 10 protocol udp

set interfaces bridge br0 firewall in name BRIDGE_IN
set interfaces bridge br0 firewall in ipv6-name BRIDGEv6_IN

commit
save

MSS-clamp を設定する

この L2TPv3 のトンネルでは L2TPv3 や IPsec のヘッダーが追加されるので、ペイロードの MTU が小さくなります。そこで MSS-clamp を設定します。

configure

set firewall modify mss-l2tpeth0 rule 10 action modify
set firewall modify mss-l2tpeth0 rule 10 description MSS-1240
set firewall modify mss-l2tpeth0 rule 10 modify tcp-mss 1240
set firewall modify mss-l2tpeth0 rule 10 protocol tcp
set firewall modify mss-l2tpeth0 rule 10 tcp flags 'SYN,!RST'

set interfaces bridge br0 firewall in modify mss-l2tpeth0

commit
save

ちなみに ipv6-modify は使うと IPv6 offload が無効になってしまうバグがあるので使ってません。


VLAN 対応 LT2Pv3

この L2TPv3 のトンネルはすべての VLAN を透過します。ただし br0 に設定した Firewall では VLAN = 1 にしか適用されません。各 VLAN にもフィルタリングを適用したい場合は、 Ethernet にしかるべき VLAN インターフェースを追加し、そこに VLAN 向けのブリッジと L2TPv3 トンネルを追加してブリッジ接続し、そのブリッジに Firewall を適用します。下記では VLAN 72 向けのトンネル・ブリッジを追加しています。

アメリカ側:

configure

set interfaces ethernet eth0 vif 72

set interfaces bridge br72
set interfaces bridge br72 multicast enable
set interfaces bridge br72 promiscuous enable

set interfaces l2tpv3 l2tpeth72 description L2-VPN
set interfaces l2tpv3 l2tpeth72 destination-port 52072
set interfaces l2tpv3 l2tpeth72 encapsulation udp
set interfaces l2tpv3 l2tpeth72 local-ip '2601:11:222:3333::1:1'
set interfaces l2tpv3 l2tpeth72 mtu 1500
set interfaces l2tpv3 l2tpeth72 peer-session-id 2072
set interfaces l2tpv3 l2tpeth72 peer-tunnel-id 2072
set interfaces l2tpv3 l2tpeth72 remote-ip '2401:44:555:6666::1:1'
set interfaces l2tpv3 l2tpeth72 session-id 1072
set interfaces l2tpv3 l2tpeth72 source-port 51072
set interfaces l2tpv3 l2tpeth72 tunnel-id 1072

set interfaces ethernet eth1.72 bridge-group bridge br72
set interfaces l2tpv3 l2tpeth72 bridge-group bridge br72

set interfaces bridge br72 firewall in name BRIDGE_IN
set interfaces bridge br72 firewall in ipv6-name BRIDGEv6_IN
set interfaces bridge br72 firewall in modify mss-l2tpeth0

commit
save

VLAN があるだけトンネルを増やすことになりますが、ともかくこれで VLAN 毎に細かくフィルタリングの設定ができるようになります。

スピード

iperf3 で測ると RTT = 110ms ぐらいの日米間で 60Mbit/s ぐらい出ました。ちなみに EdgeRouter 6P では 100Mbit/s くらいでした。

IPv6 Firewall

そういえば・・

IPv6 で L2TPv3 + IPsec (Transport) もしくは ip6gre + IPsec (Transport) を使う時には、当然 IPv6 Firewall でそれらのプロトコルが通るように設定します。

自分は IPv6 がほぼ固定であることをいいことに、お互いの IPv6 の /60 とか /56 プレフィックスを IPv6 Firewall で通るようにしてます。この時に 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

おわりに

とりあえず今使ってるルーターを EdgeRouter に替える予定はないけど、レイヤー2 VPN を手軽に使いたい、という場合にぴったりの設定かと思います。 EdgeRouter X は1万円でお釣りがくるので、小型 VPN アプライアンスとしてはかなりのコストパフォーマンスです。

一応整合性があるように設定を載せましたが、もし間違いに気づいた場合は、ぜひコメント欄でご指摘ください。ではでは。


yabe.jp » Gadgets » EdgeRouter X – 14. L2 VPN アプライアンスとして使う