桥接Xen domU与不同子网中的网关

时间:2015-03-31 16:25:22

标签: linux networking gateway xen bridge

我有一个运行Debian Wheezy(7.8)和Xen 4.1的Xen dom0,设置了桥接网络。

  • 199.XXX.161.64 是dom0网关。
  • 199.XXX.161.65 是dom0地址。
  • 192.XXX.13.128 / 28 是domU的子网。

配置dom0:

root@dom0:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto xenbr0
iface xenbr0 inet static
  address 199.XXX.161.65
  netmask 255.255.255.254
  network 199.XXX.161.64
  broadcast 199.XXX.161.65
  gateway 199.XXX.161.64
  dns-nameservers 199.XXX.162.41 199.XXX.162.141
  bridge_ports eth0
  bridge_stp off      # disable Spanning Tree Protocol
  bridge_fd 0         # no forwarding delay
  bridge_maxwait 0    # no delay before a port becomes available

allow-hotplug xenbr0  # start interface on hotplug event


root@dom0:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master xenbr0 state UP qlen 1000
    link/ether 00:25:90:d5:06:1a brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether 00:25:90:d5:06:1b brd ff:ff:ff:ff:ff:ff
4: xenbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 00:25:90:d5:06:1a brd ff:ff:ff:ff:ff:ff
    inet 199.XXX.161.65/31 brd 199.XXX.161.65 scope global xenbr0
    inet6 fe80::XXXX:90ff:fed5:61a/64 scope link 
       valid_lft forever preferred_lft forever
8: vif1.0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master xenbr0 state UP qlen 32
    link/ether fe:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fcff:ffff:feff:ffff/64 scope link 
       valid_lft forever preferred_lft forever


root@dom0:~# brctl show
bridge name bridge id         STP enabled interfaces
xenbr0      8000.002590d5061a no          eth0
                                          vif1.0


root@dom0:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         199.XXX.161.64  0.0.0.0         UG    0      0        0 xenbr0
192.XXX.13.128  0.0.0.0         255.255.255.240 U     0      0        0 xenbr0
199.XXX.161.64  0.0.0.0         255.255.255.254 U     0      0        0 xenbr0

root@dom0:~# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-out vif1.0 --physdev-is-bridged
ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-in vif1.0 --physdev-is-bridged udp spt:68 dpt:67
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            PHYSDEV match --physdev-out vif1.0 --physdev-is-bridged
ACCEPT     all  --  192.XXX.13.129       0.0.0.0/0            PHYSDEV match --physdev-in vif1.0 --physdev-is-bridged

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

此主机可以访问其网关,从而可以访问互联网。

root@dom0:~# ping -c 1 199.XXX.161.64
PING 199.XXX.161.64 (199.XXX.161.64) 56(84) bytes of data.
64 bytes from 199.XXX.161.64: icmp_req=1 ttl=64 time=0.459 ms

--- 199.XXX.161.64 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.459/0.459/0.459/0.000 ms

我还有一个domU(具有相同的操作系统),需要在不同的子网中使用主IP地址。此子网中的网络上没有网关。我想保持网络设置桥接(没有dom0路由或NAT),所以我添加了dom0网关作为domU的网关,如this blogpost中所述。

配置domU:

root@domU:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:b7:7e:cc brd ff:ff:ff:ff:ff:ff
    inet 192.XXX.13.129/28 brd 192.XXX.13.143 scope global eth0
    inet6 fe80::XXXX:3eff:feb7:7ecc/64 scope link 
       valid_lft forever preferred_lft forever


root@domU:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         199.XXX.161.64  0.0.0.0         UG    0      0        0 eth0
192.XXX.13.128  0.0.0.0         255.255.255.240 U     0      0        0 eth0
199.XXX.161.64  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

使用此配置,domU仍然无法访问网络。为了测试网桥是否正常工作,我手动添加了一条到dom0的路由。

root@domU:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         199.XXX.161.64  0.0.0.0         UG    0      0        0 eth0
192.XXX.13.128  0.0.0.0         255.255.255.240 U     0      0        0 eth0
199.XXX.161.64  0.0.0.0         255.255.255.255 UH    0      0        0 eth0
199.XXX.161.65  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

现在dom0和domU可以通过网桥进行通信。

root@domU:~# ping -c 1 199.XXX.161.65
PING 199.XXX.161.65 (199.XXX.161.65) 56(84) bytes of data.
64 bytes from 199.XXX.161.65: icmp_req=1 ttl=64 time=0.037 ms

--- 199.XXX.161.65 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms

root@dom0:~# ping -c 1 192.XXX.13.129
PING 192.184.13.129 (192.XXX.13.129) 56(84) bytes of data.
64 bytes from 192.XXX.13.129: icmp_req=1 ttl=64 time=0.100 ms

--- 192.XXX.13.129 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.100/0.100/0.100/0.000 ms

但是,domU仍然无法访问网关。

root@domU:~# ping -c 1 199.XXX.161.64
PING 199.XXX.161.64 (199.XXX.161.64) 56(84) bytes of data.
From 192.XXX.13.129 icmp_seq=1 Destination Host Unreachable

--- 199.XXX.161.64 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

我试图通过在INPUT,OUTPUT和FORWARD iptables链的顶部插入-j LOG规则来记录是否实际通过网桥发送流量。当domU尝试ping网关时,dom0不会记录单个数据包。我也尝试在domU的ARP表中手动添加网关条目,但结果是一样的。 domU无法访问网关,因此除了能够通过静态路由与dom0通信外,无法访问网络。

1 个答案:

答案 0 :(得分:1)

因此,如果我正确理解这一点,以下是您的DomU的网络配置:

  • 192.XXX.13.129 / 28 - DomU IP地址
  • 199.XXX.161.64 - DomU GW地址

问题是你的DomU没有路由(第3层)允许它与GW地址通信,因为GW地址在不同的子网中。因此,即使路由器位于同一个第2层网络上,路由器(如果它正在处理您的数据包)也不知道您的第3层网络,并且正在向它的默认网关发送它的响应。

你可以从DomU ping Dom0是奇怪的,可能是Dom0和DomU使用相同的Linux Bridge(它不是真正的以太网交换机,更像是一个愚蠢的集线器)的结果。

简单的解决方法是将DomU网络中的地址添加到路由器上的LAN接口。

更好的解决方案是使用VLAN通过第2层分割不同的网络,并用Open vSwitch替换Linux Bridges。这将完全隔离Dom0和DomU流量,以便它们需要通过路由器和可能的防火墙进行通信。