在xen中配置网桥

本文记录如何使用网桥,将xen的虚拟机与物理机联通起来。

删除virbr0

一般情况下,虚拟机与物理机之间的网络连接有Bridgr桥接模式,NAT网络地址转换模式,和路由Route模式。此处我们使用网桥模式,是虚拟机与宿主机共用同一个物理网卡。

在配置之前,先使用ifconfigbrctl show分别查看一下系统当前的网桥配置情况。两个命令都看到当前系统存在一个名称为virbr0的虚拟网卡。这里一篇博客(http://www.vpsee.com/2012/09/howto-disable-virbr0/)介绍,这个是libvirt为系统创建的虚拟网卡。libvirt默认使用NAT的模式,这不是我们想要的。

第一步先删除系统中的virbr0网卡。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
virsh net-list
Name State Autostart
-----------------------------------------
default active yes

virsh net-destroy default
Network default destroyed

virsh net-undefine default
Network default has been undefined

service libvirtd restart
Stopping libvirtd daemon: [ OK ]
Starting libvirtd daemon: [ OK ]

然后在使用ifconfig就可以看到系统中已经没有virbr0这个网卡了。

配置xen的网桥设置

创建虚拟机的时候,xen默认使用的方式就是网桥模式。首先确保xen的配置文件中开启了网桥模式。打开文件/etc/xen/xend-config.sxp。里面可能会有如下的内容:

1
2
3
4
5
6
(network-script network-bridge)
(vif-script vif-bridge)
# (network-script network-route)
# (vif-script vif-route)
# (network-script network-nat)
# (vif-script vif-nat)

如上面所示,将bridge的注释取消。保存修改,然后重启xen的相关服务:

1
2
3
/etc/xen/scripts/network-bridge restart
service xend restart
# 是在不行还可以reboot

上面的操作会重启xen的网络服务,首先,xen会默认检测宿主服务器的默认网卡(可能是通过默认网关确定)eth0,把eth0的配置复制一份成为veth0,随后把eth0重命名为peth0,把veth0重命名为eth0。
使用ifconfig命令可以看到一个eth0虚拟网卡和物理网卡peth0。使用brctl show可以看到一个名为eth0的网桥。

然而这样的名称具有一些误导性,不过可以自己修改配置指定网桥的名称,编辑/etc/xeb/xend-config.sxp文件,修改下面的内容:

1
2
3
# (network-script network-bridge)  
# 修改为
(network-script 'network-bridge bridge=br0')

重复上面重启服务的操作。

修改虚拟机启动配置文件

修改虚拟机启动的时候的配置文件,在其中增加网卡的信息:

1
2
3
ip = "192.168.226.220"
netmask = "255.255.255.0"
gateway = "192.168.226.218"

读者应根据自己的局域网的情况修改。重新创建虚拟机后,先使用console模式进入虚拟机,查看网络配置情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@vm1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:16:3E:36:98:A7
inet addr:192.168.226.200 Bcast:192.168.226.255 Mask:255.255.255.0
inet6 addr: fe80::216:3eff:fe36:98a7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:45623 errors:0 dropped:4312 overruns:0 frame:0
TX packets:450 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2659402 (2.5 MiB) TX bytes:28789 (28.1 KiB)
Interrupt:39

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:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:828 (828.0 b) TX bytes:828 (828.0 b)

在虚拟机中ping宿主机的IP,正常情况下是能ping通了的(可能需要一点时间等待arp更新)。
我们在物理机中使用brctl show查看一下网桥情况:
xen网桥信息

添加外网访问

上面的网桥设置过程让虚拟机可以共用宿主机的物理网卡,配置正确后虚拟机中应该能够访问同一个局域网中的其他机器,以及虚拟机。但是这里面,宿主机配置的是内网的IP,本身不具备上外网的功能。笔者另外在同一局域网中一台可以连接外网的机器上配置了iptables网络地址转换,才使得内网的机器能够上网。网关机器的设置另外讨论,局域网中需要连接外网的机器,使用route命令来添加路由规则即可。
为了让虚拟机能够访问外网,在虚拟机中使用如下命令:

1
2
route add default gw 192.168.226.218    # 此IP是我用来转发到外网的机器,笔者改成自己对应的IP即可。
ping 8.8.8.8

参考资料:
http://luozhaoyu.iteye.com/blog/1404504
http://www.cnblogs.com/yangyh/archive/2010/07/16/1778516.html
http://blog.sina.com.cn/s/blog_704836f40100rzzs.html