ESC

Start typing to search across invoices, services, domains, tickets, and more...

Search... Ctrl+K
Виртуализация и хост-ноды

NAT-сеть в Proxmox VE: приватная подсеть vmbr1, iptables MASQUERADE и проброс портов

6 шагов 15 мин чтения 2 просмотров 0
Содержание

Если на выделенном сервере не хватает публичных IP или некоторым виртуальным машинам (БД, тестовые стенды, сборочные агенты) внешний адрес вообще не нужен, удобнее всего настроить NAT-сеть в Proxmox VE. Создаём мост vmbr1 без физического порта как приватную подсеть, хост маскирует трафик ВМ за своим публичным IP через iptables MASQUERADE, а нужные порты публикуем пробросом DNAT. Инструкция для Proxmox VE 7.x/8.x (на базе Debian), примеры для гостевых Debian/Ubuntu и CentOS/Rocky/AlmaLinux.

Предполагается, что публичный мост — vmbr0 (по умолчанию в Proxmox), приватная подсеть — 10.10.10.0/24, адрес хоста в ней — 10.10.10.1. Если мост называется иначе, замените vmbr0. Установка Proxmox и выдача ВМ публичных IP описаны в статьях справочного центра «Установка PVE» и «Назначение IP виртуальным машинам PVE».

Шаг 1: Резервная копия сетевого конфига Proxmox и проверка публичного моста

Сохраните копию /etc/network/interfaces и проверьте, через какой мост идёт маршрут по умолчанию. Ошибка в конфиге может отрезать удалённый доступ, поэтому держите под рукой консоль IPMI/KVM или обратитесь в поддержку.

cp /etc/network/interfaces /etc/network/interfaces.bak.$(date +%F)
ip -br addr
ip route | grep default

Шаг 2: Создание NAT-моста vmbr1 и правила iptables MASQUERADE

Добавьте блок 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 всё равно придётся дописать в файл вручную.

Шаг 3: Подключение ВМ к NAT-сети и настройка приватных IP

В разделе «Оборудование → Сетевое устройство» смените мост на 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.

Шаг 4: Проброс портов DNAT для публикации сервисов ВМ

Снаружи ВМ за 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
Не пробрасывайте порты, которые использует сам хост (22, 8006 и т. п.), иначе потеряете доступ к хосту или веб-интерфейсу Proxmox. Если на хосте работает файрвол, разрешите в нём и проброшенные порты.

Шаг 5: Сохранение правил проброса портов iptables

Правила, введённые в консоли, пропадают после перезагрузки. Выберите один способ: прописать их в 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

Шаг 6 (необязательно): DHCP для NAT-подсети через dnsmasq

Когда ВМ много, прописывать статические адреса утомительно. Установите на хост 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
dnsmasq слушает только vmbr1, поэтому не отвечает на DHCP-запросы с публичной стороны и не мешает сети дата-центра.

Частые вопросы

ВМ пингует 10.10.10.1, но интернета нет

Проверьте, что /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+.

Можно ли совмещать NAT-ВМ и ВМ с публичными IP?

Да. ВМ с публичными адресами остаются на vmbr0, NAT-ВМ — на vmbr1, а одной ВМ можно дать по карте в каждой сети. Если нужны дополнительные публичные IP, обратитесь в IMIDC.

Если проблема не решена, создайте тикет в круглосуточную техподдержку IMIDC: https://www.imidc.com/submitticket.php

Помог ли вам данный ответ?

Похожие руководства