Назад | Перейти на главную страницу

Сетевой трафик не перенаправляется с виртуальной машины в сеть с использованием мостового интерфейса с Xen + libvirt

У меня проблемы с доступом к сети с виртуальной машины, на которой я использую Xen и libvirt. Я пробовал разные вещи и читал похожие сообщения в Интернете в течение нескольких дней, но я действительно застрял на этом этапе. Если бы кто-нибудь мог предложить какое-то понимание, это было бы очень признательно.

У меня есть виртуальная машина, которую я запускаю на хосте с мостом, настроенным как br0, и интерфейсом eth0 в подсети 192.168.60.0/24. Сетевая часть XML-файла конфигурации libvirt:

<interface type='bridge'>
  <mac address='ff:a0:d1:e5:07:de'/>
  <source bridge='br0'/>
  <script path='/etc/xen/scripts/vif-bridge'/>
  <model type='virtio' />
</interface>

Когда я запускаю виртуальную машину, на хосте создается интерфейс vif6.0, а вывод ifconfig:

br0       Link encap:Ethernet  HWaddr 00:A0:D1:C3:07:DE
          inet addr:192.168.60.33  Bcast:192.168.60.255  Mask:255.255.255.0
          inet6 addr: fe80::2a0:d1ff:fee5:7de/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:13 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3570 (3.4 KiB)  TX bytes:3508 (3.4 KiB)

eth0      Link encap:Ethernet  HWaddr 00:A0:D1:C3:07:DE
          inet6 addr: fe80::2a0:d1ff:fee5:7de/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:492 (492.0 b)
          Interrupt:19 Memory:fe8f0000-fe900000

vif6.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
          inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:80 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:6660 (6.5 KiB)  TX bytes:468 (468.0 b)

virbr0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 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:0 (0.0 b)  TX bytes:0 (0.0 b)

Вывод 'brctl show', кажется, показывает, что мост настроен правильно:

br0             8000.00a0d1e507de       no              eth0
                                                        vif6.0

Содержимое ifcfg-eth0 на виртуальной машине:

DEVICE=eth0 
BOOTPROTO=static 
HWADDR=FF:A0:D1:E5:07:DE
IPADDR=192.168.60.133 
NETMASK=255.255.255.0 
ONBOOT=yes

и вывод ifconfig в виртуальной машине выглядит так, как я ожидал:

eth0      Link encap:Ethernet  HWaddr FF:A0:D1:E5:07:DE  
          inet addr:192.168.60.133  Bcast:192.168.60.255  Mask:255.255.255.0
          inet6 addr: fe80::fda0:d1ff:fee5:7de/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:468 (468.0 b)  TX bytes:7780 (7.5 KiB)

но когда я пытаюсь подключиться к другому компьютеру по ssh или ping, у меня нет маршрута к хосту.

Используя tcpdump в хост-системе, я попытался выяснить, могу ли я сузить круг проблем:

# tcpdump -vv -i vif6.0
tcpdump: WARNING: vif6.0: no IPv4 address assigned
tcpdump: listening on vif6.0, link-type EN10MB (Ethernet), capture size 96 bytes
14:49:40.833997 arp who-has 192.168.60.35 tell 192.168.60.133
14:49:41.833314 arp who-has 192.168.60.35 tell 192.168.60.133
14:49:42.833309 arp who-has 192.168.60.35 tell 192.168.60.133

Таким образом, виртуальная машина отправляет пакет arp who-has, когда я пытаюсь установить ssh на 192.168.60.35. Я думаю, это означает, что с настройкой внутри виртуальной машины все в порядке, и это проблема хост-системы. Если я запускаю tcpdump с интерфейсом br0, я не вижу этих пакетов arp.

Я думаю, что пакеты блокируются перед тем, как каким-то образом попасть на мост. Я попытался добавить правило iptables, чтобы решить эту проблему: -A FORWARD -m Physdev --physdev-is-bridged -j ACCEPT, но это не сработало. Я также пробовал следующее:

/sbin/sysctl -w net.bridge.bridge-nf-call-ip6tables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-iptables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-arptables=0
/sbin/sysctl -w net.ipv4.ip_forward=1

что не повлияло.

Для кого-то, у кого больше опыта, чем у меня, очевидно, что мне здесь не хватает? Должен ли vif6.0 иметь такой же MAC-адрес, как eth0 в виртуальной машине? Мне нужно больше правил в моих iptables? Спасибо за любую помощь!

Вы должны настроить ip-адрес на br0 вместо того eth0.

Пример /etc/sysconfig/network-scripts/ifcfg-eth0:

DEVICE="eth0"
HWADDR="00:1E:37:D4:06:3E"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE=br0

Пример /etc/sysconfig/network-scripts/ifcfg-br0:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=192.168.60.255
IPADDR=192.168.60.133
NETMASK=255.255.255.0
NETWORK=192.168.60.0
ONBOOT=yes 

Затем выполняя sudo ifdown eth0;ifdown br0; ifup br0; ifup eth0

Вы должны увидеть, что IP-адрес настроен на br0 через команду ifconfig.