Am un server găzduit de hetzner cu o singură adresă IP publică care rulează proxmox și unele VM. Această adresă IP este configurată în /etc/interfaces astfel:
auto enp35s0
iface enp35s0 inet static
adresa {{my-public-ip}}/{{subnet}}
gateway {{hetzner-gateway}}
up route add -net {{hetzner-ip}} netmask 255.255.255.192 gw {{hetzner-gateway}} dev enp35s0
Această configurație a fost realizată de hetzner.
Pentru că nu vreau să obțin adrese IP suplimentare de la hetzner, maschez acel ip pentru o rețea VM internă:
auto vmbr0
iface vmbr0 inet static
adresa 172.16.0.1/24
bridge-ports niciunul
bridge-stp off
punte-fd 0
ecou post-up 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
Cu aceasta, VM-urile mele au acces la internet și pot ajunge unul la altul.
Deoarece iptables port forwarding este un pic prea complicat pentru mine, am început să folosesc firewalld. Acolo am interfața mea enp35s0 atribuită zonei externe și vmbr0 de încredere. Știu că poate ar trebui să-l atribui la intern, dar în prezent nu prea face o diferență (sau cred că da în cazul meu problema).
Acum am un serviciu care rulează într-un VM cu ip 172.16.0.3 pe portul 38080. Pentru a ajunge la acest serviciu, adaug o regulă de redirecționare a portului în firewalld: port=38080:proto=tcp:toport=38080:toaddr=172.16.0.3
. Cu asta pot ajunge la acel serviciu din afara acestui server.
Problema acum este că, dacă folosesc un software precum uptime-kuma și îl rulez și în interiorul unui VM pe aceeași mașină fizică, nu pot ajunge la acel serviciu pe portul 38080, deoarece redirecționarea portului se face doar pentru solicitări externe. Important aici este că numele de gazdă pe care îl folosește uptime-kuma este FQDN-ul care se rezolvă la adresa IP publică a mașinii mele gazdă.
Deci, pentru a face acest lucru posibil, adaug aceeași regulă de redirecționare a portului în zona de încredere a firewalld, deoarece interfața mea vmbr0 este acolo și de la acea interfață vine cererea.
Acum această conexiune funcționează și software-ul meu (uptime-kuma) poate ajunge la serviciul meu.
Problema mare acum este că FIECARE cerere din interiorul rețelei virtuale care dorește să folosească portul 38080 este redirecționată către acel VM (172.16.0.3), chiar și cele care merg la un server complet diferit.
Cum pot spune firewalld să redirecționeze acel trafic numai dacă cererea a fost de fapt direcționată către mașina gazdă?