引言

在企业网络或数据中心场景中,经常需要将两个不同地理位置的三层网络通过二层打通,使两端的设备像在同一个交换机下一样工作。同时,为了保障链路的可靠性,还需要建立主备隧道,当主隧道故障时业务能自动切换到备用隧道。

本文将详细介绍如何在两台 MikroTik RouterOS 路由器上:

  • 建立 WireGuard 隧道作为主链路
  • 建立 L2TP/IPsec 隧道作为备份链路
  • 在两个隧道之上运行 VXLAN,并将两端的 ether3 物理接口桥接起来
  • 通过 Netwatch 实现隧道的主备自动切换
  • 重点:针对视频监控业务(UDP 大流量)进行 MTU 优化,解决花屏、卡顿问题

拓扑规划

假设两台路由器分别称为 Router-1(站点A)Router-2(站点B)。它们各有至少一个公网接口(ether1)用于建立隧道,以及一个需要二层互通的本地接口 ether3

IP 地址规划

角色Router-1Router-2
公网 IP203.0.113.1(示例)203.0.113.2(示例)
WireGuard 隧道 IP10.10.1.1/2410.10.1.2/24
L2TP 隧道 IP10.10.2.1/24(作为服务器)10.10.2.2/24(作为客户端)
VXLAN VNI100100
VXLAN 底层端口8472(默认)8472

前提条件

  • 两台 RouterOS 设备(建议 7.x 版本)
  • 至少一侧拥有固定的公网 IP(本文假设 Router-1 拥有静态公网 IP)
  • 防火墙已放行必要端口:

    • WireGuard: UDP 51820
    • L2TP/IPsec: UDP 500, 4500, IP 协议 50(ESP)
    • VXLAN: UDP 8472
  • 确保两端 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/32

Router-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=l2tp

Router-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-1Router-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.210.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计算依据作用
物理外网接口 ether11500运营商链路标准与外网匹配
WireGuard 隧道 wg-main1450比物理接口低 50,预留 VXLAN 头部分空间使得 WG 封装后的包略大于 1500,迫使 ISP 进行一次分片
VXLAN 接口 vxlan-bridge14001450 - 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=accept

TCP 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-pmtu

5.5 备用隧道的同步优化

备用 L2TP 隧道封装开销更大(约 100+ 字节),因此 MTU 设为 1400 是合理的。这样在切换后,视频流仍然可以工作,只是可能会多一些分片,但保持连续性。

第六步:验证与故障排查

验证二层连通性

  • 在两台接在 ether3 的 PC 上配置同网段 IP(如 192.168.100.10/24192.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
最后修改:2026 年 05 月 21 日
如果觉得我的文章对你有用,请随意赞赏