OPENSTACK 同一个子网的如何二层互访

这里创建两个虚机,一个在节点node-1,另一个在节点node-2。以下的说明会假设你对LINUX网桥、TAP设备、VETH连接对以及OVS都已经了解了。如果你不了解,请参考一下https://blog.csdn.net/qhqh310/article/details/129769606?spm=1001.2014.3001.5502
1、在node-1上运行:
[root@node01 ~]# ip tuntap
tap3a612207-5d: tap vnet_hdr
tap3a612207-5d 就是TAP设备,它对端对应虚拟机的网卡
我们可以画出虚拟机的连接图
VM---tap3a612207-5d
2、tap3a612207-5d又是如何连接的呢?我们再运行以下指令:
[root@node01 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02426f3f53f2       no
qbr3a612207-5d          8000.8ab18f23e128       no              qvb3a612207-5d
                                                        tap3a612207-5d
注意查看网桥qbr3a612207-5d,有两个设备连接上它,分别是qvb3a612207-5d和tap3a612207-5d。于是我们更新一下连接图
VM---tap3a612207-5d----网桥qbr3a612207-5d----qvb3a612207-5d
可见通过网桥,虚拟机跟qvb3a612207-5d相联了
3、qvb3a612207-5d又是如何连接的呢,运行以下指令
[root@node01 ~]# ip link show type veth
15: qvo3a612207-5d@qvb3a612207-5d: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master ovs-system state UP mode DEFAULT group default qlen 1000
    link/ether aa:fe:59:39:e4:81 brd ff:ff:ff:ff:ff:ff
16: qvb3a612207-5d@qvo3a612207-5d: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master qbr3a612207-5d state UP mode DEFAULT group default qlen 1000
    link/ether 8a:b1:8f:23:e1:28 brd ff:ff:ff:ff:ff:ff
可以看到qvb3a612207-5d是一个veth对,另一端连接到了qvo3a612207-5d上。因此我们再更新一下连接图
VM---tap3a612207-5d----网桥qbr3a612207-5d----qvb3a612207-5d----qvo3a612207-5d
4、qvo3a612207-5d又是如何连接的呢?我们再运行以下指令,查看OVS网桥:
docker exec openvswitch_vswitchd ovs-vsctl show
docker exec openvswitch_vswitchd ovs-vsctl show
3eddd231-2899-40bc-871d-b6f29aa86ced
    Manager "ptcp:6640:127.0.0.1"
        is_connected: true
    Bridge br-tun
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
        Port "vxlan-0a678195"
            Interface "vxlan-0a678195"
                type: vxlan
                options: {df_default="true", egress_pkt_mark="0", in_key=flow, local_ip="10.103.129.147", out_key=flow, remote_ip="10.103.129.149"}
        Port patch-int
            Interface patch-int
                type: patch
                options: {peer=patch-tun}
        Port "vxlan-0a678194"
            Interface "vxlan-0a678194"
                type: vxlan
                options: {df_default="true", egress_pkt_mark="0", in_key=flow, local_ip="10.103.129.147", out_key=flow, remote_ip="10.103.129.148"}
        Port br-tun
            Interface br-tun
                type: internal
    Bridge br-ex
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port br-ex
            Interface br-ex
                type: internal
        Port "ens33"
            Interface "ens33"
    Bridge br-int
        Controller "tcp:127.0.0.1:6633"
            is_connected: true
        fail_mode: secure
        datapath_type: system
        Port "qvo3a612207-5d"
            tag: 2
            Interface "qvo3a612207-5d"
        Port br-int
            Interface br-int
                type: internal
        Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}
        Port "qvo9ab44fd3-c2"
            tag: 3
            Interface "qvo9ab44fd3-c2"
        Port patch-tun
            Interface patch-tun
                type: patch
                options: {peer=patch-int}
