OpenStack 使用 Vlan 实现内网隔离的原理

作者: 王炳明 分类: OpenStack,网络基础 发布时间: 2020-12-11 09:51 热度:3,590

1. 交换机口的类型

交换机上的口,有三种类型:

  1. Access类型:只属于1个VLAN,一般用于连接计算机的端口,离开计算机到交换机的以太帧会打上 tag,而离开交换机到计算机的不会打tag;
  2. Trunk类型:可以允许多个VLAN通过,一般用于两个交换机之间连接,只允许缺省 vlan 的报文不打标签;
  3. Hybrid类型:可以允许多个VLAN通过,一般用于两个交换机之间连接,可以允许多个vlan的报文不打标签。

对应到 ovs 上。

  • tap/vhu 设备接入到 br-int 上是 access 端口类型
  • br-int 和 br-ovs 之间通过 patch pair 对连接,patch 端口是 trunk 类型

同一个交换机上 hybrid 和 trunk 不能并存。

2. vlan 隔离原理

内网隔离可以分为两种:

第一种:同一宿主机上的机器内网隔离

不同客户虚拟机的内网 tap 设备对应的端口类型是 access 的,只允许相同 ovs-vlan-tag 的通过。

这个 ovs-vlan-tag 可以通过 ovs-vsctl show 查得

一个网络(net)一个tag,公网网络的 tag 固定为 1(neutron-openvswitch-agent 根据 network_type = flat 分配的),其他的 vlan 网络从 2 开始分配。

第二种:不同宿主机上的机器内网隔离

由于不同宿主机之间的通信要经过物理交换机,因此 ovs-vlan-tag 在从 br0-ovs 转出去时要将 ovs-vlan-tag 转成 物理交换机的 vlan-tag,当数据包转到另一台宿主机时,进入 br0-ovs 时再将物理交换机的 vlan-tag 转成 ovs-vlan-tag。

一个租户 一个 vlan_id ,不同租户的 vlan_id 各不相同。

这个 vlan id 理论上最多只有 4096个,但是vmp的限定范围是

# 控制节点:/etc/neutron/plugin.ini
network_vlan_ranges = phynet0:1000:1998

通过 neutron net-show 可以看到 segmentation_id 就是对应租户在物理机交换机上专属的 vlan-id

OpenStack 使用 Vlan 实现内网隔离的原理

对于公网流量,在离开 tap 进入 br-int 时,会被打上 tag =1,之后数据包到达 br0-ovs 的时候,流表会根据 dl_vlan=1 这个条件,使用 actions=strip_vlan 动作把 tag 去掉,再发出去。

priority=4,in_port=6,dl_vlan=1 actions=strip_vlan,NORMAL

3. MAC 帧格式

MAC 帧的格式发如下:
OpenStack 使用 Vlan 实现内网隔离的原理
vlan id 数据是存放在类型里的,类型可以存放 2个字节的数据,其中 vlan id 占 12个bit, 2^12=4096 ,因此vlan id 取值范围 0~4095,其中 0 和 4095 保留。

OpenStack 使用 Vlan 实现内网隔离的原理

TPID(Tag Protocol Identifier,标签协议标识)值规定为0x8100。设备缺省采用协议规定的TPID值,交换机通过TPID来确定数据帧是否附加基于IEEE802.1Q的VLAN信息。

TCI(Tag Control Information,标签控制信息)字段分为Pri、CFI和VLAN三部分。Pri表示报文优先级(也称1p优先级、COS或1q优先级),CFI(Canonical Format Indicator)标识MAC地址在不同传输介质中是否以标准格式进行封装,通常为0(标准格式)。Vlan ID标识该报文所属的VLAN编号,取值范围为 0~4095,一般0和4095保留(中兴设备Vid=0表示priority-tagged帧)。

4. vlan 的不足之外

  1. VLAN 使用 12-bit 的 VLAN ID,所以 VLAN 的第一个不足之处就是它最多只支持 4096 个 VLAN 网络(当然这还要除去几个预留的),对于大型数据中心的来说,这个数量是远远不够的。

  2. VLAN 是基于 L2 的,所以很难跨越 L2 的边界,在很大程度上限制了网络的灵活性。

  3. VLAN 操作需手工介入较多,这对于管理成千上万台机器的管理员来说是难以接受的。

以上在中小公司,用于小规模的云平台服务完全是可以的,但是每一个小公司都有一颗做大的心嘛,所以还是不提倡的。

参考文章

文章有帮助,请作者喝杯咖啡?

发表评论