引言

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

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

  • 建立 WireGuard 隧道作为主链路
  • 建立 L2TP/IPsec 隧道作为备份链路
  • 在两个隧道之上运行 VXLAN,并将两端的 ether3 物理接口桥接起来
  • 通过 Netwatch 实现隧道的主备自动切换

拓扑规划

假设两台路由器分别称为 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(如果两端都有更好)
  • 防火墙已放行必要端口:

    • 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=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/32

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

# 稍等几秒后,检查是否获取到 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-mainl2tp-backup 接口上通过。

第四步:实现主备自动切换

目前 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 问题

VXLAN 封装增加 50 字节开销,WireGuard 又增加约 80 字节,L2TP/IPsec 也有额外开销。如果 MTU 处理不当,大包会被丢弃。

解决方案(需要在两台路由器同时操作):

  1. 物理外网接口ether1)设置 MTU 1500(或 ISP 允许的最大值,如 1520)
  2. WireGuard 接口:设置 mtu=1420
  3. L2TP 接口:设置 mtu=1400(因为 L2TP+IPsec 开销更大)
  4. VXLAN 接口:保持默认 MTU 1500(它会根据底层自动分片,但最好限制客户端 MTU)
  5. 客户端设备:将接在 ether3 上的所有设备(PC、服务器)的网卡 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)

验证主备切换

  • 手动禁用 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
最后修改:2026 年 05 月 21 日
如果觉得我的文章对你有用,请随意赞赏