引言
在企业网络或数据中心场景中,经常需要将两个不同地理位置的三层网络通过二层打通,使两端的设备像在同一个交换机下一样工作。同时,为了保障链路的可靠性,还需要建立主备隧道,当主隧道故障时业务能自动切换到备用隧道。
本文将详细介绍如何在两台 MikroTik RouterOS 路由器上:
- 建立 WireGuard 隧道作为主链路
- 建立 L2TP/IPsec 隧道作为备份链路
- 在两个隧道之上运行 VXLAN,并将两端的
ether3物理接口桥接起来 - 通过 Netwatch 实现隧道的主备自动切换
拓扑规划
假设两台路由器分别称为 Router-1(站点A) 和 Router-2(站点B)。它们各有至少一个公网接口(ether1)用于建立隧道,以及一个需要二层互通的本地接口 ether3。
IP 地址规划
| 角色 | Router-1 | Router-2 |
|---|---|---|
| 公网 IP | 203.0.113.1(示例) | 203.0.113.2(示例) |
| WireGuard 隧道 IP | 10.10.1.1/24 | 10.10.1.2/24 |
| L2TP 隧道 IP | 10.10.2.1/24(作为服务器) | 10.10.2.2/24(作为客户端) |
| VXLAN VNI | 100 | 100 |
| VXLAN 底层端口 | 8472(默认) | 8472 |
前提条件
- 两台 RouterOS 设备(建议 7.x 版本)
- 至少一侧拥有固定的公网 IP(如果两端都有更好)
防火墙已放行必要端口:
- WireGuard: UDP
51820 - L2TP/IPsec: UDP
500,4500, IP 协议50(ESP) - VXLAN: UDP
8472
- WireGuard: UDP
- 确保两端
ether3接口为空(未配置 IP 地址,准备加入桥)
第一步:配置 WireGuard 主隧道
WireGuard 配置简单、性能高,适合做主隧道。
Router-1(站点A)
# 生成密钥对(若未生成)
/interface wireguard generate-seed
# 创建 WireGuard 接口
/interface wireguard add name=wg-main mtu=1420 listen-port=51820
# 配置隧道 IP
/ip address add address=10.10.1.1/24 interface=wg-main
# 添加对端(Router-2)
/interface wireguard peers add \
interface=wg-main \
public-key="<Router-2-Public-Key>" \
allowed-address=10.10.1.2/32Router-2(站点B)
/interface wireguard add name=wg-main mtu=1420 listen-port=51820
/ip address add address=10.10.1.2/24 interface=wg-main
/interface wireguard peers add \
interface=wg-main \
public-key="<Router-1-Public-Key>" \
allowed-address=10.10.1.1/32注意:<Router-X-Public-Key> 需要通过 /interface wireguard print 查看对方接口的公钥后填写。测试时可以用 ping 10.10.1.2 确认主隧道已通。
第二步:配置 L2TP 备用隧道
L2TP/IPsec 在 NAT 环境下表现良好,适合作为备用路径。
Router-1(L2TP 服务器)
# 开启 L2TP 服务器并设置 IPsec 共享密钥
/interface l2tp-server server set enabled=yes default-profile=default \
ipsec-secret=MySecretKey123
# 创建 L2TP 配置文件(分配隧道 IP)
/ppp profile add name=l2tp-profile \
local-address=10.10.2.1 \
remote-address=10.10.2.10-10.10.2.20
# 创建 PPP 用户
/ppp secret add name=backup-user password=123456 \
profile=l2tp-profile service=l2tpRouter-2(L2TP 客户端)
# 添加 L2TP 客户端接口,连接 Router-1 的公网 IP
/interface l2tp-client add name=l2tp-backup \
connect-to=203.0.113.1 \
user=backup-user password=123456 \
profile=default \
ipsec-secret=MySecretKey123
# 稍等几秒后,检查是否获取到 IP
/ip address print interface=l2tp-backup
# 预期会看到 10.10.2.2/32 之类的地址此时从 Router-2 能 ping 通 Router-1 的 L2TP 隧道 IP 10.10.2.1 即表示备用隧道就绪。
第三步:创建 VXLAN 并桥接 ether3
VXLAN 可以将二层帧封装在 UDP 中,通过底层 IP 隧道传输。
在两台路由器上分别执行
# 1. 创建 VXLAN 接口,绑定到主隧道(先只配置主)
/interface vxlan add name=vxlan-bridge vni=100 port=8472 interface=wg-main
# 2. 添加远端 VTEP(Virtual Tunnel End Point)地址
/interface vxlan vteps add interface=vxlan-bridge remote-ip=10.10.1.2
# 3. 创建一个二层桥
/interface bridge add name=bridge-vxlan
# 4. 将 VXLAN 接口和物理接口 ether3 加入桥
/interface bridge port add bridge=bridge-vxlan interface=vxlan-bridge
/interface bridge port add bridge=bridge-vxlan interface=ether3检查:执行 /interface bridge port print,确保两个端口状态为 R(Running)。此时,连接在 ether3 上的两台 PC 应该已经可以二层互通了(如同在一个交换机下)。
注意:VXLAN 默认使用 UDP 8472 端口,请确保防火墙允许该端口在wg-main和l2tp-backup接口上通过。
第四步:实现主备自动切换
目前 VXLAN 只使用了 WireGuard 隧道。为了当主隧道故障时自动切换到 L2TP,我们需要利用 Netwatch 监控主隧道网关,并动态修改 VXLAN 的 VTEP 地址。
切换逻辑
- 主隧道正常:VXLAN 的 VTEP 指向
10.10.1.2(WireGuard) - 主隧道断开:删除主 VTEP,添加备用 VTEP
10.10.2.2(L2TP) - 主隧道恢复:切回主 VTEP
在 Router-1 和 Router-2 上分别配置以下 Netwatch 规则(注意 IP 地址为对方对应隧道的 IP):
/tool netwatch add host=10.10.1.2 interval=10s timeout=1s \
down-script="
# 移除主 VTEP,添加备用 VTEP
/interface vxlan vteps remove [find interface=vxlan-bridge remote-ip=10.10.1.2]
/interface vxlan vteps add interface=vxlan-bridge remote-ip=10.10.2.2
:log info \"VXLAN switched to L2TP backup tunnel\"
" \
up-script="
# 移除备用 VTEP,添加主 VTEP
/interface vxlan vteps remove [find interface=vxlan-bridge remote-ip=10.10.2.2]
/interface vxlan vteps add interface=vxlan-bridge remote-ip=10.10.1.2
:log info \"VXLAN switched back to WireGuard main tunnel\"
"重要提示:在 Router-1 上监控10.10.1.2,在 Router-2 上监控10.10.1.1;两端的备用 VTEP 分别是10.10.2.2和10.10.2.1。请根据实际 IP 调整脚本中的地址。
高级优化:MTU 问题
VXLAN 封装增加 50 字节开销,WireGuard 又增加约 80 字节,L2TP/IPsec 也有额外开销。如果 MTU 处理不当,大包会被丢弃。
解决方案(需要在两台路由器同时操作):
- 物理外网接口(
ether1)设置 MTU 1500(或 ISP 允许的最大值,如 1520) - WireGuard 接口:设置
mtu=1420 - L2TP 接口:设置
mtu=1400(因为 L2TP+IPsec 开销更大) - VXLAN 接口:保持默认 MTU 1500(它会根据底层自动分片,但最好限制客户端 MTU)
- 客户端设备:将接在
ether3上的所有设备(PC、服务器)的网卡 MTU 改为 1400 或更低
这样即使最大帧也不会超过底层隧道的承载能力。
验证与故障排查
验证二层连通性
- 在两台接在
ether3的 PC 上配置同网段 IP(如192.168.100.10/24和192.168.100.20/24) - 互相
ping测试 - 执行大包测试:
ping -l 1472 -f 192.168.100.20(Windows)或ping -M do -s 1472 192.168.100.20(Linux)
验证主备切换
- 手动禁用 WireGuard 接口:
/interface wireguard disable wg-main - 观察 Netwatch 日志,确认 VTEP 已切换到 L2TP IP
- 再次 ping 对端 PC,应该仅有短暂中断(约 10 秒)
- 重新启用 WireGuard,隧道应自动切回
常见问题排查
| 现象 | 可能原因 | 解决动作 |
|---|---|---|
| VXLAN 桥接不通 | VTEP 未添加或 IP 错误 | /interface vxlan vteps print 检查 |
| 二层能通但大包不通 | MTU 问题 | 按上文降低客户端 MTU |
| 切换后不通 | L2TP 隧道未获 IP | 检查 /ip address 看 l2tp 接口是否拿到 10.10.2.x |
| Netwatch 不触发 | 监控的目标 IP 不可达? | 先手动 ping 确认,再检查防火墙是否允许 ICMP |