虚拟接口+tx+linux,Linux使用笔记: 解决Xen虚拟机中VLAN接口不能ping大包的问题

出于调试的需要,想在两个Xen虚拟机间使用VLAN相互访问。在Linux上启用VLAN非常简单,只需要使用命令vconfig配置一个VLAN接口就可以了:

vconfig add eth0 3

ifconfig eth0.3 11.11.4.2 netmask 255.255.255.0 up

删除VLAN则使用vconfig rem eth0.3。当然你也可以在网络脚本中配置你的VLAN接口,这样每次系统启动后会自动配置VLAN接口,具体的配置参见文尾的第一篇参考文档。

当Easwy在两个Xen虚拟机上都配置了VLAN后,使用ping命令可以使两台虚拟机相互ping通。但发现一个问题,一旦ping包的大小超过一定长度,也就是说当ping包开始分片后,两台虚拟机之间就不能ping通了:

root@nti etc> ping 11.11.4.30 -s 1476 -c 3

PING 11.11.4.30 (11.11.4.30) 1476(1504) bytes of data.

1484 bytes from 11.11.4.30: icmp_seq=1 ttl=64 time=0.536 ms

1484 bytes from 11.11.4.30: icmp_seq=2 ttl=64 time=0.213 ms

1484 bytes from 11.11.4.30: icmp_seq=3 ttl=64 time=0.238 ms

--- 11.11.4.30 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 1998ms

rtt min/avg/max/mdev = 0.213/0.329/0.536/0.146 ms

root@nti etc> ping 11.11.4.30 -s 1477 -c 3

PING 11.11.4.30 (11.11.4.30) 1477(1505) bytes of data.

--- 11.11.4.30 ping statistics ---

3 packets transmitted, 0 received, 100% packet loss, time 2009ms

上面的输出显示,当ping包长度为1476字节时,可以正常ping通,但当ping包长度变为1477字节时,就无法ping通了。

在网上搜索了很久,终于找到了原因。原来,在Xen中,虚拟机的网卡是通过宿主机(Domain-0)上的虚拟接口vifX.X以及虚拟网桥设备virbrX来实现网络通信的。

下面的/sbin/ifconfig输出列出了宿主机相应的网络接口:

$ /sbin/ifconfig

eth0 Link encap:Ethernet HWaddr 00:13:72:18:E0:99

inet addr:192.168.19.84 Bcast:192.168.190.255 Mask:255.255.255.0

inet6 addr: fe80::213:72ff:fe18:e099/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:36017777 errors:43235 dropped:0 overruns:0 frame:46756

TX packets:894337 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:105224895 (100.3 MiB) TX bytes:424826680 (405.1 MiB)

Interrupt:17

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:4698 errors:0 dropped:0 overruns:0 frame:0

TX packets:4698 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:2439660 (2.3 MiB) TX bytes:2439660 (2.3 MiB)

vif3.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF

inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link

UP BROADCAST RUNNING NOARP MTU:1500 Metric:1

RX packets:38149 errors:0 dropped:0 overruns:0 frame:0

TX packets:512426 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:32

RX bytes:7652947 (7.2 MiB) TX bytes:41352902 (39.4 MiB)

vif4.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF

inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link

UP BROADCAST RUNNING NOARP MTU:1500 Metric:1

RX packets:65806 errors:0 dropped:0 overruns:0 frame:0

TX packets:553557 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:32

RX bytes:3835916 (3.6 MiB) TX bytes:157035614 (149.7 MiB)

virbr0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF

inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0

inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:555514 errors:0 dropped:0 overruns:0 frame:0

TX packets:824276 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:64025226 (61.0 MiB) TX bytes:968699886 (923.8 MiB)

也就是说,当虚拟机1发包给虚拟机2时,它的报文首先经过vif3.0,然后经过网桥设备(bridge)virbr0,最后到达虚拟机2的虚拟接口vif4.0。

而Easwy所用的Linux内核版本2.6.18-128.el5xen中,它的bridge驱动中存在bug,当使能了conntrack模块时,bridge会把分片包重组起来进行检查,但由bridge再向外发时,却没有重新分片,这导致报文被二层丢弃。也正是这个原因,当ping包大小大于1476时,两台虚拟机间就无法相互ping通了。

要解决这个问题,可以重新编译内核(不过我不知道这个问题在哪一个内核版本中得到了解决)。对于Easwy来说,因为不需要使用防火墙,所以解决起来就不用这么麻烦了,只需要使用下面的命令禁用bridge的防火墙就行了:

# echo 0 > /proc/sys/net/bridge/bridge-nf-call-iptables

禁用掉防火墙后,两台虚拟机间的大包可以ping通了,分片包的通过不存在问题。

要了解这个bug的详细信息,参见文末的第二篇参考文档。文末的第三篇和第四篇参考文档,则列出了在Xen中使用VLAN的配置方法,有兴趣的朋友可以看一下。

更多内容,请阅读Easwy的博客上的其它文章。

[ 参考文档 ]

本文以创作共用版权协议发布,转载本文要求遵循“署名-非商业性使用-相同方式共享3.0”的创作共用协议,并以链接形式指明本文地址。

文章的脚注信息由WordPress的wp-posturl插件自动生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值