У меня проблемы с доступом к сети с виртуальной машины, на которой я использую 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
.