LTE VPN 链路上的 EoIP:搭建一个小型 RouterOS 实验
EoIP 用 GRE 承载以太网帧,而 GRE 本身不加密。先在可用的 WireGuard 链路上搭好实验,保持网桥隔离,把 42 字节计入预算。
EoIP 接收完整的以太网帧,用 GRE 将其封装,再发送到配置好的远端地址,因此它表现得像一根网线,而不是一条路由。离开路由器的内容是 IP 协议 47,原始帧作为负载,所以广播、ARP 和非 IP 协议都能通过。GRE 本身不提供任何机密性,任何能看见外层报文的人都能读到里面的帧。仅凭这一点,实验就必须按这个顺序进行:先建好加密通路,再把以太网装进去。
EoIP 封装什么,不封装什么
封装就是全部机制。帧到达加入网桥的端口,被加上 GRE 头和外部 IP 头,送到对端路由器;对端剥掉两层头,把帧注入自己的网桥。接收方网桥学习源 MAC 的方式与从本地端口学习完全一样。整个过程既不认证帧,也不隐藏帧。
因此机密性只能来自 GRE 报文所走的通路。在本设计中,底层是两台路由器之间的 WireGuard 或 IPsec 隧道,EoIP 跑在它里面。MikroTik 还在 EoIP 接口自身上提供自动 IPsec 选项,那是另一种做法,本实验不采用。
对于需要路由的 IP 服务,路由式 VPN 是更小的设计,也更值得优先采用。只有当设备确实需要看到另一站点的以太网帧时,才动第二层。
前提条件:一条加密的底层通路和两个未使用的端口
两台路由器都需要一条已经建立的加密链路,以及链路上对端可达的地址。外层连接由 LTE 侧发起,所以中心端从不拨号移动网络,LTE 路由器则维持运营商所要求的 NAT 状态。在往上叠加任何东西之前,先确认隧道已经通了,因为一个到不了远端地址的 EoIP 接口,看起来和配置错误的接口一模一样。
每台路由器还需要一个尚未加入网桥、不是 VLAN 干道、不是管理接口、也不是生产链路的端口。借用在线端口的实验不算实验,其故障模式是生产网里的广播风暴。开始之前,先把管理搬到另一个接口或控制台。
Hub tunnel address: 10.44.7.1/32
LTE tunnel address: 10.44.7.2/32
Lab ports: ether7 on both routers, unused
Test hosts: 192.168.77.11/24 and 192.168.77.12/24
这些取值只是示例,不是必须。它们必须落在隧道接口上,并通过受保护的路径路由。两台路由器的防火墙策略都必须允许两个隧道地址之间的 GRE,而 GRE 是 IP 协议 47,不是编号 47 的 TCP 或 UDP 端口。本设计从不把裸 GRE 暴露给任何一侧 WAN。
用一致的 ID 建立隧道对
两端是同一个逻辑接口的两次定义,所以每个标识字段都必须一致。中心端:
/interface eoip add name=eoip-lab local-address=10.44.7.1 remote-address=10.44.7.2 tunnel-id=37 mac-address=02:1A:2B:00:00:01
LTE 路由器上地址对调,MAC 也不同:
/interface eoip add name=eoip-lab local-address=10.44.7.2 remote-address=10.44.7.1 tunnel-id=37 mac-address=02:1A:2B:00:00:02
隧道 ID 两端必须一致,也不能与任一台路由器上已配置的另一对隧道冲突。MAC 地址是本地管理的值,在你要加入的二层域内必须唯一,因此不要照抄厂商示例里的值。接口名对每台路由器都是本地的,只要你自己脚本里保持一致即可。
现行的 EoIP 手册 记录了端点和隧道 ID 字段,并明确指出 EoIP 是 GRE 之上的以太网。那条命令不做任何加密,所以先检查底层通路。
只把测试端口加入网桥
网桥把隧道变成网段,而它的成员构成就是全部安全边界。中心端:
/interface bridge add name=br-eoiphub protocol-mode=rstp auto-mac=no admin-mac=02:1A:2B:00:01:01
/interface bridge port add bridge=br-eoiphub interface=ether7
/interface bridge port add bridge=br-eoiphub interface=eoip-lab
LTE 路由器上:
/interface bridge add name=br-eoiplte protocol-mode=rstp auto-mac=no admin-mac=02:1A:2B:00:01:02
/interface bridge port add bridge=br-eoiplte interface=ether7
/interface bridge port add bridge=br-eoiplte interface=eoip-lab
这些命令新建网桥,并各自恰好加入两个端口。EoIP 接口是二层成员;加密隧道始终是路由式传输,绝不能作为网桥端口加入。不要加入生产端口,也不要在实验网桥上启动 DHCP 服务器。
给两台测试主机分配未使用子网中的地址,且该子网没有竞争性的 DHCP 服务器,例如 192.168.77.11/24 和 192.168.77.12/24。在该子网内互访不需要默认网关,帧的通过也不需要路由器接口地址。
扩展 LAN 之前先算清开销
IPv4 上的 EoIP 会在所承载的负载外加上以太网、GRE 和外部 IP 头。对不带标签的情况,MikroTik 记录的开销是 42 字节,因此可用 IP MTU 为 1400 字节的底层通路,留给内层帧的是 1358 字节。这个数字是预算,不是通用的 MSS 值,它并不强迫网桥上的主机发出更小的帧。
先在通路上核实真实的上限,再用设备实际发送的最大帧去测试。必须在受保护路径内分片的 1500 字节帧,与能装下的帧表现不同,其差异体现为应用卡死,而不是链路中断。
/interface eoip print detail where name=eoip-lab
/interface bridge host print where bridge=br-eoiphub
/ping 192.168.77.12 count=4 interface=br-eoiphub
RSTP 处理的是环路,而不是任意并行路径,所以试点拓扑要保持简单。扩展网桥也会把广播、组播和 DHCP 行为延伸到移动链路上,无论有没有有用的帧在流动,这些流量都在消耗容量。
只有当实验达到你真正需要的帧尺寸和应用表现之后,才规划生产接入。切换之前,先就地址规划、VLAN 归属、DHCP 授权、防环手段,以及链路本身中断时如何到达路由器达成一致。以太网扩展在连接设备的同时也连接了故障域,因此它值得一个变更窗口,而不是在运行中的网桥上再加一个端口。