一、模式说明:

   类似VMwareXen提供了几种不同的网络连接方式,主要有桥接模式,NAT模式,路由模式。其中最常用的,也是Xen默认安装的方式就是桥接模式。


在桥接模式下,Xen会创建了一个网桥,并且把服务器上的物理网卡接口加入到这个网桥中。之后,Xen会把dom0和其他domU的虚拟网卡接口也加入到这个网桥中来。这样在这个网桥之内的所有domU在网桥内部可以互相通讯,另外还可以通过网桥中的物理网卡接口跟外界通讯。物理网卡连接到哪些网络,则domU也可以连接到同样的网络,这是让domU与外界通讯的最简单方法。


Xend的配置文件/etc/xen/xend-config.sxp中,桥接模式是默认的模式。需要注意的是,除了network-bridge和vif-bridge以外的其他行都是被注释掉的。


配置文件看起来像如下所示:


(network-script network-bridge)

(vif-script vif-bridge)

# (network-script network-route)

# (vif-script vif-route)

# (network-script network-nat)

# (vif-script vif-nat)


network-bridge脚本和vif-bridge脚本都存放在/etc/xen/scripts目录下。

network-bridge脚本的作用是建立网络环境,并且使用bridge-utils工具创建一个网桥xenbr0

vif-bridge脚本的作用是当一台guest服务器启动的时候,为这个guest服务器创建后端的vif接口。


在没有创建任何gueste服务器的时候,在Dom0上使用ifconfig命令查看网络的时候,可以看到类似下边的输出。

[root@localhost xen]# ifconfig
eth0 Link encap:Ethernet
HWaddr 48:5B:39:89:E5:43
inet addr:192.168.1.86
Bcast:192.168.1.255 Mask:255.255.255.0
lo
Link encap:Local Loopback
inet addr:127.0.0.1
Mask:255.0.0.0
peth0 Link encap:Ethernet
HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
vif0.0Link encap:Ethernet
HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
xenbr0Link encap:Ethernet
HWaddr FE:FF:FF:FF:FF:FF
UP BROADCAST RUNNING NOARP
MTU:1500 Metric:1

除了熟悉的eth0以外,多出几个接口。你可能会好奇,这些接口是什么时候,怎么创建的?如下所示步骤,是当Xen ServerXend服务启动的时候接口的创建顺序。(本例中,除了Dom0以外,没有其他guset domainXend设置为自动启动,且服务器上只有一个物理网卡接口)


1.执行在/etc/xen/xend-config.sxp中指定的/etc/xen/scripts/network-bridge脚本

2.network-bridge脚本创建一个新网桥,名字为xenbr0

3.复制物理网卡接口eth0MAC地址和IP地址

4.停止物理网卡接口eth0

5.创建一对相连的虚拟网卡接口,veth0vif0.0

6.将之前复制的物理网卡接口的MACIP分配给虚拟接口veth0

7.重命名物理网卡接口,从eth0改名为peth0

8.重名名虚拟网卡接口,从veth0改名为eth0

9.将物理网卡接口peth0,虚拟网卡接口vif0.0加入到网桥xenbr0

10.启动网桥xenbr0,启动其他网络接口peth0,eth0,vif0.0


对于每一个新的domUXen会创建"一对相连的虚拟网卡",其中一块在新建的domU上,另一块在dom0上。对于LinuxdomU来说,其虚拟网卡名字是eth0,而在dom0这端的这一块的网卡名字是vif.0

当一台domU关机的时候,相关的虚拟网卡会被删除。

Xen的network-bridge模式_第1张图片

domU启动的时候,dom0上的xend会运行vif-bridge脚本,该脚本会:

-将vif.0加入到xenbr0网桥中

-启动vif.0接口


所以在增加了新的domU以后,在dom0上用ifconfig查看网络,会得到类似的结果:


dom0:~# ifconfig
eth0 Link encap:Ethernet HWaddr 00:50:8B:DC:F7:2B
inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.192
inet6 addr: fe80::250:8bff:fedc:f72b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2848 errors:0 dropped:0 overruns:0 frame:0
TX packets:1768 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:256292 (250.2 KiB) TX bytes:277686 (271.1 KiB)

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:13 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1120 (1.0 KiB) TX bytes:1120 (1.0 KiB)

peth0 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:3716 errors:0 dropped:0 overruns:0 frame:0
TX packets:2046 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:493403 (481.8 KiB) TX bytes:318089 (310.6 KiB)

