L2 VPN 与 L3 隧道:桥接站点前的五项检查
L3 隧道会丢弃以太网帧头,因此 ARP、PXE 和非 IP 协议都会失效。五项检查用来判断你是否真的需要帧。
你把一个站点桥接起来,是因为某个工具坚持它必须位于同一网段,而三周之后你在凌晨两点读交换机日志。这种直觉决定了太多 Ethernet-over-IP 链路。这里真正重要的只有一个差别:是整帧端到端传输,还是只传 IP 报文。按顺序执行下面五项检查,并在第一项不通过时停下。
先看清应用到底在线上放什么
在任何产品名称进入讨论之前,先抓取一分钟必须穿过链路的流量: tcpdump -i eth0 -nn -e 'not ip'。其中 -e 选项会打印链路层帧头,而那正是路由型隧道丢弃的部分。如果抓包为空,说明应用说的是 IP,L3 隧道可以原样承载。如果确实出现帧,就记下 EtherType,因为 0x0806 是 ARP, 0x88cc 是 LLDP,而厂商自定义值通常意味着没有 IP 兜底的发现协议。到这一步,普通的 tun 接口就不够用了。
在远端也重复一次抓包。只存在于某台主机虚拟交换机内部的帧,不是把广播域延伸到 WAN 的理由。
检查发现机制是否必须穿过链路
路由型隧道没有共享网段,所以任何发往组播组的内容都到不了对端。ARP、DHCP 广播、发往 224.0.0.251的 mDNS、SSDP 以及 NetBIOS 名称查询,都假定存在一条多台主机能同时听到的链路。
问清楚应用真正依赖其中哪几项,以及是否已有对应的代理。DHCP 中继、mDNS 反射和静态 ARP 表项各自去掉一项依赖,而每一项也都是需要运行和监控的服务。当只剩两三项时,桥接才是诚实的答案。
算清额外帧头带来的代价
帧需要有落脚之处,因此你发出的每个包外面都要再套一层帧头。在 VXLAN 叠加网络中,这意味着外层 IP 头、UDP 头和 8 字节的 VXLAN 头,会把满载的 1,500 字节载荷顶到普通 1,500 字节互联网链路的路径 MTU 之外。OpenVPN 的 tap 模式也会朝同一方向增加开销。内层 MTU 不降低,你得到的就是一条能回应 ping、却在第一次大传输时卡住的链路。
账单不止帧头字节。交换机在硬件里处理的广播和组播,如今要跑在 WAN 上;每个被桥接的站点还继承同一套地址规划、DHCP 作用域和重复地址行为。这使这条链路比每站点一个前缀的路由池难审计得多。
选之前先算一算。一个繁忙网段复制到三个站点,可能搬运的广播流量比它最初要承载的文件传输还多。
检查对方给你的到底是哪种 L2 VPN
这个词本身就有歧义,而歧义决定了谁来承载你的流量。有时它描述的是载荷:IP 里的以太网帧,像任何隧道一样走互联网,VXLAN、ZeroTier 和 OpenVPN 的 tap 模式就是这样。有时它描述的是买来的服务:运营商以太网专线,或把两个站点接在同一家运营商网络内的 MPLS 伪线。
两者都给你一个网段,应用分辨不出来,但运维差别很大。叠加网络把 MTU、加密和底层路径的责任留给你。运营商服务把这些接过去并为此收费,而且根本不会把你的帧路由到公网上。要哪一种,取决于两个站点是共用一家运营商,还是只同属一家公司。
桥接之前,先试更便宜的绕行方案
大多数桥接需求来自一次坏掉的域名解析,而不是真的需要帧的协议。先把解析器和搜索域推过路由隧道: dhcp-option DNS 10.8.0.1 加上 dhcp-option DOMAIN internal.example ,写在 OpenVPN 服务端配置里,就能解决其中相当多的情况。远端放一个本地转发器,同样能解决问题,而不搬运任何广播流量。
如果还有一个老工具不行,就把那个工具放到目标网段的代理或跳板机后面。维护一个 TCP 转发器,比维护一条桥接 WAN 便宜。
按顺序收口:流量里有没有非 IP 的 EtherType,发现机制是否必须跨过去,MTU 能否吸收额外帧头,运营商专线是否真的可用,以及路由方案失败的原因你是否说得出来。任何一步答否,就应当保留现有的隧道。 把抓包结果和 EtherType 清单随变更记录一起归档,因为下一个人会问同样的问题,而且不想再测一遍。