OpenWrt で VXLAN over WireGuard

FriendlyElec の NanoPi R6SNanoPi R5S を使って、IPv4ネットワーク上にLayer 2 (L2)トンネルをオーバーレイし、サイト間をL2ブリッジする設定をした。設定を備忘録として残しておく。これまで、SoftEther を使った Layer 2 Virtual Private Network (L2VPN)によって Layer 2 ブリッジを設定していたが、Dynamic DNSへの登録が使えなくなったので、サーバーは固定IPアドレスを使うことにし、それを機会に WireGuard と VXLANで L2ブリッジ を設定することにした。

環境

WireGuardサーバーに NanoPi R6S、クライアントに NanoPi R5Sに利用してみた。

  • ファームウェアバージョン: OpenWrt 22.03
  • カーネルバージョン: 5.10.110

設定の基本

次の図に示すように、サイト間をつなぐIPv4ネットワーク上にWireGuard でL3 Tunnel を構築し、その上に VXLANで L2 Tunnel を構築する。

以下では OpenWrt の LuCI 画面のスクリーンショットを示す。

サーバー側

WireGuard のサーバーの設定を行う。インタフェース WG0 によって、WireGuardサーバを設定する。WireGuardによって確立した固定IPアドレスの間を インタフェースVX0によって VXLANの L2 Tunnelを設定する。

L2 Tunnel と LANポート eth1をブリッジするために、ブリッジデバイス br-vpnを構築し、そのインタフェースとして L2VPNを設定した。

interfaces

WireGuardのWG0、VXLANのVX0、ブリッジのL2VPN (br-vpn)を追加している。

インタフェース WG0

WireGuardは、キーを生成し、保存しておく。クライアントでのpeerの設定時に使う必要がある。

サーバーのリッスンポートはデフォルトの 51820 を使った。

WireGuardによって構築した L3 Tunnel のサーバー側のIPアドレスは、192.168.99.100/24 とした。

WireGuardのヘッダのオーバーヘッドのため、MTUは1420にしている。

ファイアウォールは、WG0とVX0のためのファイアウォールゾーン wg を作成し、それを設定した。

DHCPサーバは使用していないので設定していない。

 

WireGuardのpeerの設定

peerはWG1としている。ここでは、WG1のキーペアは生成済みで、それを使ってWG1の公開鍵を設定している。

許可されたIPは、何でも通すということにして、0.0.0.0/0 としている。

インタフェース VX0

VXLAN は、WireGuardで設定したVPN上でリモートIPv4アドレスに 192.168.99.101に対して設定した。ちなみに、ローカルIPv4アドレスは 192.168.99.100 である。

宛先ポートはデフォルトの 4789 とした。また、VXLANネットワーク識別子は88としている。

一般設定の「インタフェースをバインド」に eth1 を指定して、eth1 をVXLANによる L2 Tunnelの端点になるようにしようと試みたがうまく動作しなかったため、ブリッジデバイス br-vpnを作成し、それで eth1 と vx0 をブリッジするようにした。

ファイアウォールは、WG0と同じファイアウォールゾーン wg に設定した。

詳細設定、DHCPサーバは設定していない。

 

インタフェース L2VPN

L2 ブリッジを行うための デバイス br-vpn を unmanaged で設定する。

詳細設定、ファイアウォール、DHCPサーバーは設定していない。

 

インタフェース LAN

ブリッジデバイスである br-lan のインタフェース LAN は基本的にデフォルトのままである。

IPv4アドレスは 192.168.2.1/24 である。

ファイアウォールは、LANにデフォルトのゾーン lan を設定したままである。

DHCPサーバーはデフォルト通り使用している。今回の設定では、IPv6の設定は行っていない。

   

インタフェース WAN

WireGuardサーバをIPv4アドレスでアクセスできるようにするために、固定IPアドレス(静的アドレス)を設定している。デバイスは eth2 (R6Sの WANポート)を使用した。

