Как дополнительный IPv4 попадает к гостю Proxmox, если подсети нет?

В каждой машине уже есть один IPv4. Этот адрес остаётся на хосте и служит целью SSH. Гостю, которому нужен собственный публичный адрес, берут ещё один: продажа поштучно, $2 в месяц, не больше 255 дополнительных. Это не префикс, который режут на части. Гость несёт один такой адрес как /32. Если дополнительных адресов нет, остаётся проброс порта.

Мост vmbr0 или NAT — по числу адресов

Общие руководства сначала показывают две картинки: посадить гостя на vmbr0 или включить NAT на хосте. Обе поднимают гостя. На этой машине выбор идёт от списка адресов. Консоль может положить несколько адресов в одну строку, через запятую, пробел или точку с запятой. После разрезания первый адрес — адрес управления, и SSH использует только его. Следующие можно отдать гостям.

Включённый адрес не может одновременно быть входом на хост и единственным публичным адресом гостя. Снять его с vmbr0 и отдать гостю значит потерять SSH к хосту. Каждый дополнительный адрес принадлежит одному гостю. Когда число дополнительных равно нулю, гость держит частный адрес, а снаружи входят через выбранный порт адреса управления. Это NAT. Когда дополнительные адреса есть, гость не садится на vmbr0 внутри префикса, которого в заказе нет. Внутренний мост без физического порта несёт каждый адрес как /32.

vmbr0Только адрес управления
/32Каждый дополнительный
ПробросКогда ничего не добавляли
Адреса заказаМост гостяКак гость выходит наружу
Только адрес управленияВнутренний vmbr1Частный адрес, порты пробрасывает хост
IPv4, купленные по одномуТот же vmbr1Один публичный адрес, маска /32
/28 или /29 из руководстваТак не подключатьВ этом заказе такого префикса нет

Какое имя или сертификат получает какой адрес — отдельная заметка: раздать каждый дополнительный адрес. Здесь только путь до гостя Proxmox.

Адрес управления остаётся на хосте

При заказе выбирают Proxmox VE 8 или Proxmox VE 9. Оба образа есть в списке систем. После выдачи SSH идёт на адрес управления. USB-установщик в эту цепочку не входит, и сетевую карту в установщике заново не выбирают.

Живое состояние читают до правки файлов. В ip -4 addr адрес, по которому открыт SSH, стоит на vmbr0. В ip route show default шлюз — адрес после via, а dev называет vmbr0. Эта пара уже положена образом. Префикс не обязан быть /32. Его оставляют. Не переписывают в /24 или /28 из руководства. Физический порт — имя, уже записанное в bridge-ports у vmbr0 в /etc/network/interfaces. Не подставлять eth0 или ens3, если ip link такого имени не показывает.

Дополнительный адрес иногда уже висит алиасом на том же мосте, иногда есть только в записи о выдаче. Считают IPv4 глобальной области. Число равно 1 плюс количество дополнительных в заказе. Если не сходится, останавливаются и открывают заявку. Адрес чужой машины не занимают. Когда счёт сошёлся, из конфигурации хоста убирают адреса, которые уйдут гостям, и оставляют адрес управления. Один адрес не может быть алиасом хоста и адресом гостя. Входящий трафик попадал бы на хост, а служба внутри гостя ничего бы не видела.

Адрес, префикс и шлюз vmbr0 не меняют. Неверный адрес управления обрывает эту SSH-сессию. Графический вход консоли от этого SSH не зависит; сломанный файл правят оттуда. Шаги ниже не трогают адрес управления на vmbr0.

Почему руководство про подсеть поднимает гостя и затем его запирает

Общее руководство предполагает, что площадка уже положила целый префикс на vmbr0, а шлюз — первый адрес этого префикса. Гость берёт другой адрес и копирует маску хоста. Карта выглядит включённой, потому что адрес записан на интерфейс. На выходе гость считает шлюз достижимым по каналу и шлёт ARP. Этого префикса на машине нет, ответа нет, маршрут по умолчанию не становится рабочим. Снаружи гость включён, а порт закрыт.

Другая редакция сажает гостя на vmbr0, вписывает дополнительный IPv4, копирует шлюз хоста и оставляет маску /24 или /28. Дополнительные адреса — отдельные адреса. Это не префикс для нарезки. Вышестоящая сеть отдаёт их этой машине, а не MAC гостя, который спрашивает шлюз. ARP гостя на vmbr0 не доходит до настоящего следующего узла, либо ответ всё ещё падает на старый алиас хоста. Адрес виден. ping наружу не уходит.

