Автоматически назначать публичный IPv4 каждой создаваемой виртуальной машине KVM?

Автоматически назначать публичный IPv4 каждой создаваемой виртуальной машине KVM?

Мне интересно, как мне назначить публичный IPv4 каждой создаваемой виртуальной машине.

Настройка: Хост-сервер с 3 IP-адресами на CentOS8 с использованием libvirt и kvm для виртуализации моста br0 с использованием eth0 в качестве интерфейса.

После множества проб и ошибок мне удалось сделать это вручную, используя мост и назначив IP-адрес интерфейсу сетевого файла гостевой ОС.

Хотя я хотел бы, чтобы это было автоматически, учитывая, что если я переустановлю ОС сейчас, то это вернётся к отсутствию IP-адреса и идентификатора, и мне придётся подключаться к Гостю и вручную редактировать IPv4-адрес в сетевых файлах каждый раз. Как мне этого избежать?

Цель: каждый IPv4 жестко привязан к виртуальной машине и останется там даже при переустановке ОС.

Дополнительная цель: если какой-либо IPv4 из хостовой ОС не используется, его следует назначить следующей созданной виртуальной машине.

Нужно ли мне каждый раз писать собственное программное обеспечение, чтобы делать это, или есть более простой способ?

решение1

Для этого и нужен DHCP.

Вы можете свободно выбирать их MAC-адреса, верно? Настройте DHCP-сервер в системе в том же (возможно, виртуальном) сегменте Ethernet, что и виртуальные машины, и привяжите свои IP-адреса к определенным MAC-адресам.

Вам также понадобится распределить некоторые маршруты (используйте параметры DHCP 121 и 249). Машина с DHCP-сервером сама по себе не обязательно должна иметь публичный IP или IP в той же сети, что и все клиенты; связь с DHCP-сервером происходит, когда на клиенте все равно еще не настроены адреса.

Если вы используете ISC DHCP, вам нужно сделать что-то вроде следующего. Я предполагаю, что ваш хост-компьютер — это ваш маршрутизатор и NAT-бокс для виртуальных машин, и он также будет размещать ваш DHCP-сервер. Если вы хотите сделать по-другому, потребуются небольшие корректировки:

  • Определите параметры 121 и 249 где-нибудь в верхней части dhcpd.conf:
option rfc3442-classless-static-routes code 121 = array of integer 8;
option ms-classless-static-routes code 249 = array of integer 8;

Возможно, в новых версиях это не нужно, но в моей нужно.

  • создайте shared-networkблок, укажите свою динамическую частную подсеть и свои публичные адреса как «подсети» с масками 32:
option routers 192.168.210.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;

shared-network libvirt-vm-net {
    subnet 192.168.210.0 netmask 255.255.255.0 {
        range 192.168.210.2 192.168.210.254;
    }

    subnet 192.0.2.1 netmask 255.255.255.255 {
        option rfc3442-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;        
        option ms-classless-static-routes      32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;        
    }

    ...
}

Я предполагаю, что ваша "частная" сеть для машин за NAT будет 192.168.210.0/24, а хост будет .1 в этой сети (назначен мосту). Настройка статических бесклассовых маршрутов (опции 121 и 249) добавит следующие маршруты:

ip route add 192.168.210.1 dev eth0
ip route add default via 192.168.210.1

которые необходимы для того, чтобы все работало, несмотря на то, что нет подсети, содержащей 192.0.2.1/32 и 192.168.210.1; лучше попробуйте такую ​​настройку в лабораторной среде, если вы не уверены, как работает эта маршрутизация

  • создайте определения хостов с нужными вам MAC-адресами, привязанными к вашим статическим IP-адресам:
host public-server-1 { hardware ethernet 00:11:22:33:44:55; fixed-address 192.0.2.1; }
...
  • добавьте статические записи соседей («ARP») для этих MAC-адресов в /etc/ethers(на хосте):
00:11:22:33:44:55 192.0.2.1
...
  • добавьте статические маршруты к этим адресам через соответствующий интерфейс моста; я не знаю, как это сделать, используя стандартную сетевую конфигурацию вашего дистрибутива ОС, но общий способ Linux выглядит так:
ip route add 192.0.2.1 dev br0
...

Затем убедитесь, что вы назначили эти MAC-адреса вашим важным виртуальным машинам в конфигах libvirt. Другие виртуальные машины (чьи MAC-адреса не привязаны) получат свои адреса из настроенного диапазона, как обычно.

На самом деле я реализовал и протестировал эту настройку в еще более "сложной" настройке (DHCP, хост и маршрутизатор - все это были разные системы), также я не использую libvirt, а мой хост - PVE. Даже загрузка PXE прекрасно работает как для "обычных" машин подсети (например, 192.168.210.0 в примере), так и для машин "public IP" (например, 192.0.2.1).

Чтобы разрешить всем виртуальным машинам доступ в Интернет, вам нужно использовать NAT для частных IP-адресов и не использовать его для публичных; это не проблема, используйте правило типа iptables -t nat -A POSTROUTING -o <physical-interface-with-public-ip> -s <private-ip-range> -j MASQUERADE. Таким образом, ваш частный диапазон будет транслироваться в публичный адрес самого хоста, но публичные адреса не будут транслироваться, а будут маршрутизироваться как есть. Опять же, не проблема иметь публичные и частные адреса в одном сегменте сети и проходить через одну и ту же виртуальную сетевую карту.

Связанный контент