Рейтинг:0

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

флаг ug

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

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

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

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

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

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

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

Рейтинг:0
флаг za

Для этого есть 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 МАСКАРАД. Таким образом, ваш частный диапазон будет преобразован в общедоступный адрес самого хоста, но общедоступные адреса не будут преобразованы, а будут маршрутизироваться как есть. Опять же, это не проблема иметь общедоступные и частные адреса в одном и том же сегменте сети и проходить через одну и ту же виртуальную сетевую карту.

флаг ug
у вас есть какие-либо источники о том, как это сделать? Я пробовал это сейчас почти целый день, но я не могу заставить его работать.
Nikita Kipriyanov avatar
флаг za
Я построил такую ​​​​настройку и обновил пост, добавив описание, как это реализовать.
флаг ug
большое спасибо братан
флаг ug
Небольшой вопрос, возможно ли назначить IP-адрес напрямую с помощью virt-install?
Nikita Kipriyanov avatar
флаг za
Я не знаю. Я очень давно не пользовался virt-install (и вообще libvirt). Например, прошло десять лет с тех пор, как мост Linux получил нативную поддержку VLAN, но ребята из libvirt все еще живут в каменном веке, и нет поддержки нативного моста Linux с поддержкой vlan для назначения ВМ разным вланам. Но описанная установка не зависит от технологии виртуализации и будет корректно работать даже с физическим оборудованием. Все, что вам нужно сделать, это назначить (или хотя бы записать) MAC-адреса, а не IP-адреса; соответствие устанавливается внутри DHCP-сервера и /etc/ethers.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.