首先说明,这是一篇结合 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 口:ether3EoIP 隧道规划
EoIP-1:末端 lte1 -> 中心 203.0.113.10
EoIP-2:末端 lte2 -> 中心 203.0.113.11
tunnel-id 101:EoIP-1
tunnel-id 102:EoIP-2bonding 内部互联 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=lte24.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-5g26.2 测试 bonding 对端
中心:
/ping 10.255.255.2末端:
/ping 10.255.255.16.3 查看两条 EoIP 是否都有流量
中心或末端执行:
/interface monitor-traffic eoip-5g1,eoip-5g2MikroTik 官方 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=yes7.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=ether3AI给出结论
这个方案可以实现,但生产环境要重点验证三件事:
- 两张 5G 卡是否允许 GRE/EoIP。
- 两条 5G 链路 RTT、抖动是否接近。
- balance-rr 是否导致业务 TCP 乱序、重传。
如果 5G 卡是 CGNAT 或 GRE 不稳定,建议改成:
两条 WireGuard 隧道 -> EoIP over WireGuard -> bonding这样穿透性和安全性通常会更好。
AI给出的配置方案是完全正确,且扩展了其他的配置思路,包括考虑到末端没有公网IP的情况,以及如何解决都给出了方案。虽然AI可以做出如此完整的配置方案,但对于小白来说实施起来也不是那么容易。当然用AI辅助写文章可以为我节约更多的时间。