
简介一份面向云计算研究人员、OpenStack开发及运维技术人员的多租户网络隔离技术应用研究文档系统梳理了VLAN、VXLAN、GRE等核心技术在OpenStack环境下的原理、配置与适用场景。资源为单个PDF电子文档容量仅136KB内容由绪论、相关技术、隔离方案设计、实现配置与测试评估等章节构成详细展开了OpenStack平台架构与Neutron组件、二层及三层网络隔离机制、综合隔离方案部署、租户网络创建与连接、安全策略实施并通过连通性测试、性能监控与异常模拟验证方案有效性。全文提供实际案例和操作步骤适合在多租户云平台网络规划与部署时参考借鉴有助于提升租户间网络隔离的安全性与稳定性保障访问控制和数据加密等策略落地。该文档已有92人学习对正在开展OpenStack网络实践或相关课题研究的读者具有直接指导价值。1. OpenStack多租户网络隔离云平台里那道看不见的租户防火墙把两个独立客户的服务塞进同一套OpenStack云平台网络层怎么办这是每个做openstack云平台搭建的人都会撞上的问题。租户A和租户B可以各自规划完全相同的IP段各自跑Web服务互不感知也互不可达——这就是多租户网络隔离要解决的事。它不只是把端口隔开而是从二层广播域、三层路由、安全组防火墙到资源配额四层机制一起作用的结果。本文把这套隔离机制拆开讲透先讲Flat、VLAN、VXLAN三种网络模式怎么选再给一套能直接抄的Neutron实操命令然后列出配额、MTU、VLAN Range这些必须调的参数最后把你大概率会踩的五个坑一次说清。适合正在做OpenStack部署实施、或者已经跑起来但租户间老出“串网”问题的运维。2. 从Flat到VXLAN三种网络模式与隔离边界的选型逻辑2.1 三种经典网络模式Flat、VLAN、VXLAN的隔离边界OpenStack的租户网络隔离底层靠的是Neutron支持的几种网络类型。最常见的是Flat、VLAN、VXLAN三种它们的隔离边界完全不同。Flat网络根本没有隔离。所有实例都在同一个物理二层网络里没有VLAN标签也没有隧道封装租户A的广播包直接就能飘到租户B那边。这种模式只适合单租户测试环境用来做多租户隔离基本等于裸奔。VLAN模式靠802.1Q标签隔离。每个租户网络分配一个VLAN ID交换机通过VLAN划分广播域。隔离边界清晰、性能好但VLAN ID只有4096个去掉保留的也就四千出头。租户一多ID分配就会撞车。而且VLAN要求物理交换机端口必须透传对应VLAN网络团队得跟着改配置在云平台里自助建网就成了空话。VXLAN模式是当前做多租户隔离的主流选择。它用24bit的VNI做标识理论上支持1600万个虚拟网络。实例的流量被封装在UDP包里通过宿主机间的underlay网络传输。物理交换机不需要感知每个租户的VLAN只要保证宿主机之间三层可达就行。隔离边界从交换机挪到了虚拟隧道租户网络真正做到“自助创建、即时生效”。三种模式对比如下网络模式隔离粒度最大网络数依赖物理设备适合场景Flat无1无测试、单租户VLAN二层广播域约4000交换机VLAN配置规模小、有网络团队配合VXLAN二层隧道约1600万仅需三层可达多租户、自助建网、大规模2.2 网络命名空间被大多数人忽略的控制平面隔离数据平面的隔离靠VLAN或VXLAN但控制平面才是最容易漏的。每个租户的路由器、DHCP服务OpenStack都会放到独立的Linux Network Namespace里。你在控制节点执行ip netns list看到的qrouter-xxxx和qdhcp-xxxx就是租户隔离的路由和DHCP实例。这意味着租户A的路由表、ARP表、iptables规则和租户B完全互相独立。租户A在路由器上改了静态路由不会影响租户B租户A的DHCP服务宕了租户B的地址分配也不受牵连。很多踩坑案例里“租户间能通”的诡异现象最后排查下来往往是控制平面没隔离——比如两个租户共用了同一个外部网关端口或路由器的SNAT规则互相覆盖。所以判断隔离是否到位别只看数据平面通不通还要确认每个租户的路由器是不是真的各占一个命名空间。命令很直接在两个租户分别建完网络和路由器后ip netns list的输出里必须有两条独立的qrouter条目。2.3 选型逻辑物理网络规模和运维能力决定用哪种选型不是越高级越好。我在生产环境里见过强行上VXLAN、结果underlay网络MTU没调对所有大包都分片导致性能暴跌的例子也见过几百个租户还在用VLAN、隔三差五找网络团队加VLAN ID的翻车现场。我的判断标准就两条一是物理网络规模二是网络团队能不能跟着云平台走。如果宿主机就几台、租户十几个、网络团队愿意配合,那VLAN模式完全够用性能还更好排查隧道问题也省心。如果宿主机超过几十台、租户数量可能上百、或者希望租户能自助建网不依赖物理网络变更就老老实实上VXLAN。另一个参考维度是部署方式。用Kolla-Ansible部署OpenStack时默认的Neutron后端配置已经支持VXLAN只需要调好隧道接口和MTU就能跑。手动部署的话要自己配好Open vSwitch的网桥和隧道端点工作量会大不少。2.4 VXLAN隧道端点与underlay网络的基本要求不管选VXLAN还是VLAN都绕不开underlay网络准备。VXLAN要保证所有计算节点和网络节点能通过管理网或专网互相访问VLAN则要保证交换机Trunk链路正确透传。VXLAN模式下有个常被忽略的细节隧道流量走的是宿主机之间的underlay网络overlay网络里实例的流量会额外带50字节的VXLAN封装头。如果underlay网络MTU是标准1500那实例网卡的MTU就必须降到1450否则超过1450的报文会被丢弃或分片。这个参数后面第4章会单独展开因为它是“网络建好了但大包传不动”的经典元凶。3. 用Neutron创建多租户隔离网络从命令到验证3.1 租户与项目先确认配额归属与权限在Neutron里“租户”对应的顶层概念是Project项目。所有网络、子网、路由器、安全组都必须归属于某个Project这就是资源隔离的起点。实操第一步不是急着建网络而是先确认当前CLI的操作身份。下面以Kolla-Ansible部署的OpenStack环境为例加载管理员凭证后为两个模拟租户分别创建Project和用户。# 加载Kolla部署环境的admin凭证 source /etc/kolla/admin-openrc.sh # 创建租户A的项目和用户 openstack project create tenant_a --domain default openstack user create user_a --project tenant_a --password ChangeMe123 openstack role add --project tenant_a --user user_a member # 创建租户B的项目和用户 openstack project create tenant_b --domain default openstack user create user_b --project tenant_b --password ChangeMe123 openstack role add --project tenant_b --user user_b memberopenstack project create创建的是资源容器user create和role add解决的是“谁有权限操作这些资源”的问题。生产环境千万不要所有租户共用同一个管理员账号操作否则审计日志根本没法追溯谁改过网络配置。3.2 创建第一张隔离网络从network到subnet的完整命令接下来为租户A创建一张VXLAN网络。注意这里要用--project tenant_a显式指定归属不能用管理员身份建完再转移租户网络的资源隔离从创建那一刻就要落到Project上。# 以管理员身份为租户A创建VXLAN类型网络 openstack network create --project tenant_a \ --provider-network-type vxlan \ --provider-segment 1001 \ net_a # 在net_a下创建子网网段可以随意选和租户B重复也没关系 openstack subnet create --project tenant_a \ --network net_a \ --subnet-range 192.168.10.0/24 \ --gateway 192.168.10.1 \ --dns-nameserver 114.114.114.114 \ subnet_a--provider-network-type vxlan声明了网络类型--provider-segment 1001这里指定的是VNI。租户B创建网络时可以选同一个网段192.168.10.0/24只要VNI不同两个网络就完全隔离。--gateway不写的话子网就不会有默认网关实例拿不到默认路由后面路由器接进来时还得回来补。创建完马上检查归属防止建错Projectopenstack network list --project tenant_a3.3 打通三层路由让隔离网络能出外网二层网络建好租户A内部可以通信但要访问外网或租户B的网络就需要路由器。Neutron的路由器同样归属Project每个租户的路由器独立占一个命名空间。# 创建租户A专属路由器 openstack router create --project tenant_a router_a # 把子网接入路由器 openstack router add subnet router_a subnet_a # 设置外部网关让租户A的网络能访问外网 openstack router set router_a --external-gateway public # 同样为租户B建一套 openstack network create --project tenant_b \ --provider-network-type vxlan \ --provider-segment 1002 \ net_b openstack subnet create --project tenant_b \ --network net_b \ --subnet-range 192.168.20.0/24 \ --gateway 192.168.20.1 \ --dns-nameserver 114.114.114.114 \ subnet_b openstack router create --project tenant_b router_b openstack router add subnet router_b subnet_b openstack router set router_b --external-gateway public这里的关键点是每个租户的路由器必须配自己的外部网关。如果管理员图省事把两个租户的子网接到同一个路由器上那两个租户之间就直接三层互通了——多租户隔离瞬间失效。我见过有人把租户A和租户B的子网都挂到管理员的默认路由器上结果两个租户的虚拟机互ping全通排查半天才发现是共用了路由器。验证路由器是否隔离看命名空间ip netns list # 输出应包含两个不同ID的qrouter命名空间3.4 安全组规则放行业务端口的最小权限网络隔离解决的是“租户间不通”安全组解决的是“同一个租户内哪些端口对外开放”。默认安全组规则是拒绝所有入站流量仅允许出站。这个默认行为一定要先讲给业务方听否则他们建完虚拟机发现SSH登录不上第一反应就是网络坏了。# 为租户A创建独立安全组 openstack security group create --project tenant_a sg_a # 放行租户A实例的SSH和ICMP openstack security group rule create --project tenant_a \ --protocol tcp --dst-port 22 --remote-ip 0.0.0.0/0 sg_a openstack security group rule create --project tenant_a \ --protocol icmp sg_a # 创建实例时挂载该安全组 openstack server create --image cirros \ --flavor m1.small \ --network net_a \ --security-group sg_a \ vm_a1--remote-ip 0.0.0.0/0表示允许所有来源访问22端口实际生产中应该收敛为业务对端IP段。安全组规则越到后期越多建议每个租户单独一个安全组不要所有租户复用同一个模板否则租户A加了条规则租户B的实例也被动放开了同一端口。3.5 从控制节点验证隔离是否生效建完后别急着交付用三条命令快速确认状态# 查看网络归属 openstack network list --project tenant_a # 查看路由器归属 openstack router list --project tenant_a # 从租户A的实例ping租户B的实例IP应当不通 openstack server list --project tenant_a实际测试时给两个租户的实例分别绑定浮动IP从外部SSH进去互ping。通了就是配置有问题不通才说明隔离生效。这条“反直觉”验证步骤非常重要——很多人看到ping不通先怀疑配置错了其实在多租户隔离场景下ping不通正是我们想要的结果。4. 关键参数配额、MTU与VLAN Range4.1 租户配额控制每个租户能建多少网络多租户隔离不只是“不通”还包括“不能无限占用”。Neutron的配额机制限制每个Project可以创建的网络、子网、路由器和端口数量。不设配额的话一个租户建几百个网络VNI池被耗光其他租户就没法建网了。# 查看租户A当前配额 openstack quota show tenant_a # 修改租户A的Neutron资源配额 openstack quota set tenant_a \ --networks 5 \ --subnets 10 \ --ports 50 \ --routers 2 \ --floating-ips 10推荐按实际业务量设置网络数5、端口数50对大多数中小租户足够。端口数要重点看——每个实例的网卡、路由器接口、浮动IP都算端口端口配额设太小会导致租户一创建多台实例就报“资源不足”。关键埋点Neutron的配额是针对Project的不是针对用户的。也就是说同一个Project下无论几个用户共享配额。如果两个团队共用一个Project他们之间是天然不隔离的——不仅网络不隔离配额也互相挤占。4.2 MTU设置VXLAN隧道下的必调参数MTU是VXLAN网络最坑的配置项。这个参数在OpenStack里有三个位置underlay网络的物理网卡MTU、Neutron的全局MTU、以及实例网卡的MTU。三处必须一致或逐层递减否则实例能建起来、小包能通、一传大文件就卡死。# Neutron全局MTU配置比如设置为1450 openstack network show net_a # 需要在Neutron配置文件中设置 global_physnet_mtu如果underlay是1500overlay实例网卡最多用1450这是50字节VXLAN头的开销。设置方法是修改Neutron配置中的global_physnet_mtu或在ml2配置里声明之后创建的子网会继承这个MTU值。已经建好的网络要改MTU很麻烦所以规划阶段就定死。判断MTU问题的经典方法实例里ping -M do -s 1472 网关能通ping -M do -s 1500不通基本就是MTU没配对。把报文大小手工调整到协议允许的上限通过二分法快速定位是MTU还是防火墙的问题。4.3 VLAN Range规划与物理交换机对接的边界如果采用VLAN模式Neutron的VLAN ID池必须和物理交换机上的VLAN配置对齐。# 查看VLAN类型网络的可用段 openstack network show provider_vlan # 或查看ml2配置中的vlan_ranges参数规划原则是预留VLAN 1到100给物理网络管理用途从100开始分配租户VLAN上限看交换机支持能力。生产环境要避免使用4095这样的特殊VLAN有些交换机保留用于系统或链路聚合分配下去会直接导致网络不通。还有一个容易漏的地方Neutron的VLAN池和物理交换机上已经手工创建的VLAN要错开。如果云平台自动分配的VLAN和交换机上已有的业务VLAN撞了两个业务就会串到同一个广播域里。4.4 网关地址与地址重叠重叠租户网段的实际处理多租户隔离的另一个常见参数是网关规划。租户A用192.168.10.0/24租户B也可以用同一网段这在VXLAN模式下没任何问题。但有一个例外如果租户需要和公司内部网络通过IPSec或专线打通那租户的网段就不能和内部网络重叠否则路由会冲突。我一般建议在租户开通环节提供一张标准网段分配表按网段段分配IP避免租户自己乱选地址导致后续互联需求无法满足。网段规划表可以参考下面这个格式租户私有网段网关VNI/VLANtenant_a192.168.10.0/24192.168.10.11001tenant_b192.168.20.0/24192.168.20.11002tenant_c10.10.30.0/2410.10.30.11003如果要让租户A和租户B通过路由互通那就不能再用重叠网段了。不管哪边都必须先规划好再建网络因为给已运行租户改网段基本等于重建业务。5. 多租户网络隔离的5条踩坑记录5.1 租户A能ping通租户B的实例IP现象租户A的实例可以ping通租户B的实例内网IP隔离失效但网络配置看起来都正常。 原因最常见的两个一是两个租户的子网被挂到了同一个路由器上二是VXLAN网络的VNI分配重复导致两个overlay网络在物理隧道上复用同一条逻辑链路。 解决先查路由器归属openstack router list --project tenant_a和--project tenant_b确认两个路由器ID不同。然后查VNI分配记录在Neutron数据库里检查VXLAN网络的segmentation_id是否重复。如果重复重建其中一个网络并指定不同VNI。这个坑在手动指定--provider-segment时特别容易出因为如果两个网络指定了相同VNI且没有校验Neutron不会主动报错。5.2 安全组默认规则把管理口也挡了现象租户新建实例后连控制台的VNC都打不开SSH更连不上。 原因默认安全组只放行出站流量所有入站端口全被拒绝。VNC控制台流量不走安全组但SSH、ICMP全被挡在外面。更隐蔽的是很多管理脚本用ping探测实例存活安全组不放行ICMP探测结果就会误报。 解决创建实例时显式挂载放行ICMP和SSH的安全组。生产环境建议做一套“基础管理用”安全组模板固定放行ICMP和指定管理端口所有租户创建实例时默认挂载业务端口再由租户自行添加。5.3 VXLAN网络下实例拿到IP但ping不通网关现象实例通过DHCP正常拿到IP但ping子网网关不通其他实例也互不通。检查Neutron服务都正常。 原因MTU不匹配。实例侧MTU是1500VXLAN隧道封装后超过underlay网络的MTU限制大包丢失。小包如ICMP可能刚好能过但TCP大包会卡住。 解决将实例网卡MTU改为1450或更低同时调整Neutron的global_physnet_mtu参数。已经建好的实例在系统内部执行ip link set eth0 mtu 1450手工修改永久修改需要改cloud-init配置或网络脚本。这个坑最大的特点是隐蔽——网络看起来一切正常但业务就是慢或不通。5.4 VLAN模式下物理交换机透传配置被跳过现象VLAN网络创建的实例无法和同VLAN的其他实例通信但Neutron里网络状态正常。 原因创建VLAN类型网络时物理交换机上对应VLAN没有放行到计算节点的端口。比如网络管理员只加了Trunk允许列表但忘了加新分配的VLAN ID。 解决每次为租户创建VLAN网络时同步在交换机上执行类似switchport trunk allowed vlan add 200的操作。这个手动步骤没法完全自动化只能靠流程约束VLAN分配表要同步给网络团队创建前确认交换机侧已放通。很多团队最后迁移到VXLAN就是为了省掉这一步。5.5 Kolla部署下元数据服务在隔离网络中不可访问现象实例能上网但通过cloud-init注入的SSH密钥不生效或实例内部请求169.254.169.254超时导致无法读取元数据。 原因Kolla-Ansible部署的OpenStack元数据服务依赖Neutron的metadata agent和路由命名空间里的NAT规则。当租户网络是VXLAN且路由器配置不当时元数据流量没法正确路由到metadata agent。 解决检查neutron-metadata-agent服务状态确认租户路由器命名空间里有到169.254.169.254的路由规则。常见做法是重建路由器并重新接入子网触发metadata规则重新下发。Kolla环境更推荐直接在部署配置里启用dhcp-agent的metadata支持让DHCP网络直接响应元数据请求绕开路由器依赖。6. 隔离效果的专项验证三个测试保你上线不背锅网络搭建完、参数配好后先别急着开业务。无非是花半天时间跑三个专项测试把隔离效果验清楚再交付比上线后再排查省事得多。第一个测试租户间可达性矩阵。给租户A和租户B分别建两台实例记录各自的IP和浮动IP。从租户A的实例分别ping租户B的实例内外网IP预期结果都是超时从租户A实例反向ping自己的网关预期是通的。这个测试同时验证了二层隔离和三层路由的正确性。第二个测试广播域隔离。在租户A的实例上用tcpdump抓ARP广播包同时在租户B的实例里持续ping自己的网关触发ARP请求。如果租户A的tcpdump能抓到租户B的ARP广播说明两个租户的二层广播域没有隔离干净VNI或VLAN配置有问题。VXLAN模式下这个测试尤其容易暴露问题——宿主机上的网桥如果配置了无差别转发广播包会穿过隧道泄漏。第三个测试并发创建租户网络压测。用脚本循环创建10个租户网络和子网每个网络附带一个路由器。如果VNI池不够大或配额没放开第N个网络就会创建失败。这个测试的价值在于回归验收确认VNI范围足够、配额设计合理而不是等将来新租户开通时才发现资源池耗尽。做这套测试时记一条教训永远不要把“ping不通”当成故障来查先确认它是不是预期的隔离行为。隔离验证最关键的是对着测试矩阵逐条核对预期结果而不是凭感觉判断对错。把矩阵打印出来贴工位上后面每次扩容或改网络配置后重跑一遍就能少背很多锅。希望帮到你。本文还有配套的精品资源点击获取