Для этого есть 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 = массив целых чисел 8;
опция ms-classless-static-routes code 249 = массив целых чисел 8;
Возможно, новым версиям это не нужно, а моей нужно.
- создать
общая сеть
заблокируйте, поместите свою динамическую частную подсеть и ваши общедоступные адреса как «подсети» с масками 32:
вариант маршрутизаторов 192.168.210.1;
вариант доменных имен-серверов 8.8.8.8, 8.8.4.4;
общая сеть libvirt-vm-net {
подсеть 192.168.210.0 сетевая маска 255.255.255.0 {
диапазон 192.168.210.2 192.168.210.254;
}
подсеть 192.0.2.1 сетевая маска 255.255.255.255 {
опция rfc3442-classless-static-routes 32, 192,168,210,1, 0,0,0,0, 0, 192,168,210,1;
опция 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 маршрут добавить 192.168.210.1 dev eth0
ip route добавить по умолчанию через 192.168.210.1
которые нужны для того, чтобы все работало, несмотря на то, что нет подсети, содержащей 192.0.2.1/32 и 192.168.210.1; лучше попробуйте такую настройку в лабораторной среде, если вы не уверены, как работает эта маршрутизация.
- создайте определения хостов с желаемыми MAC-адресами, привязанными к вашим статическим IP-адресам:
host public-server-1 { аппаратный ethernet 00:11:22:33:44:55; фиксированный адрес 192.0.2.1; }
...
- добавить записи статических соседей («ARP») для этих MAC-адресов в
/etc/эфиры
(на хосте):
00:11:22:33:44:55 192.0.2.1
...
- добавить статические маршруты к этим адресам через соответствующий мостовой интерфейс; Я не знаю, как это сделать, используя стандартную сетевую конфигурацию вашего дистрибутива ОС, но общий способ Linux выглядит следующим образом:
ip маршрут добавить 192.0.2.1 dev br0
...
Затем убедитесь, что вы назначили эти MAC-адреса своим важным виртуальным машинам в конфигурациях libvirt. Другие виртуальные машины (чей MAC-адрес не привязан) получат свои адреса из настроенного диапазона, как обычно.
На самом деле я реализовал и протестировал эту настройку в еще «более сложной» настройке (DHCP, хост и маршрутизатор были отдельными системами), также я не использую libvirt, а мой хост - PVE. Даже загрузка PXE отлично работает как для «обычных» машин подсети (например, 192.168.210.0 в примере), так и для машин с «публичным IP» (например, 192.0.2.1).
Чтобы разрешить всем виртуальным машинам доступ в Интернет, вы должны использовать NAT для частных IP-адресов и не использовать его для общедоступных; это не проблема, используйте правило как iptables -t nat -A POSTROUTING -o <физический-интерфейс-с-публичным-ip> -s <диапазон-частных-ip> -j МАСКАРАД
. Таким образом, ваш частный диапазон будет преобразован в общедоступный адрес самого хоста, но общедоступные адреса не будут преобразованы, а будут маршрутизироваться как есть. Опять же, это не проблема иметь общедоступные и частные адреса в одном и том же сегменте сети и проходить через одну и ту же виртуальную сетевую карту.