Третье наложение включает исходный NAT, пока гость считает публичный адрес своим. Исходящие пакеты переписываются на адрес управления, и ответ больше не совпадает с сессией гостя. Адрес, который должен оставаться отдельным, исходный NAT не проходит. Гость, к которому входят пробросом порта, публичный адрес тоже не получает. Две формы один адрес не делят.

Каждый дополнительный адрес уходит /32 на внутренний мост

Внутренний мост называется vmbr1. Физического порта у него нет. Он связывает только хост и гостей. Его дописывают в конец /etc/network/interfaces. Частную сеть можно сменить, но хост и гость её разделяют. Если 10.10.10.0/24 уже занят, берут другую. 203.0.113.20 ниже — адрес из документации. Его заменяют дополнительным адресом заказа, по одному маршруту на адрес.

Станза хоста содержит auto vmbr1, address 10.10.10.1/24, bridge-ports none, bridge-stp off и bridge-fd 0. Каждый дополнительный адрес добавляет post-up ip route add 203.0.113.20/32 dev vmbr1. via на адрес гостя, которого ещё нет, не ставят. Когда маршрут смотрит в мост, гость с этой /32 отвечает на ARP внутри моста.

Пересылку и проверку обратного пути кладут в /etc/sysctl.d/99-guest-route.conf, затем sysctl --system. Строки: net.ipv4.ip_forward=1, net.ipv4.conf.all.rp_filter=2 и тот же rp_filter=2 на vmbr0 и vmbr1. Без пересылки хост видит гостя, а гость наружу не выходит. Строгая проверка обратного пути этот трафик отбрасывает: дополнительный адрес живёт на госте, ответ уходит через vmbr0, и строгий режим решает, что источник этому выходу не принадлежит. Мягкий режим закрывает только эту проверку. Межсетевой экран он не заменяет.

Файл применяют командой ifreload -a. Затем в уже открытой SSH-сессии выполняют команду и подтверждают, что адрес управления всё ещё на vmbr0. ip route get 203.0.113.20 должен показать dev vmbr1. Маршрут, добавленный только в текущей оболочке и не записанный в файл, после перезагрузки пропадает, и гость снова заперт.

В Proxmox мост сетевой карты гостя — vmbr1, модель VirtIO. Переключателя NAT на этой карте нет. У гостя публичный адрес стоит как /32, точка-точка и шлюз по умолчанию равны 10.10.10.1. Файл interfaces в стиле Debian использует address 203.0.113.20/32, pointopoint 10.10.10.1 и gateway 10.10.10.1. Netplan в Ubuntu использует ту же /32, маршрут по умолчанию via 10.10.10.1 и on-link: true. Одни поля Cloud-Init в Proxmox с /32 и шлюзом часто пропускают маршрут по каналу, и гость снова шлёт ARP к шлюзу, которого на канале нет. Пишут сетевой файл гостя, перезапускают гостя, читают ip route.

Гость, которому нужна собственная публичная личность, берёт один дополнительный адрес. Следующий гость берёт следующий, всё на том же vmbr1, плюс ещё один маршрут /32. Несколько гостей в выдуманный /28 не сажают. На госте ip route get 1.1.1.1 должен показать src как публичный адрес, а не 10.10.10.2. Если источник всё ещё частный, снаружи виден адрес управления, и этот шаг не закончен.

Исходный NAT на этот публичный адрес не вешают. Исходный NAT относится к следующему разделу, где у гостя нет дополнительного адреса. Когда публичный адрес уже на госте, хост только пересылает.

Без дополнительного адреса пробрасывают только порты

Когда число дополнительных равно нулю, публичный адрес на гостя не ставят. vmbr1 по-прежнему 10.10.10.1/24. Гость берёт адрес из этой сети, например 10.10.10.2/24, шлюз 10.10.10.1. Собственной публичной личности у гостя нет. Службу на госте открывают, пробрасывая порт адреса управления на этот частный адрес.

