vm-流量走向

发布时间 2023-04-25 10:02:41作者: XU-NING

vm-流量走向

1、流量经由虚拟机内核TCP/IP协议栈交给虚拟网卡vNIC处理,vNIC是一个Tap设备,Tap设备可以运行在 GuestOS上,提供与物理NIC完全相同的功能。

虚拟机的 vNIC(Tap 设备)没有直连到 OvS Bridge上?而是通过 Linux Bridge 中继到 OvS br-int(综合网桥)

为什么 vNIC 不直连 br-int?这是因为 OvS 在 v2.5 以前只有静态防火墙规则,并不支持有状态的防火墙规则。这些规则是 Neutron Security Group 的底层支撑,为虚拟机提供针对端口(vNIC)级别的安全防护,所以引入了 Linux Bridge 作为安全层,应用 iptables 对有状态的数据包进行过滤。其中 Linux Bridge qbr 是 quantum bridge 的缩写。

2、Linux Bridge(qbr) 与 OvS Bridge (br-int)之间通过 veth pair (虚拟网线)设备连接,“网线” 的一端命名为 qvb(quantum veth bridge)另一端命名为 qvo(quantum veth ovs)。veth pair 设备总是成对存在的,用于连接两个虚拟网络设备,模拟虚拟设备间的数据收发。veth pair 设备的工作原理是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核 TCP/IP 协议栈进行处理,最终重定向到目标设备(“网线” 的另一端)。

3、OvS(br-int)是一个综合网桥,作为计算节点本地(Local)虚拟交换设备,完成虚拟机流量在本地的处理Tenant网络的Local VLAN ID由内部分配

虚拟机发出的流量在 br-int 打上 Local VLAN tag,传输到虚拟机的流量在 br-int 被去掉 Local VLAN tag。

本地虚拟机之间的 2 层流量直接在 br-int 转发,被同 VLAN tag 的端口接收。

4、从本地虚拟机传输到远端虚拟机(或网关)的流量由 OvS br-int 上的 int-br-eth1(ovs patch peer 设备)端口送到 OvS br-ethX 上。需要注意的是,br-ethX 并未是一成不变的:当网络类型为 Flat、VLAN 时,使用 br-ethX;当网络类型为 Tunnel(e.g. VxLAN、GRE)时,br-ethX 就会被 br- tun 替换。上图示例为 VLAN 网络。我们将 br-ethX、br-tun 统称为租户网络层网桥设备(TNB),以便于叙述。

NOTE:qbr-xxx 与 OvS br-int 之间使用 veth pair 设备相连,br-int 与 br-ethx/br-tun 之间使用 patch peer 设备相连。两种都是类似的虚拟 “网线”,区别在于前者是 Linux 虚拟网络设备,后者是 OvS 实现的虚拟网络设备。

NOTE:如果租户网桥是 br-tun 而不是 br-ethX,那么在 br-tun 上会有 port:patch-int,br-int 上

会有 port:patch-tun,通过 patch-int 和 patch-tun 实现租户网桥 br-tun 和本地网桥 br-int 之间的通信。

5、当虚拟机流量流经 OvS br-int 与 OvS br-ethX 之间时,需要进行一个至关重要且非常复杂的动作

—— 内外VID(VLAN ID)转换。这是一种 “分层兼容” 的设计理念,让我想起了:所有计算机问题都可以通过引入一个中间层来解决。而 Neutron 面对的这个问题就是 —— 支持多种租户网络类型(Flat、VLAN、 VxLAN、GRE)

其中本地网络层通过 VLAN ID 来划分 br-int 中处于不同网络的虚拟机(端口),本地网络仅支持 VLAN 类型;而租户网络层为了实现多类型混合平面的需求却要支持非隧道类型网络 Flat、 VLAN(br-ethX)及隧道类型网络 VxLAN、GRE(br-tun)。显然,本地网络层和租户网络层之间必须存在一层转换。这就是所谓的 VID 转换。

6、最后虚拟机流量通过挂载到 TNB(br-ethX/br-tun)上的物理网卡 ethX 发出到物理网络。OvS br- int 与 OvS br-ethX 之间也是通过 veth pair 设备实现

7、虚拟机的流量进入到物理网络之后,剩下的就是传统网络的那一套了。网络包被交换机或其他桥接设备转发到其他计算、网络节点(PS:这取决于具体的部署网络拓扑,一般虚拟机流量只会被同处 Internal Network 的计算节点)接收到。

8、物理网卡 ethX(OvS br-ethX/br-tun)从物理网络接收到从计算节点上虚拟机发出的外部网络访问流量,首先进行内外 VID 转换,然后通过 VETH Pair 设备传输到 OvS br-int。

NOTE:针对每一个租户网络在租户网络层上的 VID 肯定的一致的,而在不同(计算、网络)节点上的 Local VLAN ID 却未必一样,但这并不会导致不同租户网络间的数据包混乱,因为这一切都在 Open vSwitch 流表的掌握之中,我们暂且先对这个问题有个印象。

9、在网络节点上 OvS br-int 连接了不同的 Network namesapce,qrouter-XXX 通过 qr-XXX 端口接收到租户内跨网段访问流量以及公网访问流量

跨网段访问流量:qr-XXX 端口接收到流量后,内核 TCP/IP 协议栈根据 qrouter-XXX 中的路由规则对跨网段访问流量进行路由、改写 MAC 地址并通过相应的 qr-YYY 接口向 OvS br-int 传输数据包。实现不同网段之间的路由转发。

公网访问流量:qr-XXX 端口接收到流量后,内核 TCP/IP 协议栈根据 qrouter-XXX 中的 iptables NAT 规则对流量进行网络地址转换(Floating IP 的实现原理),之后再通过 qg-XXX 接口将数据包发送给 OvS br-ex。

10、最终由连接第二层网关并挂载到 br-ex 上的物理网卡 ethX 发出送至 Internet 路由器。