Hairpin NAT

crotchmaster

happy BSD user
Moin in die Runde,

ich brauche mal Hilfe zu Hairpin NAT.

Ich habe eine Maschine mit FreeBSD 14.3 die seinen Sack voll Jails hat, die private IP-Adressen haben. Nur ein Jail ist von außen über https erreichbar. In diesem Jail läuft ein Caddy als Reverse Proxy, der je nach angefragter Domain die Requests auf die Jails verteilt. Das funktioniert von außen auch.
Von den Jails auf der gleichen Maschine geht das nur über die interne IP-Adresse des Caddy Jails. Dafür muss ich extra einen lokalen unbound betreiben, der für die Jails alle FQDNs des Caddy Jails auf die private IP-Adresse des Caddy Jails auflöst. Das ist irgendwie unschön und fehlerträchtig.

Ich hatte nun gelesen, dass man das auch mit Hairpin NAT hinbekommt. Ein Jail kommuniziert über die externe IP-Adresse des Caddy Jails mit dem Reverse Proxy, dabei wird der Request auf die externe IP-Adresse genatet und dann über ein Portforwarding ins Caddy Jail weitergeleitet.
Nur leider sind dafür meine PF Kenntnisse zu limitiert. Ich habe natürlich danach gesucht, aber bisher kein funktionierendes Beispiel gefunden. ChatGPT konnte auch nicht weiterhelfen.

Hat jemand das schon mal hinbekommen?
 
Keine Ahnung, ob das mit pf überhaupt geht, aber mit ipfw ist es halbwegs elegant möglich. Dessen NAT ist ist wesentlich flexibler, weil es an jeder beliebigen Stelle in den Fluss der Pakete eingefügt werden kann. Das ist nun ungetestet und zugegeben eventuell nicht so leicht nachvollziehbar, aber für den Anfang: Der in https://docs.freebsd.org/en/books/handbook/firewalls/#in-kernel-nat vorgestellte Regelsatz müsste einfach erweitert werden können. Regeln 99 - Reassemblieren der Pakete - wird auf Regel 90 umbenannt. Damit hat man vor dem eingehenden NAT zehn Regeln frei. In eine davon, zum Beispiel 95, wird eine weitere Regel eingefügt, die auf dem LAN eingehende Pakete ins NAT schiebt. In etwa $cmd 095 nat 1 ip from any to any via $LANIF. Wobei $LANIF das Interface in Richtung LAN ist. Regel 5, Ausschluss den LAN-Traffic, wird hinter die neu eingefügte NAT-Regel runtergezogen. Also Zum Beispiel auf Regel 95.

Wenn du Fragen hast, stelle sie gerne. Wie gesagt, dass liest sich schon für mich schwer nachvollziehbar und ich habe es mir gerade ausgedacht ;)
 
hairpin nat = redirect

pass in on IF inet from any to PublicIP port 443 rdr-to JailIP

Achtung ist Syntax ist OpenBSD PF ggf. man pages konsultieren da FreeBSD den altes
Syntax verwendet ( meines Wissens ),


Holger
 
Zurück
Oben