
在 Linux 系统上手动部署VXLAN的完整配置示例,涵盖单播隧道、组播隧道、以及与 Linux Bridge 或 OVS 集成的三种常见模式。
所有配置使用原生 Linux 命令(ip、bridge、ip link),无需安装额外软件。

一、环境假设
1.1 网络拓扑

Host A 和 Host B 通过物理接口 eth0 三层可达。
逻辑 VXLAN 接口 vxlan0 使用VNI 100。
在 VXLAN 之上构建一个Linux bridge br0,用于连接本地 VM/容器。
二、单播模式(Unicast,手动指定对端 VTEP)
适用场景:小型网络,对端 VTEP IP 固定且较少。
Host A 配置
# 1. 创建 VXLAN 接口(单播模式,指定对端 IP)
ip link add vxlan0 type vxlan id 100 \
dev eth0 \
remote 192.168.1.20 \
dstport 4789
# 2. 启用接口
ip link set vxlan0 up
# 3. 可选:分配 IP 地址(VTEP 自身使用的三层地址)
ip addr add 10.0.0.1/24 dev vxlan0
# 4. (推荐)创建 Linux Bridge,将 VXLAN 接口加入
ip link add br0 type bridge
ip link set vxlan0 master br0
ip link set br0 up
Host B 配置
# 1. 创建 VXLAN 接口(对端 IP 指向 Host A)
ip link add vxlan0 type vxlan id 100 \
dev eth0 \
remote 192.168.1.10 \
dstport 4789
# 2. 启用
ip link set vxlan0 up
# 3. 分配 IP
ip addr add 10.0.0.2/24 dev vxlan0
# 4. 创建 Bridge
ip link add br0 type bridge
ip link set vxlan0 master br0
ip link set br0 up
验证
# 在任意主机上 Ping 对端 VXLAN IP
ping 10.0.0.2# 从 Host A 发起
# 查看 VXLAN 隧道状态
ip -d link show vxlan0
缺点:只能点对点通信。如需多对多,必须为每对 VTEP 创建独立的 VXLAN 接口。
三、组播模式(Multicast,自动发现)
适用场景:多台 VTEP 需自动发现、广播/组播泛洪。底层网络需支持组播路由(如 PIM)。
组播组假设:239.1.1.1
Host A / Host B / Host C 相同配置
# 1. 创建 VXLAN 接口(使用组播组)
ip link add vxlan0 type vxlan id 100 \
dev eth0 \
group 239.1.1.1 \
dstport 4789
# 2. 启用
ip link set vxlan0 up
# 3. 分配 IP(每台主机不同)
ip addr add 10.0.0.X/24 dev vxlan0
# 4. 创建 Bridge
ip link add br0 type bridge
ip link set vxlan0 master br0
ip link set br0 up
验证
# 从 Host A 广播 Ping 组播组地址
ping 10.0.0.255
# 查看 mac 表学习情况
bridge fdb show dev vxlan0
优点:VTEP 自动发现,无需手动指定对端。缺点:依赖组播,在大规模网络或云环境中不可用。
四、点对多点(Unicast + L2 FDB 动态学习)
推荐方案:结合 EVPN 或手动管理 FDB,无需组播。通过 bridge fdb 添加远端 MAC 对应的 VTEP IP。
Host A 配置
# 1. 创建 VXLAN 接口(不指定 remote,使用 FDB)
ip link add vxlan0 type vxlan id 100 \
dev eth0 \
dstport 4789 \
learning
# 2. 启用
ip link set vxlan0 up
# 3. 分配 IP
ip addr add 10.0.0.1/24 dev vxlan0
# 4. 手动添加远端 MAC(例如 Host B 的 VM MAC)
#假设 Host B 的 VM 有 MAC 00:11:22:33:44:55
bridge fdb append 00:11:22:33:44:55 dev vxlan0 dst 192.168.1.20
# 5. (可选)开启本地 ARP 抑制
ip link set vxlan0 type vxlan proxy_arp on
Host B 配置(对称)
ip link add vxlan0 type vxlan id 100 dev eth0 dstport 4789 learning
ip link set vxlan0 up
ip addr add 10.0.0.2/24 dev vxlan0
# 添加 Host A 的 VM MAC
bridge fdb append AA:BB:CC:DD:EE:FF dev vxlan0 dst 192.168.1.10
学习机制:当 VXLAN 接口收到未知源 MAC 的数据包时,会自动将 (MAC, 对端 IP) 加入 FDB。learning 参数开启此功能。
五、与 Linux Bridge / 虚拟化集成(VM/容器接入)
5.1 通过 Bridge 连接本地 VM(libvirt / KVM)
# 1. 创建 VXLAN + Bridge
ip link add vxlan0 type vxlan id 100 dev eth0 group 239.1.1.1 dstport 4789
ip link add br0 type bridge
ip link set vxlan0 master br0
ip link set br0 up
# 2. 创建 veth pair 给容器或 VM 使用(这里以容器为例)
ip link add veth0 type veth peer name veth1
ip link set veth1 master br0
ip link set veth0 up
ip link set veth1 up
# 3. 在容器内配置 IP
ip netns add test_ctn
ip link set veth0 netns test_ctn
ip netns exec test_ctn ip addr add 10.0.0.10/24 dev veth0
ip netns exec test_ctn ip link set veth0 up
5.2 与 Open vSwitch (OVS) 集成
OVS 通常用于更复杂的策略和SDN 环境。
# 1. 安装 OVS(如果不是默认安装)
apt install openvswitch-switch# Debian/Ubuntu
yum install openvswitch# RHEL/CentOS
# 2. 创建 OVS Bridge
ovs-vsctl add-br ovs-br0
# 3. 添加 VXLAN 端口到 OVS
ovs-vsctl add-port ovs-br0 vxlan0 -- set interface vxlan0 type=vxlan \
options:remote_ip=192.168.1.20 \
options:key=100 \
options:dst_port=4789
# 4. 查看端口状态
ovs-vsctl show
# 5. 添加物理端口或 VM 端口类似
ip link set eth1 up
ovs-vsctl add-port ovs-br0 eth1
OVS 模式优点:支持OpenFlow 流表、隧道策略、QoS 控制,适合数据中心和SDN。
六、高级配置:ARP 抑制与未知单播抑制
问题:VXLAN 默认广播泛洪会消耗带宽。解决方案:开启本地 ARP 代理或 ND 抑制,减少不必要的广播。
# 启用本地 ARP 抑制(需内核支持)
ip link set vxlan0 type vxlan proxy_arp on
# 或在 sysctl 中开启全局抑制
sysctl -w net.ipv4.conf.vxlan0.proxy_arp=1
注意:这要求 VTEP 知道所有 VM 的 MAC-IP 映射,通常配合EVPN 或手动静态表使用。
七、配置持久化
使用 /etc/network/interfaces(Debian/Ubuntu)
# 在/etc/network/interfaces 中添加:
auto vxlan0
iface vxlan0 inet manual
pre-up ip link add vxlan0 type vxlan id 100 dev eth0 dstport 4789 group 239.1.1.1
up ip link set vxlan0 up
post-down ip link del vxlan0
使用 ifcfg 文件(RHEL/CentOS 7/8)
# /etc/sysconfig/network-scripts/ifcfg-vxlan0
DEVICE=vxlan0
TYPE=VXLAN
ONBOOT=yes
VXLAN_ID=100
VXLAN_DEV=eth0
VXLAN_REMOTE_IP=192.168.1.20
VXLAN_DSTPORT=4789
VLAN=no
使用 systemd-networkd
# /etc/systemd/network/20-vxlan0.netdev
[NetDev]
Name=vxlan0
Kind=vxlan
[VXLAN]
Id=100
Remote=192.168.1.20
Local=192.168.1.10
DestinationPort=4789
# /etc/systemd/network/20-br0.network
[Match]
Name=vxlan0
[Network]
Address=10.0.0.1/24
Bridge=br0
八、验证与排障常用命令
# 查看 VXLAN 接口详细信息
ip -d link show vxlan0
# 查看 FDB 表(远端 MAC 和 VTEP IP 映射)
bridge fdb show dev vxlan0
# 查看邻居表(ARP / ND)
ip neigh show dev vxlan0
# 抓包确认 VXLAN 封装
tcpdump -i eth0 udp port 4789 -vvv -X
# 检查 VXLAN 隧道统计
ip -s link show vxlan0
# 查看 Netlink 消息(用于调试 EVPN 控制平面)
ip monitor link
九、常见问题排查
问题 | 可能原因 | 检查方法 |
无法 Ping 通远端 VXLAN IP | VNI 不一致 / 外层路由不通 | ip -d link show vxlan0,确认 id=100 |
大包丢失 | MTU 不够 | ping -M do -s 1472,看是否有分片 |
广播不通 | 组播组未加入 / 无组播路由 | ip maddr show,看是否加入了 239.1.1.1 |
ARP 请求无法通过 | proxy_arp 未开启或 FDB 未学习 | bridge fdb show dev vxlan0 |
流量走 CPU 而非硬件转发 | 网卡不支持 VXLAN 卸载 | `ethtool -k eth0 |
最小的 VXLAN 配置只需要 ip link add vxlan0 type vxlan id 100 dev eth0 remote 192.168.1.20 dstport 4789。
生产环境则推荐结合EVPN(如 FRR + BGP)和OVS实现自动控制平面,避免手动管理 FDB。
场景 | 推荐配置 |
测试 / 小规模 | 单播模式(直接指定 remote) |
多 VTEP / 需要自动发现 | 组播模式(需底层 PIM) |
数据中心 / 生产环境 | 点对多点 + EVPN 控制平面 |
虚拟化集成 | Linux Bridge 或 OVS + VXLAN |
大二层 | ALL 模式均可,但建议 OVS + EVPN |

VXLAN 配置中常见的错误及解决方法
以下是对 Linux 及交换机VXLAN 配置中高频错误的系统性分类,涵盖配置、MTU、ARP、组播、控制平面等五个方面。
一、VXLAN 接口无法创建
错误 1:内核不支持 VXLAN
现象:
ip link add vxlan0 type vxlan id 100 dev eth0 remote 192.168.1.20
# 返回:RTNETLINK answers: Operation not supported
原因:
内核未加载 vxlan 模块。
内核版本过旧(Linux < 3.6 不支持 VXLAN)。
解决方法:
# 1. 检查模块是否已加载
lsmod | grep vxlan
# 2. 手动加载
modprobe vxlan
# 3. 永久加载(写入/etc/modules)
echo "vxlan" >> /etc/modules
# 4. 检查内核版本
uname -r
# 如果 < 3.6,需升级内核
错误 2:VXLAN ID 冲突
现象:
ip link add vxlan0 type vxlan id 100 dev eth0
# 返回:RTNETLINK answers: File exists
原因:同一台主机上已有相同 VNI 的 VXLAN 接口。
解决方法:
# 1. 查看已有 VXLAN 接口
ip -d link show type vxlan
# 2. 删除冲突接口
ip link del vxlan0
# 3. 尝试使用不同的 VNI
二、隧道无法建立(Underlay 不通)
错误 3:外层 IP 路由不可达
现象:
两端 VTEP 的 Loopback 无法 Ping 通。
bridge fdb show dev vxlan0为空(MAC 未学习)。
原因:
Underlay 路由配置错误(OSPF/BGP/静态路由未正确配置)。
防火墙或 ACL 阻塞了 UDP 4789 端口。
解决方法:
# 1. 测试 Underlay 连通性
ping -c 3 192.168.1.20# 从 VTEP-1 Ping VTEP-2 的物理 IP
ping -c 3 10.0.0.2 -I vxlan0# 从 VXLAN 接口 Ping 对端
# 2. 检查防火墙
iptables -L -n | grep 4789
firewall-cmd --list-ports# CentOS/RHEL
ufw status# Ubuntu
# 3. 开放 UDP 4789 端口
iptables -A INPUT -p udp --dport 4789 -j ACCEPT
# 4. 检查路由表(确认到对端Loopback 的路由)
ip route get 10.0.0.2 from 10.0.0.1
错误 4:VNI 不一致
现象:
两端能 Ping 通物理 IP,但 VXLAN 内跨主机通信失败。
抓包看到 VNI 字段不同。
原因:两端配置的 id(VNI)不同。
解决方法:
# 在两端执行以下命令确认 VNI
ip -d link show vxlan0 | grep id
# 输出示例:id 100<--- 两端必须一致
# 如果不同,重新创建一致的 VNI
ip link del vxlan0
ip link add vxlan0 type vxlan id 100 dev eth0 remote 192.168.1.20
三、MTU 导致大包丢失
错误 5:封装后的数据包被分片或丢弃
现象:
小包(< 1448 字节)通信正常。
ping -M do -s 1472对端无响应(分片禁止)。
应用层传输大文件失败(FTP/SCP 等)。
原因:
物理接口 MTU 默认 1500,VXLAN 封装增加 50 字节 ⇒有效载荷最大 1450 字节。
如果 VM 发出 1500 字节包,封装后变成 1550 字节,被物理接口丢弃。
解决方法:
# 1. 调整物理接口 MTU 为 1600
ip link set dev eth0 mtu 1600
# 2. 确保整个路径(交换机、路由器)都支持 1600 MTU
# 在交换机上:
interface GigabitEthernet1/0/1
mtu 1600
# 3. 在 VM 内调整 MTU(如果 VM 直接连接VXLAN)
ip link set dev eth0 mtu 1450# 1500 - 50
# 4. 验证:从两端分别测试
ping -M do -s 1450 10.0.0.2# 应成功
ping -M do -s 1472 10.0.0.2# 应失败(超过最大值)
最佳实践:
整个 Underlay 网络统一使用1600 或 9000(巨型帧)MTU。
Linux 端:ip link set dev eth0 mtu 1600。
交换机端:mtu 1600(各厂商命令略有不同)。
四、ARP 与 MAC 学习失败
错误 6:ARP 请求无法跨 VTEP 传输
现象:
ip neigh show dev vxlan0显示 INCOMPLETE。
Windows 或 Linux VM 无法获取对端 VM 的 MAC 地址。
原因:
VXLAN 默认广播泛洪,但组播未配置或组播路由不通。
proxy_arp未开启。
解决方法:
# 1. 开启本地代理 ARP(减少广播依赖)
ip link set vxlan0 type vxlan proxy_arp on
# 2. 确保组播(如果使用组播模式)可用
ip maddr show | grep 239.1.1.1
# 然后通过静态 ARP 强制学习(测试用)
arp -s 10.0.0.2 00:11:22:33:44:55 -i vxlan0
# 3. 检查 FDB(MAC 转发表)
bridge fdb show dev vxlan0
# 如果有条目,但 ARP 仍失败,尝试手动添加
bridge fdb append 00:11:22:33:44:55 dev vxlan0 dst 192.168.1.20
错误 7:FDB 表不学习远端 MAC
现象:
bridge fdb show dev vxlan0只有本地 MAC,没有远端 MAC。
但物理 IP 能 Ping 通。
原因:
VXLAN 接口未开启 learning 标志。
对端 VTEP 没有回应数据(例如防火墙过滤了 UDP 4789 的回复包)。
解决方法:
# 1. 确保 learning 开启
ip link set vxlan0 type vxlan learning on
# 2. 手动触发学习:
# 在对端 VM 上发起一个发送到本端 VM 的包(例如 Ping)
# 或者手动添加静态 FDB 条目
bridge fdb append 00:11:22:33:44:55 dev vxlan0 dst 192.168.1.20
# 3. 查看内核日志(可能提示丢包原因)
dmesg | tail -20
五、组播模式常见错误
错误 8:组播组无法注册
现象:
ip maddr show显示未加入组播组。
VXLAN 接口上看不到组播流量。
原因:
底层交换机或路由器组播路由未启用(如 IGMP Snooping 过滤)。
使用了保留组播地址(224.0.0.x)。
解决方法:
# 1. 使用非保留组播地址(239.0.0.0/8为管理组播,推荐 239.1.0.0/16)
# 避免使用 224.0.0.x(链路本地组播,不过路由器)
# 2. 检查底层的 IGMP Snooping
# 在交换机上:
display igmp-snooping
# 如果启用,允许组239.1.1.1 通过
# 3. 手动加入组播组(Linux)
ip maddr add 239.1.1.1 dev eth0
# 4. 如果使用 PIM,确保启用
router> enable
router# configure terminal
router(config)# ip multicast-routing
router(config)# interface GigabitEthernet0/0
router(config-if)# ip pim sparse-mode
错误 9:组播模式下的广播风暴
现象:
VXLAN 网络内拥堵严重,CPU 使用率高。
bridge fdb中MAC 表项迅速增长。
原因:
所有 VTEP 都加入同一个组播组,广播泛洪数量与 VTEP 数成正比。
没有开启 ARP 抑制或 ND 抑制。
解决方法:
# 1. 开启 proxy_arp(见错误 6)
# 2. 考虑切换到 EVPN 模式(如 FRR + BGP EVPN)
# 3. 或使用 OVS 的广播优化策略:
ovs-vsctl set bridge ovs-br0 flood_vlans=0
六、控制平面(EVPN)相关问题
错误 10:BGP EVPN 邻居无法建立
现象:
display bgp l2vpn evpn peer显示 Idle。
TCP 端口 179 未建立。
原因:
Loopback 路由不可达。
BGP 配置错误(AS 号、邻居 IP)。
解决方法(华为/华三):
# 1. 确认 Loopback 互通
ping -a 10.0.1.1 10.0.2.1
# 2. 确保 L2VPN 地址族已启用
l2vpn enable# 全局启用
# 3. 指定connect-interface
bgp 100
peer 10.0.255.1 as-number 100
peer 10.0.255.1 connect-interface loopback0
错误 11:EVPN 不通告 IRB(分布式网关失败)
现象:
同 VXLAN 内 VM 能互通,但无法访问网关。
不同 Leaf 上的网关不能互相学习路由。
原因:
未配置 advertise irb。
Vsi-interface 的Anycast IP/MAC 不统一。
解决方法:
# 华三:
address-family l2vpn evpn
peer 10.0.255.1 enable
peer 10.0.255.1 advertise irb
# 华为:
l2vpn-family evpn
peer 10.0.255.1 advertise irb
# 确保 Vsi-interface IP/MAC 一致
interface Vsi-interface5000
ip address 192.168.1.254 255.255.255.0
mac-address 0000-5e00-5000# 所有 Leaf 相同 MAC
anycast-gateway enable
七、性能监控问题
错误 12:软件转发导致性能下降
现象:
吞吐量远低于物理线速。
top显示ksoftirqd 或 vxlan 进程 CPU 占用高。
原因:
网卡不支持 VXLAN 硬件卸载(offload)。
使用了不具有硬件 VXLAN 能力的交换机。
解决方法:
# 1. 检查网卡卸载能力
ethtool -k eth0 | grep tx-udp-tnl-segmentation
ethtool -k eth0 | grep tx-checksum-ip-generic
# 如果显示 off,则不支持硬件卸载
# 考虑使用支持 VXLAN 卸载的网卡(如 Mellanox、Intel XL710)
# 2. 对于 CPU 瓶颈,增加处理能力:
ethtool -L eth0 combined 4# 调整队列数
八、快速排障检查清单
# 1. 检查 VXLAN 接口是否存在且状态 UP
ip link show vxlan0
# 2. 检查 VNI 是否一致
ip -d link show vxlan0 | grep id
# 3. 检查 FDB(MAC 表)
bridge fdb show dev vxlan0
# 4. 检查 ARP 表
ip neigh show dev vxlan0
# 5. 检查底层 MTU
ip link show eth0 | grep mtu
ping -M do -s 1450 10.0.0.2
# 6. 测试物理连通性
ping 192.168.1.20
# 7. 抓包分析
tcpdump -i any udp port 4789 -vvv -X
九、常见错误一览表
错误类别 | 具体现象 | 根本原因 | 标准解决方法 |
接口创建失败 | Operation not supported | 未加载 vxlan 模块 | modprobe vxlan |
VNI 冲突 | File exists | 相同 VNI 已存在 | ip link del 后重新创建 |
隧道不通 | Ping 不通 VXLAN IP | Underlay 路由缺失或 ACL | 检查路由表,开放 UDP 4789 |
MTU 问题 | 大包丢包 | 物理 MTU < 1550 | 设置 eth0 MTU 为 1600 |
ARP 不通 | INCOMPLETE | 组播不通或 proxy_arp 未启 | 开启 proxy_arp,检查组播 |
FDB 不学习 | MAC 表为空 | learning 未开启 | ip link set vxlan0 type vxlan learning on |
EVPN 邻居 Idle | BGP 状态 Idle | Loopback 不通 | 检查 Underlay 路由 |
性能低 | CPU 占用高 | 网卡无 VXLAN 卸载 | 更换网卡或调大队列数 |
遇到任何 VXLAN 问题,先从物理连通性(Ping)和MTU出发,80% 的问题源于这两项。然后再检查 VNI 一致性和 FDB 学习情况。
如果涉及 EVPN,优先确认 BGP EVPN 邻居状态是否为 Established。


原创声明:本文仅供学习交流,未经作者书面授权不得用于商业目的。
