Eu tenho um servidor hospedado pela hetzner com um único endereço IP público que executa proxmox e algumas VMs. Este endereço IP é configurado dentro de /etc/interfaces assim:
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
Esta configuração foi feita por hetzner.
Como não quero obter endereços ip adicionais do hetzner, mascarei esse ip para uma rede VM interna:
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
Com isso minhas VMs têm acesso à internet e podem se comunicar.
Como o encaminhamento de porta do iptables é um pouco complicado para mim, comecei a usar o firewalld. Lá eu tenho minha interface enp35s0 atribuída à zona externa e vmbr0 a confiável. Eu sei que talvez eu deva atribuí-lo ao interno, mas atualmente isso realmente não faz diferença (ou acho que sim no meu caso de problema).
Agora tenho um serviço rodando dentro de uma VM com o ip 172.16.0.3 na porta 38080. Para acessar este serviço adiciono uma regra de encaminhamento de porta no firewalld:port=38080:proto=tcp:toport=38080:toaddr=172.16.0.3
. Com isso posso acessar esse serviço de fora desta máquina servidora. O problema agora é que, se eu usar um software como o uptime-kuma e executá-lo também dentro de uma VM na mesma máquina física, não consigo acessar esse serviço na porta 38080 porque o encaminhamento de porta é feito apenas para solicitações externas. Importante aqui é que o nome do host que o uptime-kuma usa é o FQDN que é resolvido para o endereço IP público da minha máquina host. Então, para tornar isso possível, adiciono a mesma regra de encaminhamento de porta à zona confiável do firewalld porque minha interface vmbr0 está lá e dessa interface vem a solicitação. Agora essa conexão funciona e meu software (uptime-kuma) pode acessar meu serviço.
O grande problema agora é que TODAS as requisições de dentro da rede virtual que querem usar a porta 38080 são redirecionadas para aquela VM (172.16.0.3), mesmo aquelas que vão para um servidor completamente diferente.
Como posso dizer ao firewalld para redirecionar apenas esse tráfego se a solicitação foi realmente direcionada à máquina host?