IPアドレスは 10.X.Y.32/16 とした。実際の環境に合わせて設定することが必要である。静的アドレスを使っており、DHCPサーバーは使っていない。

ファイアウォールはデフォルトの wan ゾーンを使っている。

devices

br-vpn で eth1 と VX0 をブリッジする設定が必要である。

デバイス br-lan

ブリッジデバイス br-lan は、ブリッジポートを eth0 (R6SのLAN1ポート) のみにする。eth1 (R6SのLAN2ポート) は、br-vpn で利用するためである。

詳細オプションやブリッジVLANフィルタリングは変更していない。

 

デバイス br-vpn

VXLANデバイスである VX0 と イーサネットポート eth1 (R6SのLAN2ポート) をブリッジするために br-vpn という名称のブリッジデバイスを作成した。

ブリッジデバイスを作成して、ブリッジするようにしないと eth1 と VX0 でブリッジすることができなかった。

デバイスの詳細オプションやブリッジVLANフィルタリングは変更していない。

 

デバイス VX0

VXLANプロトコルのインタフェース VX0 を作成すると、ネットワークデバイス VX0 が自動的に作成される。

デバイスの詳細オプションやブリッジポート用オプションは変更していない。

 

デバイス WG0

WireGuardプロトコルのインタフェース WG0 を作成すると、ネットワークデバイス WG0 が自動的に作成される。

デバイスの詳細オプションは変更していない。

 

Firewall

VXLANとイーサネットポートのためにファイアウォールのゾーン wg を追加した。

lan、wan、docker は初期状態からあるゾーンである。docker はdocker を含んでいないファームウェアの場合には含まれていないと思われる。この VXLAN over WireGuardでは docker は使っていない。

ポートフォワーディング、トラフィック・ルール、NATルールは変更していない。

 

ファイアウォールゾーン wg

ファイアウォールのゾーン wgは、インタフェース VX0と インタフェース WG0 の間での通信のために追加した。

受信、送信、転送を許可した。宛先ゾーンへの転送や送信元ゾーンからの転送は未設定である。

ファイアウォールゾーン lan

ファイアウォールゾーン lan は、インタフェース LAN (コンソールを接続)のためのファイアウォールゾーンである。

ファイアウォールゾーン wan

ファイアウォールゾーン wan は、インタフェース WAN (インターネットへの接続)のためのファイアウォールゾーンである。

クライアント側

WireGuard のクライアントの設定を行う。インタフェース WG1 によって、WireGuardサーバに接続する。WireGuardによって確立した固定IPアドレスの間を インタフェースVX1によって VXLANの L2 Tunnelを設定する。

L2 Tunnel と LANポート eth1をブリッジするために、ブリッジデバイス br-vpnを構築し、そのインタフェースとして L2VPNを設定した。

interfaces

WireGuardのWG1、VXLANのVX1、ブリッジのL2VPN (br-vpn)を追加している。

インタフェース WG1

WireGuardは、秘密鍵と公開鍵のキーペアを生成し、保存しておく。サーバーでのpeerの設定時に使う必要がある。

サーバーのエンドポイントホストのIPアドレスは、サーバーのWANポートのeth2 のIPアドレスを設定し、エンドポイントポートは 51820 を使った。

WireGuardによって構築した L3 Tunnel のクライアント側のIPアドレスは、192.168.99.101/24 とした。

WireGuardのヘッダのオーバーヘッドのため、MTUは1420にしている。

ファイアウォールは、WG1とVX1のためのファイアウォールゾーン wg を作成し、それを設定した。

DHCPサーバは使用していないので設定していない。

 

WireGuardのpeerの設定

peerはサーバーであり、WG0としている。ここでは、サーバー側のWG0のキーペアは生成済みで、それを使ってWG0の公開鍵を設定している。

許可されたIPは、何でも通すということにして、0.0.0.0/0 としている。

インタフェース VX1

