4.4. 扁平提供商网络数据包流的工作方式是什么?

本节介绍了如何将流量流进到具有扁平供应商网络配置的实例。

扁平提供商网络中的传出流量流

下图描述了离开实例的流量的数据包流,直接到达外部网络。配置 br-ex 外部网桥后,将物理接口添加到网桥,并将实例生成到 Compute 节点后,生成的接口和网桥配置类似于下图中的配置(如果使用 iptables_hybrid 防火墙驱动程序):

网络数据包流 - 出站
  1. 数据包离开实例的 eth0 接口,并到达 linux 网桥 qbr-xx
  2. 网桥 qbr-xx 连接到 br-int,使用 veth 对 qvb-xx <-> qvo-xxx。这是因为网桥用于应用安全组定义的入站/出站防火墙规则。
  3. 接口 qvb-xx 连接到 qbr-xx linux 网桥,qvoxx 连接到 br-int Open vSwitch (OVS) 网桥。

'qbr-xx'Linux 网桥配置示例:

 # brctl show
qbr269d4d73-e7		8000.061943266ebb	no		qvb269d4d73-e7
							tap269d4d73-e7

br-int 上的 qvo-xx 配置:

 # ovs-vsctl show
  Bridge br-int
        fail_mode: secure
            Interface "qvof63599ba-8f"
        Port "qvo269d4d73-e7"
            tag: 5
            Interface "qvo269d4d73-e7"

注意

端口 qvo-xx 使用与扁平提供商网络关联的内部 VLAN 标签标记。在本例中,VLAN 标签是 5。当数据包到达 qvo-xx 时,VLAN 标签将附加到数据包标头中。

数据包然后被移到 br-ex OVS 网桥,使用 patch-peer int-br-ex <-> phy-br-ex

br-int 上的 patch-peer 配置示例:

 # ovs-vsctl show
    Bridge br-int
        fail_mode: secure
       Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}

br-ex 上 patch-peer 配置示例:

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port br-ex
            Interface br-ex
                type: internal

当此数据包到达 br-ex 上的 phy-br-ex 时,br-ex 中的 OVS 流会剥离 VLAN 标签(5),并将它转发到物理接口。

在以下示例中,输出中的 phy-br-ex 的端口号显示为 2

 # ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:00003440b5c90dc6
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE

 2(phy-br-ex): addr:ba:b5:7b:ae:5c:a2
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

以下输出显示了到达 phy-br-ex (in_port=2)的数据包,其 VLAN 标签为 5 (dl_vlan=5)。此外,br-ex 中的 OVS 流将剥离 VLAN 标签,并转发数据包到物理接口。

# ovs-ofctl dump-flows br-ex
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=4703.491s, table=0, n_packets=3620, n_bytes=333744, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=3890.038s, table=0, n_packets=13, n_bytes=1714, idle_age=3764, priority=4,in_port=2,dl_vlan=5 actions=strip_vlan,NORMAL
 cookie=0x0, duration=4702.644s, table=0, n_packets=10650, n_bytes=447632, idle_age=0, priority=2,in_port=2 actions=drop

如果物理接口是另一个 VLAN 标记的接口,则物理接口将标签添加到数据包。

扁平提供商网络中传入流量流

本节包含有关来自外部网络的传入流量流的信息,直到到达实例的接口。

网络数据包流 - 入站
  1. 传入流量到达物理节点上的 eth1
  2. 数据包传递到 br-ex 网桥。
  3. 数据包通过 patch-peer phy-br-ex <--> int-br-ex 移到 br-int

在以下示例中,int-br-ex 使用端口号 15。查看包含 15 (int-br-ex) 的条目:

 # ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:00004e67212f644d
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
 15(int-br-ex): addr:12:4e:44:a9:50:f4
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

观察 br-int 上的流量流

  1. 当数据包到达 int-br-ex 时,br-int 网桥内的 OVS 流规则是添加内部 VLAN 标签 5 的数据包。查看 actions=mod_vlan_vid:5 条目:

     # ovs-ofctl dump-flows br-int
    NXST_FLOW reply (xid=0x4):
     cookie=0x0, duration=5351.536s, table=0, n_packets=12118, n_bytes=510456, idle_age=0, priority=1 actions=NORMAL
     cookie=0x0, duration=4537.553s, table=0, n_packets=3489, n_bytes=321696, idle_age=0, priority=3,in_port=15,vlan_tci=0x0000 actions=mod_vlan_vid:5,NORMAL
     cookie=0x0, duration=5350.365s, table=0, n_packets=628, n_bytes=57892, idle_age=4538, priority=2,in_port=15 actions=drop
     cookie=0x0, duration=5351.432s, table=23, n_packets=0, n_bytes=0, idle_age=5351, priority=0 actions=drop
  2. 第二条规则管理到达 int-br-ex (in_port=15)且无 VLAN 标签(vlan_tci=0x0000)的数据包:此规则将 VLAN 标签 5 添加到数据包(actions=mod_vlan_vid:5,NORMAL),并将它转发到 qvoxxx
  3. 在剥离 VLAN 标签后,qvoxxx 接受数据包并将其转发到 qvbxx
  4. 然后,数据包到达实例。
注意

VLAN 标签 5 是一个 VLAN 示例,用于在具有扁平提供商网络的测试 Compute 节点上使用;这个值由 neutron-openvswitch-agent 自动分配。对于您自己的扁平提供商网络,这个值可能会有所不同,且在两个单独的 Compute 节点上同一网络可能会有所不同。