vxlan通过在三层网络上构建虚拟二层隧道实现跨主机容器/虚拟机通信,核心依赖内核vxlan模块、统一vni配置、网桥接入、ipv4转发及fdb表维护mac-vtep映射。

Linux 使用 VXLAN 搭建跨主机虚拟大二层网络,核心是让不同物理主机上的容器或虚拟机像在同一个局域网里一样通信。这不需要改底层物理网络,靠内核的 VXLAN 模块 + 正确的路由和 FDB 表就能实现。
VXLAN 接口配置与基础互通
每台主机需创建一个 VXLAN 类型的网络接口(如 vxlan0),指定相同的 VNI 和远端 VTEP 地址。关键参数包括:
-
id:VNI 值(如
100),两端必须一致,用于隔离不同虚拟网络 -
dev:绑定的三层出口网卡(如
eth0),决定 UDP 封装后走哪条物理路径 -
dstport:默认
8472,可自定义但需两端统一 -
group 或 remote:单播用
remote指定对端 VTEP IP;组播场景用group配组播地址
例如在 server1(IP 10.0.1.10)上运行:
ip link add vxlan0 type vxlan id 100 dev eth0 remote 10.0.2.10 dstport 8472ip link set vxlan0 up
ip addr add 192.168.100.1/24 dev vxlan0
启用转发与二层桥接
VXLAN 接口本身是三层设备,要让它承载二层流量,得把它接入一个网桥(比如 br-vxlan)。这样虚拟机或容器的 veth 对、tap 设备才能挂上去,像接交换机一样工作:
- 创建网桥:
ip link add name br-vxlan type bridge - 把 VXLAN 接口加入网桥:
ip link set vxlan0 master br-vxlan - 启动网桥:
ip link set br-vxlan up - 确保内核开启 IPv4 转发:
sysctl -w net.ipv4.ip_forward=1
此时,同一 VNI 下、不同主机上接入 br-vxlan 的设备,只要 IP 在同一子网(如 192.168.100.0/24),就能直接 ping 通——因为 ARP 请求会被 VXLAN 封装转发,FDB 表自动学习对端 MAC 和 VTEP IP 映射。
FDB 表管理与通信验证
Linux 内核通过 FDB(Forwarding Database)维护“MAC → VTEP IP”的映射关系。flanneld 或手动脚本会填充它,但调试时需主动检查:
- 查看当前 FDB 条目:
bridge fdb show dev vxlan0 - 手动添加静态条目(测试用):
bridge fdb add 00:11:22:33:44:55 dev vxlan0 dst 10.0.2.10 self permanent - 确认数据走向:抓包看
tcpdump -i eth0 port 8472是否有 UDP 封装帧;查ip route get 192.168.100.2确认走的是br-vxlan而非直连路由
多节点扩展与租户隔离
加第三台主机时,只需为它配置相同 VNI 的 VXLAN 接口,并指向其他节点的 VTEP IP(或使用集中式控制面如 flannel/Calico 自动同步)。真正实现租户隔离靠的是 VNI:
- 不同业务用不同 VNI(如 tenant-A:100,tenant-B:200),互不干扰
- 每个 VNI 对应独立的 VXLAN 接口 + 独立网桥 + 独立子网,完全二层隔离
- 若需跨 VNI 通信,必须经三层网关(如 Linux router namespace 或 OVS 上的分布式网关)











