Мост Xen domU со шлюзом в другой подсети

У меня есть Xen dom0, работающий под управлением Debian Wheezy (7.8) и Xen 4.1, настроенный с использованием мостовой сети.

  • 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, как описано в это сообщение в блоге.

Конфигурация 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

Я попытался зарегистрировать, действительно ли трафик отправляется через мост, вставив правило -j LOG в начало цепочек INPUT, OUTPUT и FORWARD iptables. Когда domU пытается пропинговать шлюз, dom0 не регистрирует ни одного пакета. Я также попытался вручную добавить запись для шлюза в таблицу ARP domU, но результаты были такими же. domU не может получить доступ к шлюзу и, таким образом, не имеет доступа к сети, кроме возможности взаимодействовать с dom0 по статическому маршруту.


person Rapsey    schedule 31.03.2015    source источник


Ответы (1)


Итак, если я правильно понимаю, следующая конфигурация сети для вашего DomU:

  • 192.XXX.13.129/28 — IP-адрес ДомУ
  • 199.XXX.161.64 - Адрес GW ДомУ

Проблема в том, что у вашего DomU нет маршрута (уровня 3), позволяющего ему общаться с адресом GW, поскольку адрес GW находится в другой подсети. Таким образом, даже если маршрутизатор находится в той же сети уровня 2, маршрутизатор (если он обрабатывает ваши пакеты) не знает о вашей сети уровня 3 и отправляет свои ответы на шлюз по умолчанию.

То, что вы можете пропинговать Dom0 из DomU, странно и, вероятно, является результатом того, что Dom0 и DomU используют один и тот же мост Linux (который не является настоящим коммутатором Ethernet, а больше похож на тупой концентратор).

Простое решение — добавить адрес из вашей сети DomU в интерфейс LAN на вашем маршрутизаторе.

Лучшим решением было бы использовать VLAN для сегментации различных сетей через уровень 2 и заменить мосты Linux на Open vSwitch. Это полностью изолировало бы трафик Dom0 и DomU, чтобы они могли обмениваться данными через маршрутизатор и, возможно, брандмауэр.

person David M. Syzdek    schedule 31.03.2015
comment
Да, но именно поэтому я вручную добавил маршрут на domU для отправки трафика на шлюз через бридж. Tcpdump показывает, что это работает, но шлюз не отвечает. Действительно ли невозможна прямая связь с хостом в другой подсети? Поскольку сообщение в блоге демонстрирует это, и, похоже, это работает для многих людей в комментариях, я подумал, что это можно сделать. Решение, которое вы предлагаете, в основном заключается в маршрутизации на dom0, в результате чего промежуточный адрес отображается в трассировке. Это правильно? Спасибо за ваш быстрый ответ! - person Rapsey; 31.03.2015
comment
Мост работает на уровне 2, маршрутизатор работает на уровне 3. Добавление маршрута на интерфейс может привести к тому, что фактический пакет будет доставлен маршрутизатору через уровень 2, однако, поскольку маршрутизатор не настроен с адресом 192.XXX.13.128/28, он отправит ответ на ваш эхо-запрос на шлюз по умолчанию. Я предлагаю вам добавить дополнительный подинтерфейс на маршрутизатор, чтобы он имел как адрес 199, так и адрес 192. Я бы не рекомендовал использовать Dom0 в качестве роутера. Кстати, я быстро отказался от использования мостов Linux в пользу Open vSwitch из-за ограничений мостов Linux. - person David M. Syzdek; 31.03.2015