引言
在企业网络或数据中心场景中,经常需要将两个不同地理位置的三层网络通过二层打通,使两端的设备像在同一个交换机下一样工作。同时,为了保障链路的可靠性,还需要建立主备隧道,当主隧道故障时业务能自动切换到备用隧道。
本文将详细介绍如何在两台 MikroTik RouterOS 路由器上:
- 建立 WireGuard 隧道作为主链路
- 建立 L2TP/IPsec 隧道作为备份链路
- 在两个隧道之上运行 VXLAN,并将两端的
ether3物理接口桥接起来 - 通过 Netwatch 实现隧道的主备自动切换
- 重点:针对视频监控业务(UDP 大流量)进行 MTU 优化,解决花屏、卡顿问题
拓扑规划
假设两台路由器分别称为 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(本文假设 Router-1 拥有静态公网 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=1450 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=1450 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注意:此处 WireGuard 接口的 MTU 设为 1450,这是经过计算后针对视频监控优化的值,后面会详细解释。
第二步:配置 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 \
mtu=1400
# 稍等几秒后,检查是否获取到 IP
/ip address print interface=l2tp-backup
# 预期会看到 10.10.2.2/32 之类的地址这里特意将 L2TP 接口 MTU 设为 1400,因为 L2TP+IPsec 封装开销较大,预留空间。
第三步:创建 VXLAN 并桥接 ether3
VXLAN 可以将二层帧封装在 UDP 中,通过底层 IP 隧道传输。
在两台路由器上分别执行
# 1. 创建 VXLAN 接口,绑定到主隧道
/interface vxlan add name=vxlan-bridge vni=100 port=8472 interface=wg-main mtu=1400
# 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关键点:VXLAN 接口的 MTU 设为 1400。这个数值与 WireGuard 的 1450 配合:1450 (WG MTU) - 50 (VXLAN 头) = 1400。这样可以在 VXLAN 封装之前就由 RouterOS 对原始数据包进行分片(如果需要),避免多层分片带来的性能损耗。
第四步:实现主备自动切换
目前 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 优化(核心)
如果你的业务主要是视频监控(RTSP/RTP over UDP),那么普通的 MTU 优化思路(比如仅仅调低接口 MTU 或依靠 TCP MSS Clamping)是不够的。因为:
- UDP 没有 MSS 概念:无法在防火墙里通过
change-mss修改 UDP 包大小。 - 监控摄像头通常是嵌入式设备:无法修改其网卡 MTU。
- 视频流对分片和丢包敏感:过多分片会导致接收端重组开销,可能引起花屏或卡顿。
因此,我们必须从隧道层面主动设计分片策略,而不是试图避免分片。
5.1 为什么分片无法避免?
以典型场景为例:摄像头发出一个 1500 字节的 UDP 包(包含 RTP 头 + 视频数据)。
- 经过 VXLAN 封装:+50 字节 → 1550 字节
- 经过 WireGuard 封装:+80 字节 → 1630 字节
- 加上外网以太网头:+14 字节 → 1644 字节
而公网路径的 MTU 普遍是 1500 字节。所以 1644 > 1500,最终数据包在某个节点(通常是 ISP 侧)必然会被分片。
我们的优化目标不是避免分片,而是控制分片发生的位置,尽量减少 RouterOS 内部的多层分片,将分片压力转移给 ISP 或发生在 VXLAN 封装之前。
5.2 配置策略:统一 MTU 链
我们通过精心设置每一层接口的 MTU,实现“一次分片,尽早分片”。
| 接口层 | 推荐 MTU | 计算依据 | 作用 |
|---|---|---|---|
物理外网接口 ether1 | 1500 | 运营商链路标准 | 与外网匹配 |
WireGuard 隧道 wg-main | 1450 | 比物理接口低 50,预留 VXLAN 头部分空间 | 使得 WG 封装后的包略大于 1500,迫使 ISP 进行一次分片 |
VXLAN 接口 vxlan-bridge | 1400 | 1450 - 50 (VXLAN 头) | 让 VXLAN 在封装前主动对原始视频包分片(硬件分片) |
| L2TP 备用接口 | 1400 | 预留 L2TP+IPsec 开销 | 保证备用隧道切换后性能 |
5.3 为何不通过 Mangle 修改客户端 MTU?
很多管理员会问:能不能在 mangle 里修改客户端发来的包的 MTU?
答案:不能。 因为 mangle 只能修改 IP/TCP 头,而 MTU 是接口属性,不是数据包里的字段。change-mss 动作修改的是 TCP 的 MSS,对 UDP 毫无作用。所以对于监控这种 UDP 业务,无法通过 mangle 解决。
5.4 添加防火墙辅助规则
虽然不能改 UDP 包大小,但我们可以做一些辅助配置:
允许 ICMP(重要)
确保防火墙没有丢弃所有 ICMP 包。路径 MTU 发现(PMTUD)依赖 ICMP 的“需要分片”消息。如果丢弃了这些消息,可能会导致某些 TCP 控制流量挂起。
/ip firewall filter add chain=input protocol=icmp action=accept
/ip firewall filter add chain=forward protocol=icmp action=acceptTCP MSS Clamping(优化隧道内少量 TCP 管理流量)
为隧道中的 TCP 连接(如网页访问、SSH)钳制 MSS,避免 TCP 大包问题。
/ip firewall mangle add chain=forward protocol=tcp tcp-flags=syn tcp-mss=1451-65535 action=change-mss new-mss=clamp-to-pmtu5.5 备用隧道的同步优化
备用 L2TP 隧道封装开销更大(约 100+ 字节),因此 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)
验证视频流性能
- 将实际摄像头和 NVR 分别接到两端
ether3 - 观察监控画面是否流畅,是否有花屏、卡顿
- 在 RouterOS 上使用
/tool torch interface=bridge-vxlan查看流量和分片统计
验证主备切换
- 手动禁用 WireGuard 接口:
/interface wireguard disable wg-main - 观察 Netwatch 日志,确认 VTEP 已切换到 L2TP IP
- 监控画面应只有短暂中断(约 10 秒)
- 重新启用 WireGuard,隧道应自动切回
常见问题排查
| 现象 | 可能原因 | 解决动作 |
|---|---|---|
| 视频严重花屏 | 大量 IP 分片丢失 | 检查公网链路质量;考虑降低摄像头码率 |
| 切换后不通 | L2TP 隧道未获 IP 或 MTU 不匹配 | /ip address print 检查;ping -s 1400 测试 L2TP 隧道 |
| 大包 ping 不通 | MTU 设置过于激进 | 逐步降低客户端测试包的 size,找出路径 MTU |
| Netwatch 不触发 | 监控的目标 IP 不可达? | 先手动 ping 确认,再检查防火墙是否允许 ICMP |