首先说明,这是一篇结合 AI 辅助写的文章,这个方案在18年初从一位电子科大的老师那里了解到,当时场景是一个直播活动需要实时将视频回传到机房,希望他没有意见,当然中间我也复原过验证过。并希望通过AI来辅助实现配置,我在每一步的去审核,并吸取AI的一些方案。

中心 RouterOS 有 2 个公网 IP,末端RouterOS有 2 张 5G 出口;每条 5G 建一条 EoIP,再把两端 EoIP 放进 bonding。配置会以 RouterOS v7 CLI 为主,并标出需要替换的 IP/接口名。

MikroTik RouterOS v7 配置案例

中心 RouterOS 有两个公网 IP,末端 RouterOS 有两张 5G 卡。每张 5G 卡只负责一条到中心的 EoIP。两条 EoIP 建好后,在两端把 EoIP 加入 bonding,用 balance-rr 实现单连接也可拆包走两条链路的聚合。

MikroTik 官方说明中,EoIP 是基于 GRE 的二层以太网隧道,会把 Ethernet frame 封装进 GRE/IP;tunnel-id 两端必须一致且每条隧道唯一。EoIP 会增加至少 42 字节开销。 RouterOS bonding 的 balance-rr 是唯一可以让同一个 TCP/IP 连接跨多个接口发包的 bonding 模式。bonding 还必须启用链路监测,否则某条 EoIP 断了以后 bonding 仍可能继续往坏链路发包。

1. 拓扑和地址规划

中心 RouterOS

假设中心RouterOS有两个公网 IP:

中心公网 IP 1:203.0.113.10
中心公网 IP 2:203.0.113.11中心 
LAN 口:ether3

末端 RouterOS

5G 卡 1 接口:lte1
5G 卡 2 接口:lte2
末端LAN 口:ether3

EoIP 隧道规划

EoIP-1:末端 lte1 -> 中心 203.0.113.10
EoIP-2:末端 lte2 -> 中心 203.0.113.11
tunnel-id 101:EoIP-1
tunnel-id 102:EoIP-2

bonding 内部互联 IP

中心 bond-eoip:10.255.255.1/30
末端 bond-eoip:10.255.255.2/30

业务网段示例

假设末端 LAN 是:

末端 LAN:192.168.50.0/24
末端网关:192.168.50.1

如果你希望中心通过聚合链路访问末端 LAN,就在中心加静态路由到 192.168.50.0/24,下一跳指向 10.255.255.2。

2. 5G 卡必须能跑 GRE/EoIP

EoIP 使用 GRE,协议号是 47,不是 TCP/UDP 端口。MikroTik 官方文档也明确 EoIP 把以太网帧封装进 GRE,即 IP protocol 47。

所以有几个现实限制:

第一,运营商 5G 卡如果是 CGNAT,一般不能让中心主动打到末端。但本方案是末端主动往中心公网 IP 发 GRE,很多场景可以跑,前提是运营商不屏蔽 GRE。

第二,中心侧 EoIP 的 remote-address 原则上需要知道末端每条 5G 的公网出口 IP。官方参数说明里,remote-address 是 EoIP 远端 IP。 如果 5G 出口公网 IP 不固定,会比较麻烦。工程上更推荐用 WireGuard / IPsec / L2TP / ZeroTier 先建立稳定三层隧道,再在其上跑 EoIP 或直接三层路由。

第三,如果两张 5G 卡都是内网 CGNAT,且 GRE 被运营商封掉,原生 EoIP 方案可能无法成立。这时建议改成:WireGuard 两条隧道 + bonding/VXLAN/EoIP over WireGuard,WireGuard 用 UDP,更容易穿越移动网络。

下面先按你描述的“中心两公网 IP + 两条 EoIP + bonding”给出配置。

3. 中心 RouterOS 配置

3.1 配置公网 IP

如果两个公网 IP 在同一个物理接口上,这样配置:

