概要
Hyper-V上で動作しているProxmox VE上でLinuxコンテナを使用し、VyOSルーターを介してWireGuardとVXLANを設定することで、異なる拠点間のセキュアな通信を実現します。また、パケットロスのシミュレーションとiperfを使用したスループット試験により、パケットロスが発生した際のパフォーマンスへの影響評価を行います。
構成の説明
1. Proxmox VE
- Proxmox VE: この仮想化プラットフォーム上で、各拠点の仮想マシン(VM)や仮想コンテナ(CT)を管理・運用します。
2. 仮想コンテナ
- Site A (192.168.100.10): Proxmox VE上に構築された仮想コンテナで、拠点Aを模擬します。
- Site B (192.168.100.20): Proxmox VE上に構築された仮想コンテナで、拠点Bを模擬します。
3. VyOSルーター
- VyOS A: Site Aのネットワークを管理し、WireGuardおよびVXLANを介してSite Bとの通信を担当する仮想ルーターです。
- VyOS B: Site Bのネットワークを管理し、WireGuardおよびVXLANを介してSite Aとの通信を担当する仮想ルーターです。
4. WireGuardトンネル
- WireGuard Tunnel: VyOS AとVyOS Bの間に確立されたセキュアなVPNトンネルです。これにより、2つの拠点間で暗号化された通信が可能になります。
5. VXLAN
- VXLAN A (192.168.100.1/24): VyOS A側のVXLANインターフェースで、仮想ネットワークを形成します。
- VXLAN B (192.168.100.2/24): VyOS B側のVXLANインターフェースで、仮想ネットワークを形成します。これにより、拠点間のレイヤ2トラフィックをカプセル化して転送します。
ネットワークパスの例
-
Site AのコンテナからSite Bのコンテナへの通信:
- Site Aのコンテナ(192.168.100.10)がSite Bのコンテナ(192.168.100.20)にパケットを送信。
- パケットはVyOS Aのeth1インターフェース(192.168.100.1)に送られる。
- VyOS AはパケットをVXLANインターフェースを介してWireGuardトンネルにカプセル化して、VyOS Bに送信。
- VyOS Bはパケットを受け取り、VXLANインターフェースを介してパケットをデカプセル化し、eth1インターフェース(192.168.100.2)を介してSite Bのコンテナ(192.168.100.20)に転送。
検証
実際に実施した結果を以下に示します。
1. 仮想ブリッジの作成
まず、新しい仮想ブリッジを作成します。これらは後で使用しますが、現在はインターネット接続のために使用しません。
- ProxmoxのWeb GUIにログイン
-
Datacenter -> Node -> Network -> Create -> Linux Bridge
-
Bridge Name:
vmbr20
- Bridge Ports: (空白のまま)
-
コメント:
Bridge for Site A
-
Bridge Name:
- 同様にして、Bridge Name:
vmbr21
を作成-
コメント:
Bridge for Site B
-
コメント:
- 同様にして、Bridge Name:
vmbr30
を作成-
コメント:
Bridge for Wireguard Tunnel
-
コメント:
2. コンテナ用のテンプレートのダウンロード
- ProxmoxのWeb GUIにログイン
-
ストレージの選択
-
local
->CT Templates
->Templates
-
-
テンプレートのダウンロード
- Ubuntuテンプレート(例えば、
ubuntu-20.04-standard_20.04-1_amd64.tar.gz
)をダウンロード
- Ubuntuテンプレート(例えば、
3. 各拠点のコンテナ作成
-
新しいコンテナの作成
- Create CTを選択し、各拠点用のコンテナを作成します。
Site Aのコンテナ
- Hostname: site-a
- Password: 適当なパスワードを設定
- Template: 先ほどダウンロードしたUbuntuテンプレートを選択
-
Resources:
- CPU: 1
- Memory: 512MB
- Disk: 5GB
-
Network:
- Bridge: vmbr0
- IP Address: DHCP (自動取得)
Logical volume "vm-100-disk-0" created.
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: 8017ce01-4247-4b14-afcc-1d99da5193ba
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
extracting archive '/var/lib/vz/template/cache/ubuntu-20.04-standard_20.04-1_amd64.tar.gz'
Total bytes read: 669050880 (639MiB, 147MiB/s)
Detected container architecture: amd64
Creating SSH host key 'ssh_host_dsa_key' - this may take some time ...
done: SHA256:iA68pRsz0bexRpXg3D9bLqLBSVsFPJDEsPIF2Sw5JGU root@site-a
Creating SSH host key 'ssh_host_ed25519_key' - this may take some time ...
done: SHA256:+RDnH1jZyAb+sG+g+JUVbvWqkMRwQAXaAv41oMbMIaU root@site-a
Creating SSH host key 'ssh_host_rsa_key' - this may take some time ...
done: SHA256:n+y/tWeloXx/43qDARyhcPWkbQqrrfOe9JMDUsRayG8 root@site-a
Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ...
done: SHA256:J4bJpLUqQBmVx+p7ce0to3iHnUqHN5Is2AFQE0dxo/A root@site-a
TASK OK
Site Bのコンテナ
- Hostname: site-b
- Password: 適当なパスワードを設定
- Template: 先ほどダウンロードしたUbuntuテンプレートを選択
-
Resources:
- CPU: 1
- Memory: 512MB
- Disk: 5GB
-
Network:
- Bridge: vmbr0
- IP Address: DHCP (自動取得)
Logical volume "vm-101-disk-0" created.
Creating filesystem with 1310720 4k blocks and 327680 inodes
Filesystem UUID: 87d39ac4-08a8-4ed7-8caa-dba4e6d86e7f
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
extracting archive '/var/lib/vz/template/cache/ubuntu-20.04-standard_20.04-1_amd64.tar.gz'
Total bytes read: 669050880 (639MiB, 147MiB/s)
Detected container architecture: amd64
Creating SSH host key 'ssh_host_dsa_key' - this may take some time ...
done: SHA256:iaHkz/7mCrloaWXcx3oWOdCr85nOIIsTiOSjwdd8J5E root@site-b
Creating SSH host key 'ssh_host_rsa_key' - this may take some time ...
done: SHA256:ubSiQxGdtLGSjA7GhIUnUTxE1eDoChS+OWFI+DSoYHU root@site-b
Creating SSH host key 'ssh_host_ed25519_key' - this may take some time ...
done: SHA256:YvTsz+8/W8ycew/mrd7T1UIB1Ncdj8/NOVCpETAonRk root@site-b
Creating SSH host key 'ssh_host_ecdsa_key' - this may take some time ...
done: SHA256:p1OLKBjlfqpedvU3Mw6HIx8DfRLt7LvS5++dzvItm8I root@site-b
TASK OK
4. コンテナの起動と基本設定
-
コンテナを起動
- 各コンテナを起動し、コンソールにアクセスします。
-
コンテナ内で基本的なネットワーク設定を確認
- 各コンテナがインターネットにアクセスできることを確認します。
ping google.com
- 各コンテナがインターネットにアクセスできることを確認します。
5. iperf3のインストール
-
iperf3のインストール
- 各コンテナ内でiperf3をインストールします。
apt update apt upgrade apt install iperf3
- 各コンテナ内でiperf3をインストールします。
6. コンテナのネットワークを本来の設定に変更
-
コンテナを停止
- 各コンテナを停止します。
pct stop <container-id>
- 各コンテナを停止します。
root@pve2:~# pct stop 100
root@pve2:~# pct stop 101
-
コンテナのネットワーク設定を変更
- ProxmoxのWeb GUIで、各コンテナのネットワーク設定を変更します。
-
Site A:
-
Bridge:
vmbr20
-
IP Address:
192.168.100.10/24
-
Gateway:
192.168.100.1
-
Bridge:
-
Site B:
-
Bridge:
vmbr21
-
IP Address:
192.168.100.20/24
-
Gateway:
192.168.100.1
-
Bridge:
-
- ProxmoxのWeb GUIで、各コンテナのネットワーク設定を変更します。
-
コンテナを起動
- 各コンテナを起動します。
pct start <container-id>
- 各コンテナを起動します。
root@pve2:~# pct start 100
root@pve2:~# pct start 101
7. VyOS仮想マシンの作成
-
VyOSの仮想マシンイメージのアップロード
- Proxmox VEにVyOSの仮想マシンイメージをアップロードします。
-
VyOS仮想マシンの作成
- Proxmox VEに新しい仮想マシンを作成し、VyOSのISOイメージを使用してインストールします。
- 必要なリソースを割り当てます(例:CPU 2コア、メモリ 1GB、ディスク 4GB)。
- ネットワークインターフェースを3つ追加し、以下のブリッジに接続します。
Site A側のVyOS:
-
vmbr0
: 管理用インターフェース -
vmbr20
:Site Aとの接続用インターフェース -
vmbr30
: WireGuardトンネル用インタフェース
Site B側のVyOS:
- vmbr0
: 管理用インターフェース
- vmbr21
:Site Bとの接続用インターフェース
- vmbr30
: WireGuardトンネル用インタフェース
-
VyOSのインストール
VyOSにログインし、ローカルディスクにインストールします。sudo su install image
インストール終了後、再起動します。
sudo su
install image
8. VyOSの設定
-
VyOSを起動
VyOSを起動し、設定モードに入ります。configure
-
インターフェース設定
Site A側のVyOS:
set interfaces ethernet eth0 address '192.168.11.60/24' # 管理用 set interfaces ethernet eth2 address '10.0.0.1/24' # WireGuardトンネル用
Site B側のVyOS:
set interfaces ethernet eth0 address '192.168.11.61/24' # 管理用 set interfaces ethernet eth2 address '10.0.0.2/24' # WireGuardトンネル用
両VyOS:
set service ssh commit
以上の設定で、インタフェースにアドレスが割り当てられ、SSHによる接続が可能となります。
-
WireGuardの鍵ペアを生成
VyOSのインストール後に公開鍵と秘密鍵を生成します。以下のコマンドを実行します。
sudo su mkdir /config/auth wg genkey | tee /config/auth/privatekey | wg pubkey > /config/auth/publickey
生成された鍵を表示します。
cat /config/auth/privatekey cat /config/auth/publickey
Site A側のVyOSで公開鍵と秘密鍵を生成し、同様にSite B側のVyOSでも生成します。
-
WireGuardのインターフェースを作成し、トンネルを設定
Site A側のVyOS:
configure set interfaces wireguard wg0 address '10.0.2.1/24' set interfaces wireguard wg0 mtu 9000 set interfaces wireguard wg0 peer SiteB-Node address '10.0.0.2' set interfaces wireguard wg0 peer SiteB-Node allowed-ips '10.0.2.2/32' set interfaces wireguard wg0 peer SiteB-Node allowed-ips '192.168.100.0/24' set interfaces wireguard wg0 peer SiteB-Node allowed-ips '10.0.0.2/32' set interfaces wireguard wg0 port SiteB-Node port 51820 set interfaces wireguard wg0 peer SiteB-Node public-key <Site Bの公開鍵> set interfaces wireguard wg0 port 51820 set interfaces wireguard wg0 private-key <Site Aの秘密鍵> commit
Site B側のVyOS:
configure set interfaces wireguard wg0 address '10.0.2.2/24' set interfaces wireguard wg0 mtu 9000 set interfaces wireguard wg0 peer SiteA-Node address '10.0.0.1' set interfaces wireguard wg0 peer SiteA-Node allowed-ips '10.0.2.1/32' set interfaces wireguard wg0 peer SiteB-Node allowed-ips '192.168.100.0/24' set interfaces wireguard wg0 peer SiteB-Node allowed-ips '10.0.0.1/32' set interfaces wireguard wg0 port SiteA-Node port 51820 set interfaces wireguard wg0 peer SiteA-Node public-key <Site Aの公開鍵> set interfaces wireguard wg0 port 51820 set interfaces wireguard wg0 private-key <Site Bの秘密鍵> commit
-
接続状況を確認
Site A側のVyOS:
vyos@vyos:~$ ping 10.0.2.2
PING 10.0.2.2 (10.0.2.2) 56(84) bytes of data.
64 bytes from 10.0.2.2: icmp_seq=1 ttl=64 time=0.477 ms
^C
--- 10.0.2.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.477/0.477/0.477/0.000 ms
vyos@vyos:~$ show interfaces wireguard wg0 summary
interface: wg0
public key: PQ93DhInSD+v9Npaa2zZRcPWDRD6TBY/4WPzV/U5MCA=
private key: (hidden)
listening port: 51820
peer: nenlEZwhPRFSB2coU6FEDzS7a2qWEyrX1zezOEsv+y8=
endpoint: 10.0.0.2:51820
allowed ips: 10.0.2.2/32, 192.168.100.0/24, 10.0.0.2/32
latest handshake: 58 seconds ago
transfer: 106.98 KiB received, 107.20 KiB sent
Site B側のVyOS:
vyos@vyos:~$ ping 10.0.2.1
PING 10.0.2.1 (10.0.2.1) 56(84) bytes of data.
64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=0.465 ms
^C
--- 10.0.2.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.465/0.465/0.465/0.000 ms
vyos@vyos:~$ show interfaces wireguard wg0 summary
interface: wg0
public key: nenlEZwhPRFSB2coU6FEDzS7a2qWEyrX1zezOEsv+y8=
private key: (hidden)
listening port: 51820
peer: PQ93DhInSD+v9Npaa2zZRcPWDRD6TBY/4WPzV/U5MCA=
endpoint: 10.0.0.1:51820
allowed ips: 10.0.2.1/32, 192.168.100.0/24, 10.0.0.1/32
latest handshake: 1 minute, 31 seconds ago
transfer: 118.80 KiB received, 118.87 KiB sent
Wireguard経由で接続できていることが確認できました。
技術的背景の説明
WireGuardとVXLANの連携について
WireGuardは、高速で簡潔なVPNプロトコルで、レイヤ3のトンネルを提供します。一方、VXLANはレイヤ2のカプセル化技術であり、異なる物理ネットワーク間で仮想ネットワークを拡張するために使用されます。WireGuardを使用してVXLANトラフィックを暗号化し、安全に転送することができます。この連携を実現するためには、適切な設定が必要です。
allowed-ipsの役割
WireGuardのallowed-ips
設定は、トンネルを通過するトラフィックの宛先アドレスを指定するために使用されます。allowed-ips
リストに含まれるIPアドレス宛のトラフィックはWireGuardトンネルを通過します。これにより、特定のネットワークセグメント間の通信を制御できます。
設定例
以下の設定例では、WireGuardインターフェースとVXLANインターフェースの連携を実現するために、allowed-ips
に特定のIPアドレスを追加しています。
wireguard wg0 {
address 10.0.2.2/24
mtu 9000
peer Site-A-Node {
address 10.0.0.1
allowed-ips 10.0.2.1/32
allowed-ips 192.168.100.0/24
allowed-ips 10.0.0.1/32
port 51820
public-key PQ93DhInSD+v9Npaa2zZRcPWDRD6TBY/4WPzV/U5MCA=
}
port 51820
}
allowed-ipsに10.0.0.1/32を追加する理由
allowed-ips
に10.0.0.1/32
を追加する理由は、WireGuardトンネルのエンドポイントである10.0.0.1
への通信を許可するためです。これにより、VXLANトンネルを介したトラフィックが正しく転送されます。
- 10.0.2.1/32: WireGuardトンネルの対向側のインターフェースアドレスです。トンネル内での通信を可能にします。
- 192.168.100.0/24: VXLANネットワークのアドレス範囲です。この範囲内のトラフィックがWireGuardトンネルを通過するようにします。
- 10.0.0.1/32: WireGuardトンネルのエンドポイントアドレスです。このアドレスを追加することで、VXLANトラフィックがトンネル内を通過する際に必要なARPリクエストやレスポンスが適切に処理されます。
MTU設定について
MTU(Maximum Transmission Unit)は、ネットワークインターフェースが一度に送信できる最大のパケットサイズを指定します。VXLANやWireGuardなどのカプセル化技術を使用する場合、追加のヘッダーオーバーヘッドを考慮してMTUを調整する必要があります。
-
WireGuardのMTU設定:
- WireGuardのMTUを9000に設定することで、カプセル化されたVXLANトラフィックを効率的に転送できます。
まとめ
この設定により、WireGuardとVXLANの連携が実現され、暗号化されたトラフィックが安全に転送されます。allowed-ips
に10.0.0.1/32を追加することで、VXLANトラフィックが正しく転送され、ネットワーク間の通信が確立されます。この技術的背景を理解することで、適切なネットワーク設計とトラブルシューティングが可能になります。
-
VXLANの設定
VXLANインタフェースvxlan0を作成した後、ブリッジインタフェースvr0にvxlan0とeth1を所属させます。
このブリッジにアドレスを割り当てることで、VXLAN経由での通信が可能となります。Site A側のVyOS:
set interfaces vxlan vxlan0 mtu 1500 set interfaces vxlan vxlan0 remote 10.0.2.2 set interfaces vxlan vxlan0 source-address 10.0.2.1 set interfaces vxlan vxlan0 source-interface wg0 set interfaces vxlan vxlan0 vni 100 set interface bridge br0 address 192.168.100.1/24 set interface bridge br0 member interface eth1 set interface bridge br0 member interface vxlan0 commit
Site B側のVyOS:
set interfaces vxlan vxlan0 mtu 1500 set interfaces vxlan vxlan0 remote 10.0.2.1 set interfaces vxlan vxlan0 source-address 10.0.2.2 set interfaces vxlan vxlan0 source-interface wg0 set interfaces vxlan vxlan0 vni 100 set interface bridge br0 address 192.168.100.1/24 set interface bridge br0 member interface eth1 set interface bridge br0 member interface vxlan0 commit
技術的背景の説明
VXLAN(Virtual Extensible LAN)について
VXLANは、レイヤ2フレームをレイヤ3ネットワークを通じてカプセル化する技術です。これにより、異なる物理ネットワーク間で仮想ネットワークを拡張することができます。VXLANは、以下の技術的な特徴を持ちます。
- カプセル化: レイヤ2フレームは、VXLANヘッダー、UDPヘッダー、および外部IPヘッダーでカプセル化され、レイヤ3ネットワークを通過します。
- VNI(VXLAN Network Identifier): VXLANは、24ビットのVNIを使用して仮想ネットワークを識別します。これにより、同じ物理ネットワーク上で複数の仮想ネットワークを分離して運用できます。
- スケーラビリティ: VXLANは、16,777,216(2^24)個の異なる仮想ネットワークをサポートでき、従来のVLAN(最大4,096個)よりも大規模なネットワーク環境に対応できます。
ブリッジインターフェースの役割
ブリッジインターフェースは、複数のネットワークインターフェースをレイヤ2で接続し、一つの論理的なネットワークセグメントを形成する役割を果たします。VXLANインターフェースと物理インターフェース(例:eth1)をブリッジインターフェースに追加することで、以下の利点があります。
- レイヤ2トラフィックの拡張: ブリッジインターフェースにより、異なるネットワークセグメント間でレイヤ2トラフィックをシームレスに転送できます。
- 仮想マシンやコンテナの接続: 仮想マシンやコンテナが物理インターフェースに接続されている場合でも、VXLANトンネルを通じて他のネットワークセグメントと通信できるようになります。
MTU(Maximum Transmission Unit)の調整
MTUは、ネットワークインターフェースが一度に送信できる最大のパケットサイズを指定します。VXLANやWireGuardなどのカプセル化技術を使用する場合、追加のヘッダーオーバーヘッドを考慮してMTUを調整する必要があります。
- VXLANのオーバーヘッド: VXLANは36バイトの追加ヘッダー(外部IPヘッダー、UDPヘッダー、VXLANヘッダー)を使用します。
- WireGuardのオーバーヘッド: WireGuardは約88バイトの追加ヘッダー(外部IPヘッダー、UDPヘッダー、WireGuardの暗号化オーバーヘッド)を使用します。
これらのオーバーヘッドを考慮してMTUを設定することで、パケットフラグメンテーションを避け、ネットワークパフォーマンスを最適化できます。
実装例の背景
この具体的な実装例では、次の技術的なプロセスが行われます:
-
VXLANインターフェースの作成:
- 仮想ネットワークのトラフィックをカプセル化してレイヤ3ネットワークを通過させるためのインターフェースを設定します。
- VNIを設定することで、異なる仮想ネットワークを識別します。
-
ブリッジインターフェースの作成:
- 複数のインターフェースをレイヤ2で接続し、一つの論理ネットワークセグメントを形成します。
- 物理インターフェース(eth1)とVXLANインターフェース(vxlan0)をブリッジに追加します。
-
IPアドレスの割り当て:
- ブリッジインターフェースにIPアドレスを割り当てることで、ネットワークセグメント間の通信を確立します。
まとめ
VXLANとブリッジインターフェースを組み合わせることで、異なる物理ネットワーク間で仮想ネットワークを拡張し、レイヤ2トラフィックを効率的に転送できます。MTU設定を適切に調整することで、カプセル化オーバーヘッドを考慮し、ネットワークパフォーマンスを最適化することが重要です。この技術的な背景を理解することで、VXLANを使用したネットワーク設計と実装がより効果的に行えます。
-
ルーティングの設定
Site A側のVyOS:
set protocols static route 192.168.100.0/24 next-hop 10.0.2.2
Site B側のVyOS:
set protocols static route 192.168.100.0/24 next-hop 10.0.2.1
-
設定の確認と保存
commit save exit
9. 回線のパケットロスのシミュレーション(ロス0%)
-
パケットロスのシミュレーション設定
- 各コンテナ内で
tc
(Traffic Control)コマンドを使用して、パケットロスをシミュレーションします。
Site Aのコンテナ:
Site AからSite Bへのパケットロス設定
tc qdisc add dev eth0 root netem loss 0%
- 各コンテナ内で
Site Bのコンテナ:
Site BからSite Aへのパケットロス設定
tc qdisc add dev eth0 root netem loss 0%
10. iperfによるスループット試験(ロス0%)
-
iperf3サーバの起動
- Site Bでiperf3サーバを起動します。
iperf3 -s
-
iperf3クライアントの実行
- Site Aからiperf3クライアントを実行してスループットを測定します。
iperf3 -c 192.168.100.20
本検証環境の場合、パケットロスがない状態のスループットは200Mbps程度であることが確認できました。
11. 回線のパケットロスのシミュレーション(ロス10%)
-
パケットロスのシミュレーション設定
- 各コンテナ内で
tc
(Traffic Control)コマンドを使用して、パケットロスをシミュレーションします。
Site Aのコンテナ:
Site AからSite Bへのパケットロス設定
tc qdisc del dev eth0 root tc qdisc add dev eth0 root netem loss 10%
Site Bのコンテナ:
Site BからSite Aへのパケットロス設定
tc qdisc del dev eth0 root tc qdisc add dev eth0 root netem loss 10%
- 各コンテナ内で
12. iperfによるスループット試験(ロス10%)
-
iperf3サーバの起動
- Site Bでiperf3サーバを起動します。
iperf3 -s
-
iperf3クライアントの実行
- Site Aからiperf3クライアントを実行してスループットを測定します。
iperf3 -c 192.168.100.20
本検証環境の場合、パケットロスが10%ある状態のスループットは数Mbps程度であることが確認できました。