利用linux bridge + vlan方式配置KVM虚拟机的vlan,如下图所示:
配置过程:
1、安装vconfig工具;
2、增加vlan子接口:
vconfig add eth1 100;
vconfig add eth1 200;
3、增加vlan子接口对应的bridge设备,配置br100的IP为172.20.100.1,配置br200的IP为172.20.200.1:
brctl add br br100;
brctl add br br200;
4、将vlan子接口挂到bridge上:
brctl addif br100 eth1.100;
brctl addif br200 eth1.200;
5、创建2个VM,将veth设备分别挂在br100和br200上;
6、进入VM,配置IP分配为172.20.100.3,172.20.200.3。
问题:
以上配置完成后,发现在宿主机上ping VM1(172.20.100.1)能ping通,但是pingVM2(172.20.200.3)不通,通过抓包工具发现在ping VM2的时候,走的是br100网桥,如下图所示:
在宿主机上查看路由配置信息如下:
从上面的路由表可以发现宿主机上存在两个172.20.0.0/24的表项,其中一个走br100,一个走br200,所以发往172.20.0.0/24的报文都默认走第一条记录,即通过br100发送,这跟上面的转包信息也符合;
修复过程:
1、将原来的两条172.20.0.0/24的路由表信息删除,添加如下两条路由表:
ip route add 170.20.100.0/24 via 0.0.0.0 dev br100
ip route add 170.20.200.0/24 via 0.0.0.0 dev br200
添加完成的路由信息如下图所示:
现在再去ping VM1、VM2发现都ping不通!同样通过在宿主机抓取发往VM1的报文,发现报文的源IP为br0的IP,说明此时走的路由规则应该是route -n查询的第一条记录,如下所示:
2、ifconfig 发现br100、br200默认的掩码位数是16位,这与route表里配置的Genmask不符,因此修改br100、br200的ifcfg配置文件,设置NETMASK=255.255.255.0,重启服务;
3、宿主机上ping VM1、VM2均能ping通,VM1、VM2ping宿主机也能ping通, VM1、VM2之间ping不通,说明vlan的隔离是生效的;