VXLAN通过24位VNI实现租户数据面硬隔离,解决重叠IP冲突;结合网络命名空间+Veth Pair提供进程级协议栈隔离;firewalld区域机制实施逻辑边界隔离,三者协同保障多租户网络安全性与独立性。

用VXLAN为每个租户分配独立VNI实现数据面硬隔离
当多个租户使用重叠IP网段(如都用10.244.0.0/16)时,仅靠iptables或路由策略无法阻止内层报文错发,必须从数据封装层切断混淆可能。VXLAN用24位VNI作为租户唯一标识,所有流量在UDP外层携带VNI标签,转发设备依据VNI而非内层IP做查表,彻底规避地址冲突。
加载vxlan内核模块并验证支持:
sudo modprobe vxlan && echo $? # 返回0表示成功
创建VTEP接口并绑定VNI:以租户A(VNI 5001)、租户B(VNI 5002)为例,在主机上执行:
sudo ip link add vxlan-tenant-a type vxlan id 5001 dev ens33 dstport 8472
sudo ip link add vxlan-tenant-b type vxlan id 5002 dev ens33 dstport 8472
为每个VXLAN接口配置独立子网并启用:
sudo ip addr add 192.168.101.1/24 dev vxlan-tenant-a && sudo ip link set vxlan-tenant-a up
sudo ip addr add 192.168.102.1/24 dev vxlan-tenant-b && sudo ip link set vxlan-tenant-b up
添加静态FDB条目,明确指定对端VTEP的MAC→VNI→IP映射关系(避免泛洪):
sudo ip -d link show vxlan-tenant-a | grep -q "learning off" || sudo ip link set vxlan-tenant-a address 00:00:00:00:00:01
sudo ip -s fdb append 00:00:00:00:00:02 dev vxlan-tenant-a self static vni 5001 via 10.10.1.102
【必须关闭VXLAN学习功能】否则内核会自动学习并覆盖你配置的FDB条目,导致跨租户ARP响应污染。执行ip link set vxlan-tenant-a learning off后,再配置FDB才生效。
用网络命名空间+Veth Pair构建进程级协议栈隔离
此方法适用于容器、KVM虚拟机或独立服务进程,让租户拥有完全独立的lo、路由表、netfilter上下文,连arp缓存和conntrack都互不可见。
创建两个隔离网络空间:
sudo ip netns add tenant-web
sudo ip netns add tenant-db
建立veth配对并分别注入命名空间:
sudo ip link add veth-web-host type veth peer name veth-web-guest
sudo ip link add veth-db-host type veth peer name veth-db-guest
sudo ip link set veth-web-guest netns tenant-web
sudo ip link set veth-db-guest netns tenant-db
为主机侧veth配置IP并启用:
sudo ip addr add 172.20.10.1/24 dev veth-web-host && sudo ip link set veth-web-host up
sudo ip addr add 172.20.20.1/24 dev veth-db-host && sudo ip link set veth-db-host up
在命名空间内完成剩余配置:
sudo ip netns exec tenant-web ip addr add 172.20.10.2/24 dev veth-web-guest && sudo ip netns exec tenant-web ip link set veth-web-guest up && sudo ip netns exec tenant-web ip link set lo up
sudo ip netns exec tenant-db ip addr add 172.20.20.2/24 dev veth-db-guest && sudo ip netns exec tenant-db ip link set veth-db-guest up && sudo ip netns exec tenant-db ip link set lo up
为每个命名空间设置默认路由指向主机侧接口:
sudo ip netns exec tenant-web ip route add default via 172.20.10.1
sudo ip netns exec tenant-db ip route add default via 172.20.20.1
用firewalld区域机制实施逻辑边界隔离
适合租户数量稳定、拓扑清晰的物理服务器场景,通过区域(zone)将接口/IP与信任等级强绑定,避免规则堆砌导致的策略漂移。
创建专用区域并绑定租户接口:
firewall-cmd --permanent --new-zone=tenant-app
firewall-cmd --permanent --new-zone=tenant-cache
firewall-cmd --permanent --zone=tenant-app --change-interface=ens33.101
firewall-cmd --permanent --zone=tenant-cache --change-interface=ens33.102
清空默认服务并只开放必需端口:
firewall-cmd --permanent --zone=tenant-app --remove-service=ssh
firewall-cmd --permanent --zone=tenant-app --add-port=8080/tcp
firewall-cmd --permanent --zone=tenant-cache --remove-service=http
firewall-cmd --permanent --zone=tenant-cache --add-port=6379/tcp
执行最关键的跨区域阻断:
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens33.101 -o ens33.102 -j DROP
firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i ens33.102 -o ens33.101 -j DROP
将所有区域的FORWARD链默认策略设为DROP,再按需放行出向流量:
firewall-cmd --permanent --set-default-zone=trusted
firewall-cmd --permanent --zone=tenant-app --set-target=DROP
firewall-cmd --permanent --zone=tenant-cache --set-target=DROP
重载策略使配置生效:
firewall-cmd --reload


















