1 (изменено: Denis, 04-04-2019 12:13:48)

Тема: Проброс портов Proxmox

KVM VPS на Proxmox за NAT с пробросом портов и DHCP


Сетевой мост (Bridge)
Организовать NAT для нескольких виртуальных машин довольно просто. В Proxmox «из коробки» доступно создание сетевых мостов (хотя удобнее это делать сразу в конфиге, т.к. PVE съедает комментарии и меняет форматирование). Для наших целей создадим бридж vmbr1  с ip-адресом 192.168.1.1  и стандартной маской 255.255.255.0 , которая предоставит в наше распоряжение все 256 адресов.

После того как он заработает, идем в /etc/network/interfaces  и немного правим конфигурацию созданного бриджа:

auto vmbr1
iface vmbr1 inet static
address 192.168.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 '192.168.1.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '192.168.1.0/24' -o vmbr0 -j MASQUERADE

Здесь мы разрешаем виртуальным машинам на vmbr1  подключаться к интернету через vmbr0 . Стоит отметить, что последние две строчки с добавлением и удалением правил файрвола могут отличаться по причине того, что в моем случае главным интерфейсом сервера является бридж vmbr0  и сеть настраивается на него. У меня он работает для получения несколькими виртуальными машинами реальных IP-адресов от внешнего гейта. Если у вас сеть настраивается на eth0 , то он и должен быть вместо vmbr0 . В остальном разницы никакой нет.
Также, включать ip_forward  можно в /etc/sysctl.conf .

net.ipv4.ip_forward=1

Проброс портов (Port forwarding)
Далее, если необходимо пробросить определенные порты на нужные виртуальные машины. Это можно сделать с помощью iptables:

iptables -A PREROUTING -t nat -i vmbr0 -p tcp -d %ext_ip_on_vmbr0% --dport %ext_port% -j DNAT --to %int_ip_on_vmbr1%:%int_port%

Где

%ext_ip_on_vmbr0%  — внешний IP-адрес, который находится на vmbr0 . Если не указать этого параметра, то порт будет пробрасываться со всех адресов на этом бридже.
%ext_port%  — внешний порт по которому будут обращаться к серверу из интернета.
%int_ip_on_vmbr1%  — внутренний IP виртуальной машины на vmbr1 .
%int_port%  — внутренний порт, на котором будет работать сервис в виртуальной машине.

Ну и после применения правил для нужных портов можно посмотреть все ли правильно:

# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere xxx.yyy.ru tcp dpt:33122 to:192.168.1.2:22
DNAT tcp -- anywhere xxx.yyy.ru tcp dpt:33222 to:192.168.1.3:22

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.1.0/24 anywhere
Сохранение правил файрвола
Если все верно — остается сделать так, чтобы при перезагрузке правила восстанавливались. Для этого можно воспользоваться iptables-save  и скриптами инициализации сети.

iptables-save > /etc/iptables.up.rules
Создадим скрипт загрузки правил:

nano /etc/network/if-pre-up.d/iptables

И впишем в него команду загрузки правил из сохраненного ранее файла:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules
Не забудем дать права на исполнение этому файлу:

chmod +x /etc/network/if-pre-up.d/iptables

Более простой альтернативой будет установка пакета iptables-persistent , который сам будет сохранять правила при выключении или перезагрузке, а при загрузке загружать их снова. Более подробно — здесь (англ).

Все. Проброс портов работает.

Настройка сети в гостевой ОС
Ручная настройка (static)
Наиболее простым вариантом является задание адреса виртуальной машины вручную. В самых простых случаях, можно воспользоваться им.

Для этого в настройках гостевой ОС прописываем такие параметры:

# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1

address  — ip-адрес данной машины. Естественно, у всех машин этой подсети он должен быть разный.

netmask  — это маска подсети. Точно такая же как указывалось при создании сетевого моста.

gateway  — ip-адрес, на котором сидит сам хост, через который будет происходить роутинг во внешнюю сеть.

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

Устанавливаем сервер:

aptitude install isc-dhcp-server

В файле /etc/dhcp/dhcpd.conf большинство параметров можно оставить неизменными, однако директиву authoritative; нужно раскомментировать. Также может быть полезным увеличить время выдачи адресов с помощью параметров:

default-lease-time 40320;
max-lease-time 40320;

И, самое главное, нужно описать настройки нашей подсети:

# NAT subnet on vmbr1
subnet 192.168.1.0 netmask 255.255.255.0 {
 range 192.168.1.2 192.168.1.254;
 option routers 192.168.1.1;
 option domain-name-servers 8.8.8.8, 8.8.4.4;
}

Здесь range  — это диапазон адресов, которые будет выдавать DHCP-сервер. domain-name-servers  — это DNS-сервера, которые будут использоваться на гостевых машинах. В данном примере это Google Public DNS.

Далее в файле /etc/default/isc-dhcp-server настраиваем какие интерфейсы будет слушать наш сервер:

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="vmbr1"

Для надёжности можно ещё прикрыть его файрволом от запросов извне.

После настройки перезапускаем DHCP

service isc-dhcp-server restart

Настройка закончена. Теперь гостевые машины будут получать настройки сети автоматически во время установки ОС.