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

KVM с общедоступными IP-адресами с использованием моста - у гостя нет подключения

Примечания к предисловию:

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 я сделал следующее:

IP-адреса

Сбросить отдельный MAC

Конфиг в "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.