Правила кладут в post-up станзы vmbr1 на хосте, чтобы они пережили перезагрузку. Вход: iptables -t nat -A PREROUTING -d ADMIN -p tcp --dport 443 -j DNAT --to-destination 10.10.10.2:443. Выход: iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o vmbr0 -j MASQUERADE. На Proxmox VE 8 и 9 эти команды идут через iptables-nft. Перед -A проверяют -C и не добавляют правило, если оно уже есть. Иначе каждый ifreload копит копию.

TCP 22 адреса управления не пробрасывают. Это SSH хоста. Сайты, API и удалённый рабочий стол гостя берут другой внешний порт. Гостю Windows, которому нужен RDP, можно отдать выбранный порт адреса управления на 3389 этого гостя. Порт 22 хоста остаётся. Служба внутри гостя должна слушать частный адрес или все адреса. Если она слушает только публичный адрес, которого нет, пробросу некуда попасть.

Проброс портов не добавляет адресов и не поднимает скорость порта. 250M, 1G и 2G — другая строка, и ни одна не считает объём. Десять гостей, выходящих через адрес управления, снаружи всё ещё показывают этот один источник. Когда список допуска требует отдельный источник на службу, возвращаются к предыдущему разделу и покупают адреса по одному. Правила проброса подсеть не создают.

Три проверки снаружи площадки

  1. Адрес управления всё ещё открывает сессию

    С офисной или домашней сети SSH идёт на первый адрес. Сессия попадает на хост, не на гостя. Всю строку из консоли в SSH не вставляют.

  2. Каждый дополнительный адрес приходит на своего гостя

    Открывают настоящую службу на каждом дополнительном адресе, который должен отвечать. На хосте ip route get указывает на vmbr1. У гостя ip -4 addr показывает /32. curl адреса хоста с самого хоста часто остаётся на петле и про внешний путь ничего не говорит.

  3. Без дополнительного адреса проверяют порт

    Снаружи проброшенный порт должен ответить от гостя. Порт 22 хоста должен ответить от хоста. Оба должны пройти. Проброс не должен был заменить вход.

  4. Перечитать после перезагрузки

    Хост перезагружают. Адрес управления, внутренний мост, маршруты /32 или пробросы должны остаться. sysctl net.ipv4.ip_forward равен 1. Если чего-то нет, правят файл interfaces. Команду в этой сессии заново не набирают как замену файла.

Если адрес и маршрут верны, а внешний путь всё ещё закрыт, смотрят межсетевой экран. При включённом экране дата-центра или узла цепочка forward может отклонять по политике по умолчанию. Чтобы проследить путь, экран одной этой карты гостя можно выключить. Когда путь открыт, разрешают точные порты. Фильтр всего хоста пустым как сокращение не оставляют.

Внутри гостя карта может называться ens18 или eth0. Берут имя из ip link этого гостя. Неверное имя значит, что адрес не появился, и команда маршрута не скажет, что не хватает подсети. Сначала подтверждают, что интерфейс поднят, затем что следующий узел маршрута по умолчанию — 10.10.10.1.

Число адресов и месячная плата идут вместе

Каждый дополнительный IPv4 стоит $2 в месяц. Заказ хранит число, не длину префикса. Четыре адреса добавляют $8 в месяц. Двадцать добавляют $40 в месяц. Вместе с включённым адресом всего не больше 256. Эти адреса входят в месячную плату вместе с машиной, дисками, скоростью порта и системой, затем применяется число месяцев. Квартал — три месячные платы, полгода — шесть, год — двенадцать. Дополнительной скидки нет. Плата за установку отсутствует.

Машина на 128 ГБ стоит $455 в месяц и уже включает один IPv4 и 250M. Машина на 256 ГБ стоит $612 в месяц, с тем же правилом адресов. Обе — AMD EPYC 7543P, 32 ядра и 64 потока, память DDR4-3200 ECC RDIMM. 256 ГБ — это эта модель, а не память, добавленная к машине на 128 ГБ. Ступень памяти больше адресов не включает. Перевод порта на 1G добавляет $248 в месяц и число адресов не меняет.

Машина размещена в Токио, Япония. SSH к хосту использует адрес управления из консоли. Гость Windows использует RDP на этом госте. Это не замена адреса управления хоста. Proxmox VE 8 и 9 входят в список бесплатных образов и выдаются установленной системой, а не отдельным носителем установки.

Каждый дополнительный адрес уходит как /32.

От $455 / мес.