这是百度网络监控工具 nettools 开源系列的第四篇。前三篇分别介绍了 bitflip/baize(UDP 丢包与改包检测工具和Agent)、lidar(TCP SYN 端口可达性探测),它们解决的都是「服务器之间」「点到点」的探测问题——前提是:探测机和被探测对象,至少有一端在我们手里。
但有一类设备,我们既无法在它上面装 agent,也没法在它对面的机房里放一台探测机。这就是今天的主角 evr 要解决的困境。
这也是我更深入的了解网络包的构造,把网络探测玩出花了来,对我的网络编程的功力大增的一个很好的场景。
项目地址:https://github.com/baidu/nettools
文档:https://nettools.rpcx.io
一、evr 探测的困境:探测机进不去客户机房
先说一个真实的场景。
百度有大量的云客户,我们提供的 EVR(Edge Virtual Router,边缘虚拟路由器) 设备作为客户侧网络接入百度云网络的边界节点。EVR 往上连百度的骨干/城域网络,往下连客户自己的虚拟网络(VXLAN overlay)。
EVR - 边缘虚拟路由器,通常用于在虚拟化环境中实现路由功能。EVR 位于网络的边缘,用于连接内部网络和外部网络(如客户机房)。
现在问题来了:我们需要监控「百度网络 → EVR」这一段链路的健康度——有没有丢包、延迟多大、有没有改包。按照前几个工具的套路,我们的方案应该是:
- 在 EVR 设备上装个 agent?—— 不行。EVR 是网络设备/客户侧设备,我们没有权限往里塞监控程序。
- 在 EVR 对面(客户机房内)放一台探测机,做点到点探测?—— 更不行。那是客户的机房,正常情况我们不可能在客户的物理环境里申请一台探测机常驻。
lidar 那一套「发 SYN,靠对端内核 TCP 协议栈自动回 SYN-ACK/RST」的思路,在这里也不灵——EVR 不是一台服务器,它不会帮你跑 TCP 协议栈三次握手,或者说不允许我们高频的探测。
1 | 百度侧 边缘设备 |
困境的本质是:被探测对象不可控,且它对面也无法部署探测机。 我们需要一个 「单边」 就能完成的探测方案——只在百度侧放一台机器,让 EVR 设备自己「帮我们把包送回来」。
答案藏在 EVR 设备的工作原理里:它是一个 VXLAN VTEP(VXLAN Tunnel End Point)。而 VTEP 有一个非常好用的特性——它会忠实地按照内层 IP 头转发解封后的内层帧。这就给了我们「构造一个会被反射回来的 VXLAN 包」的可能。
要理解这个技巧,得先看懂 VXLAN 的包结构。



