Если на выделенном сервере не хватает публичных IP или некоторым виртуальным машинам (БД, тестовые стенды, сборочные агенты) внешний адрес вообще не нужен, удобнее всего настроить NAT-сеть в Proxmox VE. Создаём мост vmbr1 без физического порта как приватную подсеть, хост маскирует трафик ВМ за своим публичным IP через iptables MASQUERADE, а нужные порты публикуем пробросом DNAT. Инструкция для Proxmox VE 7.x/8.x (на базе Debian), примеры для гостевых Debian/Ubuntu и CentOS/Rocky/AlmaLinux.
Сохраните копию /etc/network/interfaces и проверьте, через какой мост идёт маршрут по умолчанию. Ошибка в конфиге может отрезать удалённый доступ, поэтому держите под рукой консоль IPMI/KVM или обратитесь в поддержку.
cp /etc/network/interfaces /etc/network/interfaces.bak.$(date +%F)
ip -br addr
ip route | grep default
Добавьте блок vmbr1 в конец /etc/network/interfaces. bridge-ports none делает его чисто внутренним коммутатором; строки post-up включают пересылку IPv4 и маскируют трафик из 10.10.10.0/24, уходящий через vmbr0.
auto vmbr1
iface vmbr1 inet static
address 10.10.10.1/24
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.10.10.0/24' -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o vmbr0 -j MASQUERADE
Примените настройки и закрепите пересылку пакетов через sysctl:
ifreload -a
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-ip-forward.conf
sysctl --system
ip addr show vmbr1
iptables -t nat -S POSTROUTING
Мост vmbr1 можно создать и в веб-интерфейсе (Узел → Система → Сеть → Создать → Linux Bridge), но правила MASQUERADE всё равно придётся дописать в файл вручную.
В разделе «Оборудование → Сетевое устройство» смените мост на vmbr1 (или добавьте вторую карту на vmbr1). В гостевой системе задайте статический адрес 10.10.10.x и шлюз 10.10.10.1:
# Debian (/etc/network/interfaces inside the VM)
auto ens18
iface ens18 inet static
address 10.10.10.101/24
gateway 10.10.10.1
dns-nameservers 1.1.1.1 8.8.8.8
# Ubuntu (/etc/netplan/50-nat.yaml, then: netplan apply)
network:
version: 2
ethernets:
ens18:
addresses: [10.10.10.102/24]
routes:
- to: default
via: 10.10.10.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
# CentOS / Rocky / AlmaLinux 8/9
nmcli con mod ens18 ipv4.method manual ipv4.addresses 10.10.10.103/24 \
ipv4.gateway 10.10.10.1 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli con up ens18
# test from the VM
ping -c 3 10.10.10.1
ping -c 3 1.1.1.1
Если 1.1.1.1 отвечает, исходящий NAT работает. Если IP пингуются, а имена не резолвятся — проверьте DNS.
Снаружи ВМ за NAT недоступны. Чтобы открыть SSH или сайт, добавьте на хосте правила DNAT, перенаправляющие порт публичного IP на ВМ:
# public port 2201 -> VM 10.10.10.101:22 (SSH)
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
# public port 8080 -> VM 10.10.10.102:80 (HTTP)
iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.102:80
iptables -t nat -L PREROUTING -n --line-numbers
Правила, введённые в консоли, пропадают после перезагрузки. Выберите один способ: прописать их в post-up/post-down моста vmbr1 (самый аккуратный вариант) или установить iptables-persistent и сохранить текущие правила. Если для этих ВМ включён файрвол Proxmox, добавьте правило conntrack zone, иначе ответы через NAT могут теряться.
# Option A: add to the vmbr1 block in /etc/network/interfaces
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 2201 -j DNAT --to-destination 10.10.10.101:22
# only if the Proxmox firewall is enabled on these VMs:
post-up iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1
# Option B: save the current rules with iptables-persistent
apt update && apt install -y iptables-persistent
netfilter-persistent save
cat /etc/iptables/rules.v4
Когда ВМ много, прописывать статические адреса утомительно. Установите на хост dnsmasq, привяжите его только к vmbr1 и закрепите адреса через dhcp-host для ВМ с пробросом портов:
apt install -y dnsmasq
cat > /etc/dnsmasq.d/vmbr1.conf <<'EOF'
interface=vmbr1
bind-interfaces
except-interface=lo
dhcp-range=10.10.10.100,10.10.10.200,255.255.255.0,12h
dhcp-option=option:router,10.10.10.1
dhcp-option=option:dns-server,1.1.1.1,8.8.8.8
# fixed lease for one VM (MAC from: qm config 101 | grep net0)
dhcp-host=BC:24:11:AA:BB:CC,10.10.10.101
EOF
systemctl restart dnsmasq
systemctl status dnsmasq --no-pager
Проверьте, что /proc/sys/net/ipv4/ip_forward равен 1, что iptables -t nat -S POSTROUTING показывает правило MASQUERADE с правильным выходным интерфейсом, и что у самого хоста есть доступ в интернет.
Убедитесь, что в правиле DNAT указан -i vmbr0, сервис в ВМ слушает 0.0.0.0, а не 127.0.0.1, гостевой файрвол пропускает порт, а при включённом файрволе Proxmox добавлено правило conntrack zone для fwbr+.
Да. ВМ с публичными адресами остаются на vmbr0, NAT-ВМ — на vmbr1, а одной ВМ можно дать по карте в каждой сети. Если нужны дополнительные публичные IP, обратитесь в IMIDC.
Если проблема не решена, создайте тикет в круглосуточную техподдержку IMIDC: https://www.imidc.com/submitticket.php