VXLAN は、WireGuardで設定したVPN上でリモートIPv4アドレスにサーバー側のWG0のエンドポイントである 192.168.99.100に対して設定した。ちなみに、クライアント側のWG1のエンドポイントのローカルIPv4アドレスは 192.168.99.101 である。

宛先ポートはデフォルトの 4789 とした。また、VXLANネットワーク識別子は、サーバーと一致させる必要があり、88としている。

一般設定の「インタフェースをバインド」に eth1 を指定して、eth1 をVXLANによる L2 Tunnelの端点になるようにしようと試みたがうまく動作しなかったため、ブリッジデバイス br-vpnを作成し、それで eth1 と vx1 をブリッジするようにした。

ファイアウォールは、WG1と同じファイアウォールゾーン wg に設定した。

詳細設定、DHCPサーバは設定していない。

 

インタフェース L2VPN

L2 ブリッジを行うための デバイス br-vpn を unmanaged で設定する。

詳細設定、ファイアウォール、DHCPサーバーは設定していない。

インタフェース LAN

ブリッジデバイスである br-lan のインタフェース LAN は基本的にデフォルトのままである。

下のスクリーンショットではIPv4アドレスを 192.168.2.1/24 としている。サーバーと区別するためには別のセグメントを使った方が良いであろう。

ファイアウォールは、LANにデフォルトのゾーン lan を設定したままである。

DHCPサーバーはデフォルト通り使用している。今回の設定では、IPv6の設定は行っていない。

   

インタフェース WAN

WireGuardクライアントのWANポートのIPv4アドレスは固定である必要がないので、DHCPクライアントとして設定している。デバイスは eth0 (R5Sの WANポート)を使用した。R5SとR6SでイーサネットLANポートの番号が異なって混乱しやすい。

ファイアウォールはデフォルトの wan ゾーンを使っている。

 

devices

br-vpn で eth1 と VX1 をブリッジする設定が必要である。

デバイス br-lan

ブリッジデバイス br-lan は、ブリッジポートを eth2 (R5SのLAN1ポート) のみにする。eth1 (R5SのLAN2ポート) は、br-vpn で利用するためである。

詳細オプションやブリッジVLANフィルタリングは変更していない。

 

デバイス br-vpn

VXLANデバイスである VX1 と イーサネットポート eth1 (R5SのLAN2ポート) をブリッジするために br-vpn という名称のブリッジデバイスを作成した。

ブリッジデバイスを作成して、ブリッジするようにしないと eth1 と VX1 でブリッジすることができなかった。

デバイスの詳細オプションやブリッジVLANフィルタリングは変更していない。

 

デバイス VX1

VXLANプロトコルのインタフェース VX1 を作成すると、ネットワークデバイス VX1 が自動的に作成される。

デバイスの詳細オプションやブリッジポート用オプションは変更していない。

デバイス WG1

WireGuardプロトコルのインタフェース WG1 を作成すると、ネットワークデバイス WG1 が自動的に作成される。

デバイスの詳細オプションは変更していない。

Firewall

VXLANとイーサネットポートのためにファイアウォールのゾーン wg を追加した。

lan、wan、docker は初期状態からあるゾーンである。docker はdocker を含んでいないファームウェアの場合には含まれていないと思われる。この VXLAN over WireGuardでは docker は使っていない。

ポートフォワーディング、トラフィック・ルール、NATルールは変更していない。

 

ファイアウォールゾーン wg

ファイアウォールのゾーン wgは、インタフェース VX1と インタフェース WG1 の間での通信のために追加した。

受信、送信、転送を許可した。宛先ゾーンへの転送や送信元ゾーンからの転送は未設定である。

 

ファイアウォールゾーン lan

ファイアウォールゾーン lan は、インタフェース LAN (コンソールを接続)のためのファイアウォールゾーンである。

ファイアウォールゾーン wan

ファイアウォールゾーン wan は、インタフェース WAN (インターネットへの接続)のためのファイアウォールゾーンである。