【问题标题】:Bridged Xen domU with gateway in different subnet桥接 Xen domU 与不同子网中的网关
【发布时间】:2015-06-05 02:02:27
【问题描述】:

我有一个运行 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 通信外,没有网络访问权限。

【问题讨论】:

    标签: linux networking gateway xen bridge


    【解决方案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 桥接器(它不是真正的以太网交换机,更像是一个哑集线器)。

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

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

    【讨论】:

    • 是的,但这就是为什么我在 domU 上手动添加了一条路由,以通过网桥将流量发送到网关。 Tcpdump 显示这有效,但网关没有响应。与另一个子网中的主机直接通信真的不可能吗?由于博文展示了这一点,而且它似乎对 cme​​ts 中的很多人都有效,我认为可以做到。您建议的解决方案基本上是在 dom0 上路由,这将使中间地址显示在跟踪路由中。那是对的吗?感谢您的快速回复!
    • 网桥在第 2 层运行,路由器在第 3 层运行。在接口上添加路由可能会通过第 2 层将实际数据包发送到路由器,但是由于路由器未配置 192 .XXX.13.128/28 地址,它会将您的 ping 响应发送到其默认网关。我建议您在路由器上添加一个额外的子接口,以便它同时具有 199 地址和 192 地址。我不建议将 Dom0 用作路由器。顺便说一句,由于 Linux 桥的限制,我很快停止使用 Linux 桥,转而使用 Open vSwitch。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多