为Xen创建虚拟LAN

廖雪峰 / 编程 / ... / Reads: 2098

Debian Squeeze上安装xen一文中,我们讨论了在局域网内部创建xen的方法,dom0和每个domU都使用相同的网段地址和网关,这种配置简单,但仅适用于局域网,因为IP数量够用,而且可以随意分配。

不过,在公网上,通常只有1个公网IP地址,domU只能分配私有IP地址,因此需要如下功能才能让domU正常服务:

  1. 各个domU之间能互相通信;
  2. domU能通过dom0作为网关访问Internet;
  3. dom0通过NAT将某些domU的服务暴露到Internet上。

为此,首先需要为domU创建一个虚拟的局域网,例如网段设置为172.16.16.0,dom0拥有两个网络接口:

  1. eth0:公网IP;
  2. dummy0:虚拟网络接口,作为内部网络的网关,地址为172.16.16.1

因此,首先为dom0创建虚拟的网络接口:

# modprobe dummy

向/etc/modules追加一行:

# echo dummy >> /etc/modules

编辑/etc/network/interfaces,增加dummy0的配置:

auto dummy0
iface dummy0 inet static
address 172.16.16.1
netmask 255.255.255.0
broadcast 172.16.16.255

启动dummy0:

# ifup dummy0

启用IP Forward:

# sysctl -w net.ipv4.ip_forward=1

编辑/etc/sysctl.conf使之永久生效:

net.ipv4.ip_forward=1

然后,需要让xend为两块网卡创建bridge,需要修改/etc/xen/xend-config.sxp,将:

(network-script 'network-bridge')

改为:

(network-script 'my_network_script')

my_network_script是我们自己的脚本,创建/etc/xen/scripts/my_network_script内容如下:

#!/bin/sh
dir=$(dirname "$0")
"$dir/network-bridge" "$@" vifnum=0 netdev=eth0 bridge=xenbr0
"$dir/network-bridge" "$@" vifnum=1 netdev=dummy0 bridge=xenbr1

将my_network_script加上执行权限:

# chmod a+x /etc/xen/scripts/my_network_script

重启服务器,可以用ifconfig看到xend创建的4个网络接口:

  1. lo:本机地址,127.0.0.1;
  2. pdummy0;
  3. peth0;
  4. xenbr0:公网IP地址;
  5. xenbr1:私有网关地址,172.16.16.1。

然后正常安装domU。

启动domU之前,需要修改domU的配置,例如/etc/xen/my-domU-1.cfg:

将:

vif = [ 'ip=172.16.16.60,mac=00:16:3E:F4:E7:0B' ]

改为:

vif = [ 'ip=172.16.16.60,bridge=xenbr1,mac=00:16:3E:F4:E7:0B' ]

其实就是加上bridge=xenbr1,因为domU用的是内网地址,应该使用xend提供的xenbr1做桥接。

启动domU后,分别ping内网地址(其他domU的地址)、网关172.16.16.1和dom0的公网地址,发现均能ping通,但无法ping通其他任何公网地址,例如www.sina.com.cn,说明网络数据包确实到达了dom0的172.16.16.1,但还缺少一条NAT规则以便把dummy0的包转发到eth0上。在dom0上添加iptables规则:

# iptables -t nat -A POSTROUTING -o xenbr0 -j MASQUERADE

然后在domU中再次ping外网地址,例如www.sina.com.cn,终于返回结果,wget测试也正常。

如果要将某些domU的服务映射到公网上,例如,一个地址为172.16.16.70的domU提供了8080端口的http服务,现在想在公网IP的80端口上访问它,则添加iptables规则:

# iptables -t nat -A PREROUTING -i xenbr0 -p tcp --dport 80 -j DNAT --to 172.16.16.70:8080

在外网测试访问http://公网IP/则映射到http://172.16.16.70:8080/。

参考:

http://wiki.xensource.com/xenwiki/XenNetworkingExamples

Comments

Make a comment

Author: 廖雪峰

Publish at: ...

关于作者

关注公众号不定期领红包:

关注微博获取实时动态: