У меня есть сервер, размещенный hetzner, с одним общедоступным IP-адресом, на котором работает proxmox и некоторые виртуальные машины. Этот IP-адрес настроен внутри / etc / interfaces следующим образом:

auto enp35s0
iface enp35s0 inet static
    address {{my-public-ip}}/{{subnet}}
    gateway {{hetzner-gateway}}
    up route add -net {{hetzner-ip}} netmask 255.255.255.192 gw {{hetzner-gateway}} dev enp35s0

Эта конфигурация была сделана Хетцнером.

Поскольку я не хочу получать дополнительные IP-адреса от hetzner, я маскирую этот IP-адрес для внутренней виртуальной сети:

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

Благодаря этому у моих виртуальных машин есть доступ в Интернет и они могут связываться друг с другом.

Поскольку переадресация портов iptables для меня слишком сложна, я начал использовать firewalld. Здесь мой интерфейс enp35s0 назначен внешней зоне, а vmbr0 - доверенной. Я знаю, что, может быть, мне лучше назначить его внутренним, но в настоящее время это не имеет особого значения (или я так думаю в моем проблемном случае).

Теперь у меня есть служба, работающая внутри виртуальной машины с IP-адресом 172.16.0.3 на порту 38080. Чтобы получить доступ к этой службе, я добавляю правило переадресации портов в firewalld: port=38080:proto=tcp:toport=38080:toaddr=172.16.0.3. Благодаря этому я могу связаться с этой службой извне этой серверной машины. Проблема в том, что если я использую такое программное обеспечение, как uptime-kuma, и запускаю его также внутри виртуальной машины на том же физическом компьютере, я не могу связаться с этой службой через порт 38080, потому что переадресация порта выполняется только для внешних запросов. Здесь важно то, что имя хоста, которое использует uptime-kuma, - это полное доменное имя, которое разрешается в общедоступный IP-адрес моего хост-компьютера. Поэтому, чтобы сделать это возможным, я добавляю то же правило переадресации портов в доверенную зону firewalld, потому что мой интерфейс vmbr0 находится там, и от этого интерфейса исходит запрос. Теперь это соединение работает, и мое программное обеспечение (uptime-kuma) может связаться со мной.

Теперь большая проблема заключается в том, что КАЖДЫЙ запрос из виртуальной сети, который хочет использовать порт 38080, перенаправляется на эту виртуальную машину (172.16.0.3), даже те, которые отправляются на совершенно другой сервер.

Как я могу указать firewalld перенаправлять этот трафик только в том случае, если запрос действительно был нацелен на хост-машину?

answer

Таким образом, я не мог найти решение проблемы firewalld, но я нашел кое-что еще, что сделало правило переадресации портов в доверенной зоне ненужным. Добавив полное доменное имя, которое будет разрешено к общедоступному IP-адресу хоста, в файл / etc / hosts внутри виртуальной машины, мне больше не нужен переадресация порта, потому что он мгновенно подключается к себе снова (это то, что я хотел в первую очередь). Использование этих правил переадресации портов внутри доверенной зоны больше не требуется, и я могу снова использовать эти порты для внешних запросов.

Новый участник
TheAnachronism is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.