/ip address
add address=203.0.113.10/24 interface=ether1 comment="Public IP 1"
add address=203.0.113.11/24 interface=ether1 comment="Public IP 2"

3.2 创建中心侧 EoIP

这里有一个问题:中心需要填写末端两张 5G 卡的公网出口 IP。当然实际不会有公网IP,但IPv6除外,IPv6是可以实现公网互联,但目前没有实际测试到RouterOS的Lte获取IPv6的配置。

假设:

末端 5G-1 出口公网 IP:198.51.100.21
末端 5G-2 出口公网 IP:198.51.100.22

说明下,如果末端没有公网IP,就需要借助其他隧道来搭建一个隧道,如Wireguard,PPTP等,在这些隧道上再跑EoIP隧道。我们先不讨论隧道包裹隧道的问题,继续公网对公网的方案,这样理解更简单。(关于EoIP基于Wireguard,可以参考RouterOS入门到精通v7-- 2.3 基于 WirGuard 的 EoIP 隧道

中心配置:

/interface eoip
add name=eoip-5g1 \    
local-address=203.0.113.10 \    
remote-address=198.51.100.21 \    
tunnel-id=101 \    
mtu=1400 \    
keepalive=5s,3 \    
clamp-tcp-mss=yes \    
allow-fast-path=no \    
comment="EoIP over 5G-1"

add name=eoip-5g2 \    
local-address=203.0.113.11 \    
remote-address=198.51.100.22 \    
tunnel-id=102 \    
mtu=1400 \    
keepalive=5s,3 \    
clamp-tcp-mss=yes \    
allow-fast-path=no \    
comment="EoIP over 5G-2"

说明:

  • local-address 强制 EoIP-1 使用中心公网 IP 1,EoIP-2 使用中心公网 IP 2。
  • tunnel-id 两端必须一致,且两条 EoIP 不能重复。
  • mtu=1400 是保守值。EoIP 本身有开销,官方文档说明 EoIP 至少增加 42 字节封装开销。 5G 网络再叠加运营商网络,建议先用 1380–1420 测试。
  • keepalive=5s,3 表示每 5 秒检测,连续 3 次失败后认为隧道异常。

3.3 创建 bonding

/interface bonding
add name=bond-eoip \    
mode=balance-rr \    
slaves=eoip-5g1,eoip-5g2 \    
link-monitoring=arp \    
arp-ip-targets=10.255.255.2 \    
arp-interval=500ms \    
mtu=1400 \    
comment="Bonding over two EoIP tunnels"

配置 bonding IP:

/ip address
add address=10.255.255.1/30 interface=bond-eoip comment="Bond peer IP - center"

说明:

balance-rr 是轮询发包,能让同一个连接跨两条链路走。但 5G 时延差异大时,容易乱序。MikroTik 官方也提示 balance-rr 会让包按顺序在多个 slave 上发送,多个链路接收时常出现乱序,TCP 可能重传

link-monitoring=arp 用于检测 bonding 对端是否可达。RouterOS bonding 官方文档强调必须启用链路监测,否则某个 slave 失败时 bonding 仍会继续往故障链路发包。

3.4 中心到末端 LAN 的路由

假设末端 LAN 是 192.168.50.0/24

/ip route
add dst-address=192.168.50.0/24 gateway=10.255.255.2 comment="Route to remote LAN via bonded EoIP"

3.5 防火墙放行 EoIP/GRE

中心必须允许来自末端 5G 出口的 GRE。

/ip firewall filter
add chain=input action=accept protocol=gre src-address=198.51.100.21 dst-address=203.0.113.10 comment="Allow EoIP GRE from 5G-1"
add chain=input action=accept protocol=gre src-address=198.51.100.22 dst-address=203.0.113.11 comment="Allow EoIP GRE from 5G-2"

如果末端 5G 出口 IP 不固定,可以先临时放宽测试:

/ip firewall filter
add chain=input action=accept protocol=gre dst-address=203.0.113.10 comment="TEMP Allow GRE to EoIP-1"
add chain=input action=accept protocol=gre dst-address=203.0.113.11 comment="TEMP Allow GRE to EoIP-2"

生产环境不建议长期开放给所有来源。

4. 末端 RouterOS 配置

4.1 确认 lte1 / lte2 能分别上网

一般 5G 卡通过 DHCP 或 LTE APN 自动获取地址和默认路由。

可以先检查:

/ping 8.8.8.8 interface=lte1
/ping 8.8.8.8 interface=lte2

4.2 创建独立路由表

RouterOS v7 自定义路由表要先在 /routing/table 创建。MikroTik 官方文档说明,自定义 routing table 需要先在 /routing/table 中定义,并且可以用 routing rule 或 mangle 让特定流量查特定表。

/routing table
add name=to_5g1 fibadd name=to_5g2 fib

假设:

lte1 网关:由 DHCP 动态获取lte2 网关:由 DHCP 动态获取

如果 LTE DHCP client 自动加默认路由,建议把默认路由距离区分开,或者关闭自动默认路由,手工写路由。

更清晰的做法是关闭自动默认路由,然后自己加:

/ip dhcp-client
set [find interface=lte1] add-default-route=no
set [find interface=lte2] add-default-route=no

如果你的 LTE 接口不是 DHCP,而是 LTE 自身动态路由,这一步按实际情况调整。

4.3 给每条 EoIP 指定出口

目标是:

去 203.0.113.10 的包,只走 lte1去 203.0.113.11 的包,只走 lte2

方式 A:用静态 host route,最简单

如果 RouterOS 能直接用接口作为 LTE 网关,可以这样:

/ip route
add dst-address=203.0.113.10/32 gateway=lte1 routing-table=main comment="EoIP-1 center IP via 5G-1"
add dst-address=203.0.113.11/32 gateway=lte2 routing-table=main comment="EoIP-2 center IP via 5G-2"

然后末端创建 EoIP 时不指定 local-address,让系统按这两条 host route 选择出口。

方式 B:用路由表 + routing rule

如果你需要更严格控制,可以给中心两个公网 IP 做独立路由表:

/ip route
add dst-address=0.0.0.0/0 gateway=lte1 routing-table=to_5g1 comment="Default via 5G-1 table"
add dst-address=0.0.0.0/0 gateway=lte2 routing-table=to_5g2 comment="Default via 5G-2 table"
/routing rule
add dst-address=203.0.113.10/32 action=lookup-only-in-table table=to_5g1 comment="Center IP1 via 5G-1"
add dst-address=203.0.113.11/32 action=lookup-only-in-table table=to_5g2 comment="Center IP2 via 5G-2"

RouterOS 官方说明里,routing rule 可以按目标地址、源地址、入接口等条件让IP包查指定表;lookup-only-in-table 表示只查指定表,不会走main主表。

4.4 创建末端 EoIP

/interface eoip
add name=eoip-5g1 \    
remote-address=203.0.113.10 \    
tunnel-id=101 \    
mtu=1400 \    
keepalive=5s,3 \    
clamp-tcp-mss=yes \    
allow-fast-path=no \    
comment="EoIP to center public IP1 via 5G-1"

add name=eoip-5g2 \    
remote-address=203.0.113.11 \    
tunnel-id=102 \    
mtu=1400 \    
keepalive=5s,3 \    
clamp-tcp-mss=yes \    
allow-fast-path=no \    
comment="EoIP to center public IP2 via 5G-2"

如果末端 5G 获得的是固定公网 IP,也可以指定:

/interface eoip
set eoip-5g1 local-address=198.51.100.21
set eoip-5g2 local-address=198.51.100.22

但多数 5G 卡是动态地址或 CGNAT,不建议依赖固定 local-address

4.5 创建末端 bonding

/interface bonding
add name=bond-eoip \    
mode=balance-rr \    
slaves=eoip-5g1,eoip-5g2 \    
link-monitoring=arp \    
arp-ip-targets=10.255.255.1 \    
arp-interval=500ms \    
mtu=1400 \    
comment="Bonding over two EoIP tunnels"

配置 bonding IP:

/ip address
add address=10.255.255.2/30 interface=bond-eoip comment="Bond peer IP - remote"

4.6 末端 LAN 配置

假设末端 LAN 口是 ether3,LAN 网段是 192.168.50.0/24

/ip address
add address=192.168.50.1/24 interface=ether3 comment="Remote LAN gateway"

如果末端 LAN 客户端要通过中心出口上网,可以加默认路由指向中心 bonding IP:

/ip route
add dst-address=0.0.0.0/0 gateway=10.255.255.1 distance=10 comment="Default via bonded tunnel to center"

但如果末端本地还要保留 5G 自身上网,就不要直接把默认路由全部指向中心,建议按业务做策略路由。

5. 如果要二层桥接 LAN,而不是三层路由

上面的方案是推荐的三层路由方式:

LAN <-> bond-eoip <-> LAN

如果你想把中心 LAN 和末端 LAN 直接桥成一个二层广播域,可以把 bond-eoip 加到 bridge。EoIP 本来就是二层隧道,官方示例也展示了 EoIP 可以加入 bridge,使两端处于同一个二层广播域。

中心:

/interface bridge
add name=bridge-lan protocol-mode=rstp
/interface bridge port
add bridge=bridge-lan interface=ether3
add bridge=bridge-lan interface=bond-eoip

末端:

/interface bridge
add name=bridge-lan protocol-mode=rstp
/interface bridge port
add bridge=bridge-lan interface=ether3
add bridge=bridge-lan interface=bond-eoip

但我不建议在 5G 聚合链路上直接做大二层桥接,原因是广播、ARP、未知单播、环路、MTU、乱序都会放大问题。更稳的做法是三层路由。

6. 验证命令

6.1 查看 EoIP 是否 running

两端都执行:

/interface eoip print

正常应该看到 R 标记。

也可以看详细状态:

/interface eoip monitor eoip-5g1
/interface eoip monitor eoip-5g2

6.2 测试 bonding 对端

中心:

/ping 10.255.255.2

末端:

/ping 10.255.255.1

6.3 查看两条 EoIP 是否都有流量

中心或末端执行:

/interface monitor-traffic eoip-5g1,eoip-5g2

MikroTik 官方 bonding 示例也用 monitor-traffic 验证两条 EoIP 是否均衡分担流量。

6.4 带宽测试

末端向中心测:

/tool bandwidth-test 10.255.255.1 protocol=tcp direction=transmit

也可以测 UDP:

/tool bandwidth-test 10.255.255.1 protocol=udp direction=transmit

注意:bandwidth-test 会吃 CPU,低端 RouterBOARD 测出来可能不是链路真实上限。

7. 性能和稳定性建议

7.1 balance-rr 不一定适合所有 5G 场景

balance-rr 的优点是能把单连接拆到两条链路上。缺点是 5G 两条链路时延、抖动、丢包率通常不同,容易乱序。官方文档也提醒,balance-rr 在多链路收发时常出现包乱序,对 TCP 可能造成重传。

如果业务是视频上传、UDP 推流、专线备份、文件传输,可以测试 balance-rr

如果业务是普通办公、网页、VPN、RDP、VoIP,我更建议:

mode=active-backup

或者使用 PCC / ECMP 做多连接负载均衡,而不是单连接拆包聚合。

7.2 两条 5G 延迟差距越小越好

建议测试:

/ping 203.0.113.10 interface=lte1 count=20/ping 203.0.113.11 interface=lte2 count=20

如果一条 5G RTT 30 ms,另一条 5G RTT 90 ms,balance-rr 大概率会有明显乱序。

7.3 MTU 建议从 1400 开始

可以逐步测试:

/ping 10.255.255.1 size=1372 do-not-fragment=yes

如果通,再增加 size。实际 TCP MSS 建议 clamp,前面配置已设置:

clamp-tcp-mss=yes

7.4 防止默认路由把 EoIP 流量走错

末端必须确保:

203.0.113.10 只走 lte1203.0.113.11 只走 lte2

否则可能出现两条 EoIP 都从同一张 5G 卡出去,表面上 bonding 有两条 slave,实际底层只有一条物理出口。

8. 最小可用配置汇总

中心端简化版

/ip address
add address=203.0.113.10/24 interface=ether1
add address=203.0.113.11/24 interface=ether2

/interface eoip
add name=eoip-5g1 local-address=203.0.113.10 remote-address=198.51.100.21 tunnel-id=101 mtu=1400 keepalive=5s,3 clamp-tcp-mss=yes allow-fast-path=no
add name=eoip-5g2 local-address=203.0.113.11 remote-address=198.51.100.22 tunnel-id=102 mtu=1400 keepalive=5s,3 clamp-tcp-mss=yes allow-fast-path=no

/interface bonding
add name=bond-eoip mode=balance-rr slaves=eoip-5g1,eoip-5g2 link-monitoring=arp arp-ip-targets=10.255.255.2 arp-interval=500ms mtu=1400

/ip address
add address=10.255.255.1/30 interface=bond-eoip

/ip route
add dst-address=192.168.50.0/24 gateway=10.255.255.2

/ip firewall filter
add chain=input action=accept protocol=gre src-address=198.51.100.21 dst-address=203.0.113.10
add chain=input action=accept protocol=gre src-address=198.51.100.22 dst-address=203.0.113.11

末端简化版

/routing table
add name=to_5g1 fib
add name=to_5g2 fib

/ip dhcp-client
set [find interface=lte1] add-default-route=noset [find interface=lte2] add-default-route=no

/ip route
add dst-address=0.0.0.0/0 gateway=lte1 routing-table=to_5g1
add dst-address=0.0.0.0/0 gateway=lte2 routing-table=to_5g2

/routing rule
add dst-address=203.0.113.10/32 action=lookup-only-in-table table=to_5g1
add dst-address=203.0.113.11/32 action=lookup-only-in-table table=to_5g2

/interface eoip
add name=eoip-5g1 remote-address=203.0.113.10 tunnel-id=101 mtu=1400 keepalive=5s,3 clamp-tcp-mss=yes allow-fast-path=no
add name=eoip-5g2 remote-address=203.0.113.11 tunnel-id=102 mtu=1400 keepalive=5s,3 clamp-tcp-mss=yes allow-fast-path=no

/interface bonding
add name=bond-eoip mode=balance-rr slaves=eoip-5g1,eoip-5g2 link-monitoring=arp arp-ip-targets=10.255.255.1 arp-interval=500ms mtu=1400

/ip address
add address=10.255.255.2/30 interface=bond-eoipadd address=192.168.50.1/24 interface=ether3

AI给出结论

这个方案可以实现,但生产环境要重点验证三件事:

  1. 两张 5G 卡是否允许 GRE/EoIP。
  2. 两条 5G 链路 RTT、抖动是否接近。
  3. balance-rr 是否导致业务 TCP 乱序、重传。

如果 5G 卡是 CGNAT 或 GRE 不稳定,建议改成:

两条 WireGuard 隧道 -> EoIP over WireGuard -> bonding

这样穿透性和安全性通常会更好。

AI给出的配置方案是完全正确,且扩展了其他的配置思路,包括考虑到末端没有公网IP的情况,以及如何解决都给出了方案。虽然AI可以做出如此完整的配置方案,但对于小白来说实施起来也不是那么容易。当然用AI辅助写文章可以为我节约更多的时间。