Примечания к предисловию:
Linux titan 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux
У меня есть сервер, на котором несколько адресов выделено в / 27. Вот эти детали:
Network: 10.9.114.64
Gateway: 10.9.114.65
Host: 10.9.114.80
Guest: 10.9.114.81
Bcast: 10.9.114.85
Есть еще IP-адреса для дополнительных гостей, но пока я просто работаю с одним гостевым IP-адресом.
Мой план состоит в том, чтобы соединить eth0 и виртуальный сетевой адаптер, чтобы гость мог напрямую общаться с хостом и шлюзом.
На хосте я переместил адресацию на интерфейс моста br0, показанный ниже:
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet static
address 10.9.114.80
netmask 255.255.255.224
gateway 10.9.114.65
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Это было проверено с помощью ifconfig:
br0 Link encap:Ethernet HWaddr 54:04:a6:7e:e5:e2
inet addr:10.9.114.80 Bcast:10.9.114.95 Mask:255.255.255.224
inet6 addr: 2a01:4f8:151:6456::/64 Scope:Global
inet6 addr: fe80::5604:a6ff:fe7e:e5e2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4349285 errors:0 dropped:0 overruns:0 frame:0
TX packets:3342075 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:631623791 (602.3 MiB) TX bytes:4483323274 (4.1 GiB)
eth0 Link encap:Ethernet HWaddr 54:04:a6:7e:e5:e2
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5130227 errors:0 dropped:0 overruns:0 frame:0
TX packets:5612825 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:763224208 (727.8 MiB) TX bytes:4676628982 (4.3 GiB)
Затем я настраиваю виртуальную машину Debian с помощью virt-install. Первоначально он был настроен на использование NAT (так как я пока не могу заставить работать мостовую сеть), но текущая конфигурация интерфейса показана ниже:
(Взято из "virsh dumpxml jessie-amd64")
<interface type='bridge'>
<mac address='52:54:00:06:f1:d6'/>
<source bridge='br0'/>
<target dev='vnet0'/>
<model type='rtl8139'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
(Взято из "virsh edit jessie-amd64")
<interface type='bridge'>
<mac address='52:54:00:06:f1:d6'/>
<source bridge='br0'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
После применения конфигурации моста я перезагрузил виртуальную машину в соответствии с инструкциями на сайте libvirt.
Я могу подтвердить, что и физический интерфейс хоста, и виртуальный адаптер находятся в мосте вместе с "brctl show"
bridge name bridge id STP enabled interfaces
br0 8000.5404a67ee5e2 no eth0
vnet0
На гостевой машине у меня в / etc / network / interfaces следующая конфигурация:
# The primary network interface
auto eth0
iface eth0 inet static
address 10.9.114.91
netmask 255.255.255.224
gateway 10.9.114.65
Это было проверено с помощью ifconfig:
eth0 Link encap:Ethernet HWaddr 52:54:00:06:f1:d6
inet addr:10.9.114.91 Bcast:10.9.114.95 Mask:255.255.255.224
inet6 addr: fe80::5054:ff:fec3:14e0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:32690 errors:0 dropped:0 overruns:0 frame:0
TX packets:81 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2978342 (2.8 MiB) TX bytes:4550 (4.4 KiB)
Насколько я понимаю, это должно означать, что хост и гость по сути используют виртуальный коммутатор, подключенный к шлюзу.
Однако пинг от хоста к гостю не работает, как показано ниже:
pricetx@titan:/home/pricetx>ping 10.9.114.91
PING 10.9.114.91 (10.9.114.91) 56(84) bytes of data.
^C
--- 10.9.114.91 ping statistics ---
8 packets transmitted, 0 received, 100% packet loss, time 6999ms
Я решил проверить таблицу ARP, чтобы узнать, может ли хост хотя бы arp пересечь мост:
pricetx@titan:/home/pricetx>sudo arp -an
? (10.9.114.91) at 52:54:00:06:f1:d6 [ether] on br0
? (10.9.114.65) at f4:cc:55:4b:55:7b [ether] on br0
Очевидно, он может видеть гостя (и шлюз).
Однако, проверяя таблицу arp для гостя, я, похоже, ничего не вижу:
root@kvmtest:~# arp -an
? (10.9.114.65) at <incomplete> on eth0
Моя проблема заключается в том, что гость не может видеть другие хосты на мосту. Любые предложения приветствуются!
Я буду продолжать исследовать это, и если я тем временем найду решение, я обновлю этот пост.
Теперь у меня есть успешное подключение, доказательства показаны ниже:
От Гостя:
root@kvmtest:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=47 time=14.0 ms
root@kvmtest:~# arp -an
? (10.9.114.65) at f4:cc:55:4b:55:7b [ether] on eth0
? (10.9.114.80) at 54:04:a6:7e:e5:e2 [ether] on eth0
Для меня проблема заключалась в провайдере сервера, Hetzner. Очевидно, их шлюзовые маршрутизаторы не разрешают случайным MAC-адресам отправлять / получать трафик. Вместо этого вам нужно перейти на их сайт, сгенерировать адрес, а затем применить его к конфигурации virsh.
В панели управления Hetzner я сделал следующее:
Конфиг в "virsh edit jessie-amd64"
<interface type='bridge'>
<mac address='00:50:56:00:1e:aa'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
По моему опыту создания гостевых интерфейсов с libvirt, все, что требуется, - это исходный мост, MAC-адрес и тип модели. Все остальное динамически именуется / создается при гостевом запуске. Пример этого можно увидеть в документации libvirt: wiki.libvirt.org/page/Networking#Guest_configuration_2
Посмотрите, работает ли это. Также см. Использование virtio для модели NIC, так как эмуляция RTL очень "голая". Гость Debian Jessie поддерживает virtio fine.