nginx 适配 Overlay 以及测试工具

本文分享自天翼云开发者社区《nginx适配Overlay以及测试工具》,作者:pan
Overlay 与 Underlay 介绍
Overlay 网络和 Underlay 网络是一组相对概念,Overlay 网络是建立在 Underlay 网络上的逻辑网络。而 Overlay 网络是通过网络虚拟化技术,在同一张 Underlay 网络上构建出的一张或者多张虚拟的逻辑网络,如下图所示。
详细资料可查看https://zhuanlan.zhihu.com/p/436605135

ELB 使用的技术方案
天翼云 ELB 使用 VXLAN 隔离,需要进行 VXLAN 的解析与封装。VXLAN 技术是一种大二层的虚拟网络技术,主要原理是引入一个 UDP 格式的外层隧道作为数据链路层,而原有数据报文内容作为隧道净荷加以传输。
ELB 使用 dpvs 以及 nginx 做 7 层 http 和 https 的代理以及分发。报文流向为客户端(内网或者公网)->ELB(内部为 dpvs->nginx)->RS(真正的 http 服务端)。因为 ELB 和 RS 处于同一 VXLAN 中,那么 nginx 转发的报文就需要封装 VXLAN,又因为 RS 需要知道真实的客户端 IP,nginx 也需要获取客户端 IP 并转发的时候增加 X-Forwarded-For。
dpvs 收到报文会解析 VXLAN,同时转发到 nginx,因为 dpvs 采用 FULLNAT 的模式,nginx 如果要获取真实 ip,二者之间采用了 Proxy Protocol。Proxy protocol,是一个 Internet 协议,通过为 tcp 添加一个很小的头信息,来方便的传递客户端信息(协议栈、源 IP、目的 IP、源端口、目的端口等)。因为 nginx 还需要知道 VXLAN 的 id,对 Proxy Protocol 进行了改造,增加了 vni 字段,如下图。

nginx 就需要在原生代码基础上,增加 vni 字段的读取。同时连接 upstream 时,因为需要封装 vni,通过 SO_BINDTODEVICE 绑定到具体网卡,完成 VXLAN 封装。
如何测试
因为相比 Proxy Protocol 多一个字段,通过 curl 无法自测,通过一个 python 工具来测试,源码为https://github.com/codejudas/py-proxy-protocol/。但是需要修改,增加一个 vni 字段,在代码中涉及 vni 的地方均添加字段即可,如下图。

然后修改测试下面的 socket.py,测试结果如图:

评论