ProxMox 5.3 отдельная сеть для VM
2019-2-21 10:25
Запустил сервер виртуализации на ProxMox 5.3, всё вроде бы хорошо, работает стабильно и быстро. Но уж очень много нюансов в настройке отдельных параметров самой системы и виртуальных машин. Потребовалось настроить отдельную сеть для виртуальных машин, так, чтобы она была в общей сети и всё виделось в обе стороны. Развлекался 2 дня, а всё оказалось просто!
Исходные данные. Мы имеем компьютер с Linux (Gentoo) с адресом 10.0.0.1 на нем поднят шлюз, прокси в интернет и куча других служб. Добавился сервер виртуализации на основе ProxMox 5.3. На нём нужно поднять сервер с ПО, которое привязано к сети 10.0.1.0/24. Т.е. если его поместить в другую сеть, работать не будет нужна именно 10.0.1.0. Это и есть основная проблема, т.к. можно было бы обойтись одной сетью, которая и так уже есть . Но всё это есть частный случай, и мотивы у всех будут разные.
На сервере ProxMox есть две сетевые карты (eno1, eno2) и по умолчанию создается мост (vmbr0) для виртуальных машин в составе с eno1. При установке и настройке ProxMox он задаст вопрос об установке ip адреса, вот этот адрес и будет установлен для моста vmbr0. Таким образом мы получаем мост для виртуальных машин с адресом, указанным при установке (10.0.0.10), и занимающим первый сетевой адаптер. Второй сетевой адаптер остаётся для других нужд.
Если создать виртуальную машину из сети 10.0.1.0 и подключить её к мосту с сетью 10.0.0.10 ничего не заработает. Пакеты естественно не захотят ходить никуда. Поэтому создаем второй мост.
В мост для сети 10.0.1.0 физические сетевые адаптеры входить вообще не будут. Он будет только объединять виртуальные машины сети 10.0.1.0. Но адрес ему задать нужно, и пусть это будет адрес 10.0.1.1.
Теперь нужно настроить правила для NAT, позволяющие трафику из моста vmbr1 (10.0.1.0) ходить через vmbr0 в общую сеть 10.0.0.0. В интернете они упоминаются в каждой второй статье или теме на форуме касательно настройки двух бриджей. Выглядят они так:
post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '10.0.1.0/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '10.0.1.0/24' -o vmbr0 -j MASQUERADE
Добавить их нужно в самый конец файла /etc/network/interfaces.new на сервере ProxMox. После изменений настроек мостов, у вас должен был появится файла interfaces.new, который при перезапуске сервера заменит файл interfaces без расширения new и исчезнет, поэтому настройки NAT лучше поместить в него. Если файл с расширением .new отсутствует, то три волшебных строки нужно будет добавить в файл interfaces и перезагрузить сервер.
Суть их проста, при поднятии интерфейса разрешаем пробрасывать трафик на уровне ядра и в файрволе включаем маскировку пакетов сети 10.0.1.0 проходящих через мост vmbr0, без маскировки пакета внутри другой сети, он никуда не долетит. При отключении интерфейса отменяем правило о маскировке, чтобы не было лишнего. Гениальное - просто.
На виртуальной машине в мосту 10.0.1.0 нужно указать свой ip адрес, например 10.0.1.10, и адрес шлюза, а им является адрес моста, т.е. 10.0.1.1.
На данном этапе виртуальная машина будет успешно пинговать обе сети 10.0.0.0 и 10.0.1.0, но из сети 10.0.0.0 ни один компьютер не будет видеть виртуалку. Связано это с тем, что пакеты в сети 10.0.0.0 летят на шлюз по умолчанию 10.0.0.1, а он уже перекидывает их дальше, куда нужно. Но сам по себе он не узнает о том, что на сервере виртуализации за основном мостом есть второй и вот на нем есть ещё одна подсеть 10.0.1.0. Если вместо сети 10.0.0.0 у вас интернет, и не нужно, чтобы видно адреса за мостом 10.0.1.0, то на этом можно остановиться и для вас цель достигнута, в моём случае мне этого мало.
Для того, чтобы пакеты для сети 10.0.1.0 могли доходить из сети 10.0.0.0 нужно на шлюзе (Linux Gentoo) добавить в таблицу маршрутизации новый маршрут.
route add -net 10.0.1.0/24 gw 10.0.0.10 eth1Маршрут скажет серверу маршрутизации, что трафик для сети 10.0.1.0 нужно будет выбрасывать на интерфейс ProxMox (10.0.0.10). А ProxMox уже сам пробросит пакеты дальше.
Чтобы Gentoo запомнил маршрут и после перезагрузки всё работало без вмешательств, нужно добавить его в настройки /etc/conf.d/net
....... routes_eth1=( "10.0.0.0/24 via 10.0.0.1" #этот маршрут уже был "10.0.1.0/24 via 10.0.0.10" #этот я добавил ) .......
И перезапустить сервер или только сетевой интерфейс командой:
/etc/init.d/net.eth1 restart
После этого, вся подесть 10.0.1.0 будет успешно видеть подсеть 10.0.0.0 и наоборот.
Ниже скинул свой конфиг ProxMox (/etc/network/interface), какой в итоге получился и с каким сейчас всё работает:
auto lo iface lo inet loopback iface eno1 inet manual iface eno2 inet manual auto vmbr0 iface vmbr0 inet static address 10.0.0.10 netmask 255.255.255.0 gateway 10.0.0.1 bridge-ports eno1 bridge-stp off bridge-fd 0 auto vmbr1 iface vmbr1 inet static address 10.0.1.1 netmask 255.255.255.0 bridge-ports none bridge-stp off bridge-fd 0 post-up echo 1 > /proc/sys/net/ipv4/ip_forward post-up iptables -t nat -A POSTROUTING -s '10.0.1.0/24' -o vmbr0 -j MASQUERADE post-down iptables -t nat -D POSTROUTING -s '10.0.1.0/24' -o vmbr0 -j MASQUERADEВ интернете достаточно много информации по настройке ProxMox. Система сама по себе очень стабильная и гибкая. Linux вообще сам по себе прекрасен! Могу советовать ProxMox как мощный инструмент виртуализации, который идет в ногу со временем и поддерживает множество различных фич, которые не могу себе позволить многие платные решения.
Теги: Linux Gentoo виртуальная Proxmox route маршрутизация проксмокс линукс генту мост бридж bridge virtual machine машина компьютер ПК сервер настройка server configure