pf: vom internen Netz aus auf die WAN-IP zugreifen

Sickboy

Müßiggänger
Hallo allerseits,

eine Maschine mit FreeBSD 11 dient als Internet-Server und DHCP-Server für Clients. Die Clients kommen auch ins Internet und können auf die Jails des Servers zugreifen. Die Clients haben aber keinen Zugriff auf den FQDN oder die WAN-IP des Servers. Mein erfolgloser Versuch mit pf sieht wie folgt aus:
Code:
# Variables
ALL_IF      = "{ jail0, igb0, igb1 }"
EXT_IF      = "igb0"
INT_IF      = "igb1"
JAIL_IF     = "jail0"

WAN_IP      = "1.2.3.4"
EXT_IP      = "192.168.100.1"
INT_IP      = "192.168.0.1"

INT_NET     = "192.168.0.0/24"
JAIL_NET    = "10.0.0.0/24"

PROXY_JAIL  = "10.0.0.1"
PKG_JAIL    = "10.0.0.2"
WWW_JAIL    = "10.0.0.3"

# [...]

# NAT
nat pass on $EXT_IF from $JAIL_NET to any -> $EXT_IF
nat pass on $EXT_IF from $INT_NET to any -> $EXT_IF

# Klappt leider nicht:
rdr pass on $INT_IF inet proto tcp from any to $WAN_IP port http -> $EXT_IP port http

Ich habe versucht, einen ähnlichen RDR-TO zu schreiben, wie er in der OpenBSD-FAQ steht. Klappt aber leider nicht.
 
Die WAN-IP hängt am Interface igb0. Das ist die IP, über die der Server per DNS erreichbar ist.
 
Hmm, wenn der Host als Router fungiert (sysctl net.inet.ip.forwarding=1) sollte eine Umleitung per rdr gar nicht nötig sein, der Router müsste dann auf jede IP-Adresse antworten, die er auf beliebigen Interfaces hat. Bist du sicher, dass ein Dienst auf der WAN-IP lauscht? Geht ping auf die WAN-IP?

Rob
 
Nein, ping geht innerhalb des Subnetzes nicht auf die WAN-IP. Die Dienste lauschen alle auf der EXT-IP bzw. auf der jeweiligen Jail-IP. Das Problem ist wie gesagt:
Code:
Client im INT_IP:network ==> Server ==> DNS =/=> WAN-IP
was aber geht:
Client ==> Server
 
Leider sieht man nicht, was du sonst noch für Regeln aktiv hast. Geht es denn, wenn du pf komplett deaktivierst?

Rob
 
Nein, wenn ich pf stoppe, funktioniert es trotzdem nicht. Der Server ist selbst noch mal innerhalb eines Subnetzes, nämlich dem
192.168.100.0/24 und kommt über Gateway und DNS des übergeordneten Netzwerkes ins Internet.
 
Ich dachte der Server hat selbst WAN? Was ist die default route des Servers und wie ist sie auf den Clients?
Du hast in meinen Augen schlicht Routingprobleme.

Rob
 
Nee, der Server hat kein WAN, der hängt im Intranet. Die default route ist 192.168.100.1, die o.g. EXT_IP ist eigentlich 192.168.100.6 (habe ich der Übersicht halber im Beitrag geändert. Jetzt ist es noch verwirrender ^_^):
Code:
ALL_IF = "{ jail0, igb0, igb1 }"
EXT_IF = "igb0"
INT_IF = "igb1"
JAIL_IF = "jail0"

WAN_IP = "1.2.3.4"
EXT_IP = "192.168.100.6" # 192.168.100.1 ist der Gateway
INT_IP = "192.168.0.1"

INT_NET = "192.168.0.0/24"
JAIL_NET = "10.0.0.0/24"

PROXY_JAIL = "10.0.0.1"
PKG_JAIL = "10.0.0.2"
WWW_JAIL = "10.0.0.3"

Vom Intranet-Router wird die WAN-IP auf die EXP-IP des Servers weitergeleitet. Die WAN-IP ist dann beim DNS eingetragen für die Domain.

Die default route der Clients ist 192.168.0.1, weil sie ja an INT_IP hängen.
 
Also ist die WAN-IP NICHT an igb0 gebunden. Dennoch, kleiner Hinweis: Wenn jetzt ein Paket von 192.168.0.0/24 bei der 192.168.100.1 ankommt - woher weiß der Gateway, wohin er seine Antwort schicken soll? Sicherlich hat er keine Route dafür gesetzt und versucht sein default gw, was damit auch nix anfangen kann.

Rob
 
Ich verstehe. Dann hatte ich wohl eine falsche Vorstellung, dass ein Paket einfach im Kreis wandert:INT_IP, EXT_IP, Gateway, DNS, Gateway, EXT_IP, INT_IP.
 
Mal doch mal ein Diagramm. Da blickt doch keine Sau durch.

Angenommen:

Code:
a.b.c.d [router] 192.168.1.1/24 --- 192.168.1.2 [server]
                                 `- 192.168.1.3 [client]

a.b.c.d     - WAN IP auf $ext_if
192.168.1.1 - LAN IP auf $int_if

Dann funktioniert normalerweise Folgendes auf dem Router (grob umrissen, auf OpenBSD):

Code:
pass in on $int_if from ($int_if:network) to ($ext_if) port xyz rdr-to $server tag NAT_REFLECT
pass out on $int_if tagged NAT_REFLECT nat-to ($int_if)

Nachteil: die Requests sehen aus, als kämen sie vom Router. Wenn der Server jedoch ein eigenes Netz hat, reicht ein normales rdr-to ohne NAT.

So oder ähnlich müsste das auch auf dein Setup übertragbar sein.

PS: Ich gehe davon aus, dass die state-policy auf (if-bound) steht. Mit diesen floating states habe ich keine Erfahrung, weil ich immer alles explizit pro Interface festlege.
 
Okay, ich habe es mal aufgezeichnet:

pf.png


Jails und Clients können nicht auf die WAN-IP zugreifen. Also muss die Route durch den Router festgelegt werden, und nicht durch den Server?
 
Ich würde versuchen, den Router (1.2.3.4) in den Bridge-Mode zu schalten. Dann ist die IP (1.2.3.4) auf dem Interface igb0.
 
Ich würde versuchen, den Router (1.2.3.4) in den Bridge-Mode zu schalten. Dann ist die IP (1.2.3.4) auf dem Interface igb0.

Damit hättest du zumindest eine chance - dank des doppel-nats wird das sonst nicht gehen, da der "Internet-Server" ja selber garnicht die WAN IP hat. Und der router wird keine Pakete aus dem internen-netz irgendwie nochmal per nat in das interne umleiten. Ausserdem würdest du das doppel-nat loswerdenm villeicht auch nicht so schlecht :)
 
Vielen Dank für eure hilfreichen Kommentare. Ich spreche am Montag mal mit einem der Administratoren aus dem Rechenzentrum.
 
Warum geht der Redirect auf $EXT_IP und nicht zum Jail?

Du kannst diese NAT reflection auch auf dem Router machen, aber auf dem Server müsste es auch funktionieren.
 
Natürlich nicht. NAT wird bei _eingehenden_ Paketen auf dem externen Interface gemacht. Das Paket kommt aber auf dem internen Interface rein und ist dann schon am Ziel.

PS: Geht ein einfacher Redirect auf dem internen Interface direkt zur Jail-IP-Adresse?
 
Zurück
Oben