Создание мостовой сети для гостей KVM вручную с одним гостем, работающим как DHCP сервер

Вопрос или проблема

Когда мы создаем сеть по умолчанию в Libvirt, создается множество интерфейсов:

  1. virbr0 с IP 192.168.122.1/16
  2. vnet0 без IP-адреса, так как он “подключен к ВМ”. Внутри ВМ тот же MAC-адрес vnet0 отображается с IP 192.168.122.16 (например)

Я пытаюсь достичь следующего:

  1. Как создать интерфейс моста, br0, с IP на хост-машине? Я создал один с помощью brctl, и, похоже, он работает, но я не знаю, правильно ли это.
  2. Как создать интерфейс vnetX для гостевой ВМ, который будет “подключен” к тому же виртуальному коммутатору, что и br0? Я должен использовать что-то вроде qemu-bridge-helper для этого или есть способ использовать brctl или команду ip для этого?
  3. Обеспечить доступ в Интернет для всех ВМ в режиме NAT.
  4. Убедиться, что их DHCP-запросы ограничены виртуальным коммутатором, связанным с интерфейсом “br0”, т.е. он работает только для ВМ, а не за пределами сети.

Извините за длинный пост, я пытаюсь узнать больше о сетях, и это будет чем-то вроде фундамента, где я смогу провести больше экспериментов с PXE-загрузкой, самостоятеьным DNS, тестированием брандмауэров и т. д. Просто хочу простую NAT-сеть ВМ с возможностью запускать свой собственный DHCP, DNS и т. д., не полагаясь на инструменты Libvirt.

Ответ или решение

Чтобы создать мостовую сеть для виртуальных машин (VM) с использованием KVM и обеспечить работу DHCP-сервера, вам необходимо выполнить несколько шагов. В этом ответе мы рассмотрим создание сетевого моста, подключение виртуальных машин к этому мосту, предоставление им NAT-доступа в интернет и конфигурацию DHCP таким образом, чтобы запросы DHCP оставались внутри данной виртуальной сети.

Шаг 1: Создание мостового интерфейса br0 на хост-машине

Сначала необходимо создать мостовой интерфейс. Вы можете использовать команду brctl или ip для создания моста. Вот пример с использованием ip:

# Установите необходимые пакеты
sudo apt install bridge-utils -y

# Создайте мостовой интерфейс
sudo ip link add name br0 type bridge

# Установите IP-адрес для моста (например, 192.168.100.1/24)
sudo ip addr add 192.168.100.1/24 dev br0

# Активируйте мостовой интерфейс
sudo ip link set dev br0 up

Шаг 2: Привязка vnetX интерфейса к мосту br0

При создании виртуальной машины вы можете подключить ее к мосту br0 напрямую. Чтобы указать мост при создании виртуальной машины с помощью virsh, используйте следующие команды в XML-конфигурации виртуальной машины:

<interface type='bridge'>
  <mac address='52:54:00:12:34:56'/>
  <source bridge='br0'/>
  <model type='virtio'/>
</interface>

Вы можете создать виртуальную машину через virt-install, указав параметр --network bridge=br0. Пример:

virt-install --name vm1 --ram 1024 --disk path=/var/lib/libvirt/images/vm1.img,size=10 --vcpus 1 --os-type linux --os-variant ubuntu20.04 --network bridge=br0 --graphics none --location http://cloud-images.ubuntu.com/releases/20.04/release/ubuntu-20.04-live-server-amd64.iso

Шаг 3: Обеспечение доступа в интернет через NAT

Для обеспечения доступа в интернет для ваших ВМ, необходимо настроить NAT с помощью iptables. Выполните следующие команды на хосте:

# Включите IP-прокси на хосте
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# Настройте правило NAT
sudo iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -o br0 -j MASQUERADE

Шаг 4: Настройка DHCP-сервера в одной из ВМ

Теперь вы можете установить DHCP-сервер на одной из ваших виртуальных машин. Например, если ваша ВМ работает на Ubuntu, выполните следующие команды:

# Установите isc-dhcp-server
sudo apt install isc-dhcp-server -y

# Настройте конфигурацию DHCP
sudo nano /etc/dhcp/dhcpd.conf

Пример конфигурации dhcpd.conf может выглядеть так:

subnet 192.168.100.0 netmask 255.255.255.0 {
  range 192.168.100.10 192.168.100.50;
  option routers 192.168.100.1;
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}

Не забудьте указать сеть, к которой будет подключен DHCP-сервер, в файле /etc/default/isc-dhcp-server:

INTERFACESv4="br0"

Шаг 5: Перезапуск DHCP-сервера

После внесения необходимых изменений перезапустите DHCP-сервер:

sudo systemctl restart isc-dhcp-server

Теперь ваш DHCP-сервер будет работать только в рамках созданного вами моста br0, обеспечивая доступ для всех виртуальных машин в этой сети.

Заключение

Теперь у вас есть настроенная мостовая сеть br0, подключенные к ней виртуальные машины и работающий NAT для доступа в интернет. Также один из ваших виртуальных серверов обеспечивает DHCP, что позволяет управлять IP-адресами в пределах этой виртуальной сети. Вы можете добавить дополнительные функции, такие как DNS-серверы или PXE-боты, в зависимости от ваших экспериментов.

Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!

Оцените материал
Добавить комментарий

Капча загружается...