vif0.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:1768 errors:0 dropped:0 overruns:0 frame:0
TX packets:2848 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:277686 (271.1 KiB) TX bytes:256292 (250.2 KiB)

vif1.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:265 errors:0 dropped:0 overruns:0 frame:0
TX packets:408 errors:0 dropped:203 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:35758 (34.9 KiB) TX bytes:215469 (210.4 KiB)

xenbr0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING NOARP MTU:1500 Metric:1
RX packets:208 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:16101 (15.7 KiB) TX bytes:0 (0.0 b)

可以看到,其中的vif1.0就是新增的domU相关联的虚拟网卡。


而在domU内部,使用ifconfig命令查看网络,会看到类似下边的结果:


[user@DomU]# ifconfig -a
eth0  
Link encap:Ethernet
HWaddr 00:16:3E:5A:32:DA
inet addr:128.153.144.96 Bcast:128.153.145.255 Mask:255.255.254.0
inet6 addr: fe80::216:3eff:fe5a:32da/64 Scope:Link
lo    
Link encap:Local Loopback
inet addr:127.0.0.1
Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host

guest domain内部,无论Xen使用网桥模式还是路由模式,网络看起来和物理机没有任何区别。


每一个guest domain都有一个配置文件,我们可以在这个文件中指定它的网络设置。


vif = [mac=00:16:3E:02:00:41,bridge=xenbr0' ]


Vif:指定该domain的虚拟网卡配置,采用如下格式


vif = [ "key1 = value1", "key2 = value2" ]


常用的配置指令有:

bridge:指定该虚拟网卡连接的网桥名称

mac:指定该虚拟网卡的MAC地址,如果不指定MACXen启动的时候会在IEEE分配给Xensource的地址范围中随机分配一个MAC地址。


经过上面的解释,你应该已经了解dom0中的那些接口是从何而来的了。接下来,我们要看一看数据包在网桥中是如何流动的。参考下图

Xen的network-bridge模式_第2张图片


数据包到达硬件物理网卡接口peth0dom0上的网卡驱动会进行处理。因为peth0绑定在网桥上,所以数据包被发送到网桥上。返回上边,观察ifconfig的输出,你会发现peth0,xenbr0,vif0.0vif1.0都共享一个相同的MAC地址FE:FF:FF:FF:FF:FF,该地址是以太网广播地址。这表明物理网卡接口,dom0loopback接口,所有guest domain的后端接口都广播到网桥接口xenbr0。当物理网卡接口peth0接收到一个数据包,它会将数据包直接发送到网桥接口xenbr0上。然后网桥会分发数据包,像交换机一样(话说交换机也是网桥的一种)。网桥会根据数据包接收者的MAC地址将其转发到正确的网络接口上。所以peth0这个接口不需要配置ip地址,只有MAC地址就够了。然后vif接口会将数据包发送给domU上相连的接口,然后domU中返回的数据包也通过vif发送回来。dom0也是一样的操作模式,通过vif0.0->eth0这一对相连的网卡。


如果你不想使用默认的xenbr0这个网桥的名字,可以在xend的配置文件中修改:


(network-script 'network-bridge bridge=')


改成任何其他你想要的名字。


另外,network-script通常将物理接口eth0绑定到网桥上,如果要绑定其他物理网卡接口,可以如下修改:


(network-script 'network-bridge bridge= netdev=eth1')


如果服务器上不只一个物理网卡接口,且连接不同的网络,那么最好创建多个网桥,并将这些物理网卡绑定到不同的网桥上。例如一个guest domain连接xenbr0peth0xenbr1peth1,另一个guest domain只连接xenbr1peth1。所有这些都可以在network-bridge中配置。


要让Xen在启动时自动创建多个网桥,需要对/etc/xen/xend-config.sxp进行一些调整。因为启动时它只调用一次network-bridge脚本创建网桥,即只创建一个网桥。为了解决这个问题,我们需要创建一个network-wrapper脚本,它可以调用network-bridge脚本两次。


创建/etc/xen/scripts/network-wrapper,内容如下:

#!/bin/sh

/etc/xen/scripts/network-bridge $1 netdev=eth0 bridge=xenbr0

/etc/xen/scripts/network-bridge $1 netdev=eth1 bridge=xenbr1


然后修改/etc/xen/xend-config.sxp,让其调用我们创建的/etc/xen/scripts/network-wrapper

(network-script network-bridge-wrapper)


然后在每个domU中的配置文件中确认,如果你想使用新创建的第二个网桥

vif=[ 'bridge=xenbr1', 'mac=00:16:3e:07:d2:0e', ]


二、Linux 网桥配置命令:brctl


      网桥是一种在链路层实现中继,对帧进行转发的技术,根据MAC分区块,可隔离碰撞,将网络的多个网段在数据链路层连接起来的网络设备。

在Linux中配置网络一般使用 brctl 命令,使用此命令首先要安装:bridge-utils软件包。

yum install bridge-utils

或者下载bridge-utils-1.4.tar.gz进行安装。

root@xenserver ~]# brctl--help