这里显示的是OVS网桥的连接关系。先看看br-int这个网桥。在这里面我们看到了qvo3a612207-5d,没错它是连接到br-int这个网桥的,这里面注意它下面有个tag: 2。网桥里面的端口如果有tag,那么只有相同的tag的才能互访。不同tag的无法互访问。当然有tag的跟无tag的也可以互访。因此如果是同一个宿主机同一个子网的不同虚拟机,那么tag 是一样的,它们是通过br-int这个网桥来互联的。而不同子网的虚拟机,二层是不通的。如果我们要访问另一个节点的同子网的VM,则是通过网桥br-tun的VXLAN隧道来进行。网桥br-int和br-tun是通过patch-tun和patch-int来互联的。
VM---tap3a612207-5d----网桥qbr3a612207-5d----qvb3a612207-5d----qvo3a612207-5d----OVS的br-int----patch-tun----patch-int----OVS的br-tun。在br-tun我们看到有两个vxlan隧道vxlan-0a678195和vxlan-0a678194,分别去往网络节点和node-2节点。这里面需要注意的是VXLAN隧道里面只有源和目的IP,但没有隧道ID,in_key和out_key都是flow,即通过流表来下发。实际上不同的子网对应不同的隧道ID,由openstack来维护并以流表的形式下发给OVS,指导转发。具体可参考https://blog.csdn.net/qy6kwyec/article/details/54999417。这里简单说一下:
查看转发流表
docker exec openvswitch_vswitchd ovs-ofctl dump-flows br-tun
发出的报文
cookie=0xd624bc7a8a9d112d, duration=539843.275s, table=22, n_packets=1648, n_bytes=550100, idle_age=52, hard_age=65534, priority=1,dl_vlan=2 actions=strip_vlan,load:0x1->NXM_NX_TUN_ID[],output:4,output:5
tag为2则使用tun_id 0x1

cookie=0xd624bc7a8a9d112d, duration=2282.550s, table=22, n_packets=48, n_bytes=14064, idle_age=15, priority=1,dl_vlan=3 actions=strip_vlan,load:0x2->NXM_NX_TUN_ID[],output:4,output:5
tag为3则使用tun_id 0x2

返回的报文
cookie=0xd624bc7a8a9d112d, duration=538298.019s, table=4, n_packets=1969, n_bytes=651459, idle_age=5, hard_age=65534, priority=1,tun_id=0x1 actions=mod_vlan_vid:2,resubmit(,10)
tun_id是0x1加上tag 2

cookie=0xd624bc7a8a9d112d, duration=730.471s, table=4, n_packets=0, n_bytes=0, idle_age=730, priority=1,tun_id=0x2 actions=mod_vlan_vid:3,resubmit(,10)
tun_id是0x2加上tag 3
从这个就要以看出,不同的网络是通过tun_id来进行隔离的。
最后更新一下转发图,最终回到VM2
VM---tap3a612207-5d----网桥qbr3a612207-5d----qvb3a612207-5d----qvo3a612207-5d----OVS的br-int----patch-tun----patch-int----OVS的br-tun----vxlan-0a678194(通过流表下发隧道ID 1)--------------vxlan隧道-----------------node-2的vxlan-xxxxxxx端口......以下的跟node-1
的基本一样了----VM2。

可以看看这篇博文,说得非常清楚,下图也是取自这篇文章的。https://blog.csdn.net/u013469753/article/details/119039418

  • 1.vm1向vm2发起请求,通过目的IP地址得知vm2与自己在同一网段。
  • 2.数据包经过linux bridge,进行安全策略检查,进入br-int打上内部vlan号。
  • 3.数据包脱掉br-int的内部vlan号进入br-tun/br-vlan。
  • 4.进入br-tun的数据包此时vxlan封装并打上vni号,进入br-vlan的数据包此时打上外部vlan号,通过nic离开compute1。
  • 5.数据包进入compute2,经过br-tun的数据包完成vxlan的解封装去掉vni号,经过br-vlan的数据包去掉vlan号。
  • 6.数据包进入br-int,此时会被打上内部vlan号。
  • 7.数据包经过离开br-int并去掉内部vlan号,送往linux bridge通过其上的iptables安全策略检查。
  • 8.最后数据包送到vm2。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值