2026年8月1日
2026年8月1日
VXLAN を設定する方法|Linux で2台以上のホストをL2でつなぐ手順とMTU・セキュリティの注意点
VXLAN は、L2のイーサネットフレームをUDPで包んで運び、離れたホスト同士を同じL2セグメントにいるかのようにつなぐ仕組みです。Linux では ip link だけで設定でき、2台を結ぶだけなら数行で動きます。ただし、MTUの計算、宛先ポートの指定、暗号化されないことへの対策を押さえないと、「pingは通るのに大きな通信だけ止まる」「意図しない相手からフレームを注入される」といった問題が起きます。この記事では、Linux で VXLAN を設定する手順を、2台の構成から3台以上への広げ方、恒久設定、確認方法まで順に説明します。
VXLAN の基本用語
- VNI(VXLAN Network Identifier):VXLAN のセグメントを区別する番号です。24ビットあるため、VLAN ID(約4,000個)よりはるかに多くのセグメントを作れます。
- VTEP(VXLAN Tunnel End Point):フレームをUDPに包んだり取り出したりする端点です。Linux では VXLAN インターフェースがこの役割を担います。
- アンダーレイとオーバーレイ:ホスト同士が実際に通信しているIPネットワークがアンダーレイ、その上に作るL2セグメントがオーバーレイです。アンダーレイでホスト同士がIPで通信できることが前提になります。
- UDP 4789:IANA に登録された VXLAN の標準ポートです。
VXLAN そのものには、相手の認証や通信の暗号化の仕組みがありません。この点は後の「セキュリティ」で扱います。
設定前に決めること
ここでは次の構成を例にします。
- ホストA:アンダーレイのIP
10.0.0.1(インターフェースeth0) - ホストB:アンダーレイのIP
10.0.0.2(インターフェースeth0) - VNI:100
- オーバーレイのサブネット:
172.16.100.0/24(ホストAが.1、ホストBが.2)
オーバーレイのサブネットは、アンダーレイや既存のLANと重ならない範囲を選びます。重なると経路が曖昧になり、どちらに流れているのかの切り分けが難しくなります。
手順1:2台を VXLAN でつなぐ
ホストAで次を実行します。
sudo ip link add vxlan100 type vxlan id 100 \
local 10.0.0.1 remote 10.0.0.2 dstport 4789 dev eth0
sudo ip link set vxlan100 mtu 1450
sudo ip addr add 172.16.100.1/24 dev vxlan100
sudo ip link set vxlan100 up
ホストBでは、local と remote を入れ替え、アドレスを 172.16.100.2/24 にして同じように実行します。
dstport 4789 は省略しないでください。Linux では宛先ポートを指定しないと、標準の4789ではなくカーネルの既定値(歴史的な経緯で別の番号)が使われることがあり、他の機器や片方だけ指定したホストとつながらない原因になります。
設定できたら、状態を確認して疎通を試します。
ip -d link show vxlan100 # vxlan id 100、remote、dstport 4789 が表示されるか
ping -c 3 172.16.100.2 # ホストAからホストBのオーバーレイ側へ
この時点の設定は再起動で消えます。リモートで作業する場合も、アンダーレイ側の eth0 には手を入れないので、管理用の接続が切れる心配は小さい手順です。
手順2:MTU を合わせる
VXLAN では、元のフレームに外側のイーサネット・IP・UDP・VXLAN ヘッダーが付きます。アンダーレイがIPv4の場合は合計で50バイト増えるため、アンダーレイのMTUが1500なら、オーバーレイ側は1450にします。アンダーレイがIPv6の場合はさらに20バイト増えて70バイトになります。
MTUが合っていないと、小さなpingは通るのに、SSHでの大きな出力、ファイル転送、HTTPSの通信だけが止まる、という症状になります。断片化を禁止したpingで、上限ちょうどのサイズが通るかを確認します。
# 1450 - 20(IP) - 8(ICMP) = 1422 バイトのデータで、断片化禁止の ping
ping -M do -s 1422 -c 3 172.16.100.2
これが通り、-s 1423 で失敗すれば、MTUは想定どおりです。アンダーレイ自体を WireGuard などのトンネルにする場合は、そのトンネルのMTUからさらに50バイトを引いた値にします。仮想マシンやコンテナをオーバーレイにつなぐ場合は、そちら側のインターフェースのMTUも揃えます。
手順3:ファイアウォールで UDP 4789 を絞る
アンダーレイの経路で UDP 4789 が通る必要があります。同時に、VXLAN には認証がないため、このポートを誰からでも受け付けると、外部から偽のフレームを送り込まれるおそれがあります。相手のVTEPのIPだけを許可します。
# ufw の例(ホストAで、ホストBからだけ受け付ける)
sudo ufw allow from 10.0.0.2 to any port 4789 proto udp
クラウド上のVMで使う場合は、セキュリティグループなどでも同じ条件で許可します。なお、Docker Swarm の overlay ネットワークも UDP 4789 を使います。同じホストで両方を使う場合は、ポートが衝突しないかを事前に確認してください。
手順4:3台以上に広げる
3台以上を同じVNIでつなぐ場合は、remote を指定せずにインターフェースを作り、宛先のVTEPを転送テーブル(FDB)に1つずつ登録します。全ゼロのMACアドレスで登録したエントリーは、宛先が分からないフレーム(ブロードキャストなど)の送り先として使われます。
# ホストA(10.0.0.1)での例。ホストB・Cを登録する
sudo ip link add vxlan100 type vxlan id 100 local 10.0.0.1 dstport 4789 dev eth0
sudo bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 10.0.0.2
sudo bridge fdb append 00:00:00:00:00:00 dev vxlan100 dst 10.0.0.3
# 登録内容を確認
bridge fdb show dev vxlan100
各ホストで、自分以外のすべてのVTEPを登録します。ホストを足すたびに全台の設定変更が必要になるため、台数が増える場合は、BGP EVPN(FRRouting などで構成)を使ってVTEPやMACアドレスの情報を自動で交換する方式が検討対象になります。こちらは設計と運用の負担が大きいので、まずは数台で静的な構成を試し、必要になってから移行するのが現実的です。
仮想マシンやコンテナをつなぐ
VXLAN インターフェースをLinuxブリッジに参加させると、同じブリッジにつないだ仮想マシンやコンテナが、別ホストの機器と同じL2セグメントに入ります。
sudo ip link add br100 type bridge
sudo ip link set vxlan100 master br100
sudo ip link set br100 up
この場合、オーバーレイのIPアドレスは vxlan100 ではなく br100(またはその先の仮想マシン)に設定します。
手順5:恒久的な設定にする
ip link の設定は再起動で消えるため、確認できたら使っているネットワーク管理の仕組みで書き直します。systemd-networkd の例です。
# /etc/systemd/network/30-vxlan100.netdev
[NetDev]
Name=vxlan100
Kind=vxlan
MTUBytes=1450
[VXLAN]
VNI=100
Local=10.0.0.1
Remote=10.0.0.2
DestinationPort=4789
# /etc/systemd/network/30-vxlan100.network
[Match]
Name=vxlan100
[Network]
Address=172.16.100.1/24
あわせて、アンダーレイ側(eth0)の .network ファイルの [Network] に VXLAN=vxlan100 を追記して紐づけます。netplan や NetworkManager でも VXLAN を定義できますが、対応する書き方は版によって異なります(2026年10月現在)。設定ファイルを変える前に、元のファイルを控えておいてください。
セキュリティの考え方
VXLAN のパケットは暗号化されず、中身はアンダーレイ上でそのまま読めます。送信元の認証もありません。次のどちらかを満たす経路で使うのが基本です。
- データセンター内のプライベートネットワークなど、アンダーレイ自体を信頼できる
- アンダーレイを WireGuard や IPsec で暗号化し、その上で VXLAN を通す
インターネット越しに素の VXLAN を流す構成は避けてください。
つまずきやすい症状と確認方法
- まったく通じない:アンダーレイで
sudo tcpdump -n -i eth0 udp port 4789を実行し、相手からのパケットが届いているかを見ます。届いていなければファイアウォールかクラウドのセキュリティグループ、届いているのに応答がなければVNIや宛先ポートの不一致を疑います。 - 小さな通信だけ通る:MTUの不足です。手順2の断片化禁止pingで確認します。
- 3台目だけつながらない:どこかのホストでFDBへの登録が漏れています。全ホストで
bridge fdb show dev vxlan100を比べます。
まとめ
- VXLAN はL2フレームをUDP 4789で包み、離れたホストを同じL2セグメントにつなぐ。Linux では
ip linkで設定できる dstport 4789は明示し、VNI と宛先ポートを全ホストで揃える- アンダーレイがIPv4なら50バイト分MTUを下げ、断片化禁止のpingで確認する
- VXLAN には認証も暗号化もないため、UDP 4789 は相手のVTEPだけに許可し、信頼できない経路では WireGuard などの上で使う
- 3台以上はFDBに宛先を登録する。台数が増えたら BGP EVPN を検討する