Usage: brctl [commands]

commands:

       addbr                          add bridge

       delbr                          delete bridge

       addif                 add interface to bridge

       delif                 delete interface from bridge

       setageing      

       setbridgeprio           set bridge priority

       setfd          

       sethello        

       setmaxage      

       setpathcost      set path cost

       setportprio      set port priority

       show                                    show a listof bridges

       showmacs                        show a list of mac addrs

       showstp                        show bridge stp info

       stp            {on|off}       turn stp on/off


====================================================================

       addbr bridge的名称 #添加bridge;

       delbr bridge的名称              #删除bridge;

       addif bridge的名称device的名称#添加接口到bridge;

       delif bridge的名称device的名称#从bridge中删除接口

       setageing bridge的名称时间     #设置老化时间,即生存周期

       setbridgeprio bridge的名称 优先级#设置bridge的优先级

       setfd bridge的名称时间         #设置bridge转发延迟时间

       sethello bridge的名称时间      #设置hello时间

       setmaxage bridge的名称时间     #设置消息的最大生命周期

       setpathcost bridge的名称 端口 权重#设置路径的权值

       setportprio bridge的名称 端口 优先级#设置端口的优先级

       show    #显示bridge列表

       showmacs bridge的名称 #显示MAC地址

       showstp bridge的名称           #显示bridge的stp信息

       stp bridge的名称{on|off}       #开/关stp


设置linux让网桥运行配置网桥

1.我们需要让linux知道网桥,首先告诉它,我们想要一个虚拟的以太网桥接口:(这将在主机bridge上执行,不清楚的看看测试场景)

root@bridge:~> brctl addbrbr0

2.其次,我们不需要STP(生成树协议)等。因为我们只有一个路由器,是绝对不可能形成一个环的。我们可以关闭这个功能。(这样也可以减少网络环境的数据包污染):

root@bridge:~> brctl stpbr0 off

3.经过这些准备工作后,我们终于可以做一些立竿见影的事了。我们添加两个(或更多)以太网物理接口,意思是:我们将他们附加到刚生成的逻辑(虚拟)网桥接口br0上。

root@bridge:~> brctl addifbr0 eth0

root@bridge:~> brctl addifbr0 eth1

4.现在,原来我们的两个以太网物理接口变成了网桥上的两个逻辑端口。那两个物理接口过去存在,未来也不会消失。要不信的话,去看看好了。.现在他们成了逻辑网桥设备的一部分了,所以不再需要IP地址。下面我们将这些IP地址释放掉

root@bridge:~> ifconfigeth0 down

root@bridge:~> ifconfigeth1 down

root@bridge:~> ifconfigeth0 0.0.0.0 up

root@bridge:~> ifconfigeth1 0.0.0.0 up


好了!我们现在有了一个任何IP地址都没有的box w/o了。好了,这下如果你想通过TP配置你的防火墙或路由器的话,你就只能通过本地的控制端口了。你不会告诉我你的机器上连串行端口都没有吧?

注:上面红色部分其实是可选的,在试验中,我发现,就算不把原有的网卡地址释放掉,网桥也能工作!但是,为了更规范,或者说


为了避免有什幺莫名其妙的问题,最好还是按要求做,执行这四步吧!


5.最后,启用网桥root@bridge:~> ifconfig br0up

可选:我们给这个新的桥接口分配一个IP地址

root@bridge:~> ifconfig br010.0.3.129

或者把最后这两步合成一步:

root@bridge:~> ifconfig br010.0.3.129 up

就是多一个up!


这下我们做完了 。


关闭网桥命令


    brctl delif ena eth1;

    brctl delif ena eth0;

    ifconfig ena down;

    brctl delbr ena;