PF / Weiterleitung an jail im Netzwerk will einfach nicht funktionieren

pbtraveller

Well-Known Member
Hi,
ich habe eine APU2 mit Freebsd 14.1 als router. Die Kiste ist über pppoe mit dem Internet verbunden, d.h. tun0 ist das Wan interface. Die übrigen sind per bridge0 für das LAN zusammengefasst. An dem LAN hängt ein anderer Rechner (ebenfalls freebsd 14.1) auf dem eine Jail mit meiner Nextcloud läuft.

Leider habe ich irgend ein Fehler in der Firewall und stehe gerade auf dem Schlauch.
Das portforwarding (rdr) funktioniert. Wenn ich das "block all" rausnehme, komme ich von außen auf Nextcloud. Gleiches gilt, wenn ich ein pass in on $wan ganz am Ende hinzufüge, d.h. alles auf $wan reinlasse. Es muss also mit meiner section "Allow incoming WAN traffic for port-forwarded services (SSH, HTTPS, HTTP)" zu tun haben. Was mache ich falsch? Hier der Auszug der pf.conf

wan = "tun0" # WAN interface (PPPoE)
lan = "bridge0" # LAN interface (bridge)
ssh_port = "22" # Port for SSH
jail_ip = "192.168.1.28" # Jail IP address
server_big = "192.168.1.2" # Big server IP

# --- Normalization and State Keeping ---
set skip on lo0 # Skip filtering on loopback interface
scrub in all

# --- NAT ---
# Enable NAT for LAN devices going out on WAN interface
nat on $wan from $lan:network to any -> ($wan)

# SSH Port Forwarding (Forward SSH traffic to server_big)
rdr on $wan proto tcp from any to $wan port $ssh_port -> $server_big port $ssh_port

# HTTPS and HTTP Port Forwarding (Forward to jail)
rdr on $wan proto tcp from any to $wan port 443 -> $jail_ip port 443
rdr on $wan proto tcp from any to $wan port 80 -> $jail_ip port 80

# --- Rules ---
# Block all by default
block all

# Allow traffic on the loopback interface (already skipped)
pass quick on lo0

# Allow outgoing traffic from LAN to any
pass out on $lan from $lan:network to any keep state

# Allow incoming WAN traffic for port-forwarded services (SSH, HTTPS, HTTP)
pass in on $wan proto tcp from any to $wan port $ssh_port keep state
pass in on $wan proto tcp from any to $wan port 443 keep state
pass in on $wan proto tcp from any to $wan port 80 keep state

# --- Allow Port-Forwarded Traffic to Reach Internal Jail ---
# Allow forwarded traffic on LAN to reach jail IP on port 443 and 80
pass in on $lan proto tcp from any to $jail_ip port {80, 443} keep state

# --- FaceTime Related Rules ---
# Allow Apple Push Notification (APNs) for FaceTime signaling
pass in on $wan proto tcp from any to $wan port 5223 keep state

# Allow STUN/TURN for FaceTime (UDP 3478-3497)
pass in on $wan proto udp from any to $wan port 3478:3497 keep state

# Allow RTP media streaming for FaceTime (UDP 16384-16387 and 16393-16402)
pass in on $wan proto udp from any to $wan port 16384:16387 keep state
pass in on $wan proto udp from any to $wan port 16393:16402 keep state

# Allow incoming traffic on LAN
pass in on $lan keep state

# --- Pass out ---
# Allow established and related connections for outgoing traffic
pass out on $wan proto { tcp, udp, icmp } all keep state


Vielen Dank und viele Grüße

pbtraveller
 
Sowas sollte funktionieren:

Code:
...
pass in on $wan proto tcp from any to any port { 80 443 } rdr-to $jail_ip
...
 
Vielen Dank. Leider bekomme ich die Fehlermeldung /etc/pf.conf:42: syntax error.
Vielleicht ist der Syntax auf OpenBSD und FreeBSD dort etwas anders (meine mich zu erinnern, dass freebsd ne ältere Version verwendet). Ist das aber nicht auch genau das gleiche, was ich bereits gemacht hab, nur als eine Regel zusammengefasst?
 
Ahja da war was mit den unterschiedlichen Versionen und Syntax. :-)

Ich habe auf meinem OpenBSD-Server mehrere VMs laufen und komme so von extern in die VM. Von daher dachte ich, dass das so in der Art auch bei dir funktionieren sollte.
 
Code:
rdr on $wan_if inet proto tcp from any to $wan_if port { 80 443 } -> $httpd_ip
# ...
pass in quick on $wan_if inet proto tcp from any to $httpd_ip port { 80 443 }
So habe ich das in meiner pf.conf unter FreeBSD.


Edit:
Ich bin noch mal deine Regeln durch gegangen.
Mit dem rdr änderst du die Ziel-Adresse und die Regel pass in on $wan proto tcp from any to $wan port 443 keep state trifft damit dann nicht zu, weil das Ziel nicht mehr $wan ist, sondern $jail_ip.
Und pass in on $lan proto tcp from any to $jail_ip port {80, 443} keep state trifft auch nicht, weil der Traffic auf $wan liegt.
 
Code:
rdr on $wan_if inet proto tcp from any to $wan_if port { 80 443 } -> $httpd_ip
# ...
pass in quick on $wan_if inet proto tcp from any to $httpd_ip port { 80 443 }
So habe ich das in meiner pf.conf unter FreeBSD.


Edit:
Ich bin noch mal deine Regeln durch gegangen.
Mit dem rdr änderst du die Ziel-Adresse und die Regel pass in on $wan proto tcp from any to $wan port 443 keep state trifft damit dann nicht zu, weil das Ziel nicht mehr $wan ist, sondern $jail_ip.
Und pass in on $lan proto tcp from any to $jail_ip port {80, 443} keep state trifft auch nicht, weil der Traffic auf $wan liegt.


Das Macht natürlich Sinn. Hatte vorher kurz dran gedacht, dann bei nicht versucht. D.h. Es ist wie bei NAT. Werde es al so umsetzen und dann ausprobieren...
 
Habe gerade gesehen, dass ich in der letzten Fassung das Ziel schon rausgenommen hatte. Meine aktuell reduzierte Konfiguration sieht wie folgt aus:
Code:
wan = "tun0"          # WAN interface (PPPoE)
lan = "bridge0"       # LAN interface (bridge)
ssh_port = "22"       # Port for SSH
jail_ip = "192.168.1.28"  # Jail IP address
server_big = "192.168.1.2" # Big server IP

# --- Normalization and State Keeping ---
set skip on lo0    # Skip filtering on loopback interface
scrub in all

# --- NAT ---
# Enable NAT for LAN devices going out on WAN interface
nat on $wan from $lan:network to any -> ($wan)


rdr on $wan inet proto tcp from any to $wan port { 80 443 } -> $jail_ip


# --- Rules ---
# Block all by default
block all

# Allow traffic on the loopback interface (already skipped)
pass quick on lo0

# Allow outgoing traffic from LAN to any
pass out on $lan from $lan:network to any keep state

pass in quick on $wan inet proto tcp from any to $jail_ip port { 80 443 }


# Allow incoming traffic on LAN
pass in on $lan keep state
pass out on $lan keep state

# --- Final Rules ---
# Allow established and related connections for outgoing traffic
pass out on $wan proto { tcp, udp, icmp } all keep state


wenn ich per
pftop -f "dst host 192.168.1.28 and proto tcp"

versuche den Traffic anzuzeigen sehe ich genau 0.

So langsam bin ich echt ratlos. Nur wenn ich am ende allen traffic wie folgt rein und rauslasse funktioniert es, aber das ist ja nicht der Sinn der Sache.
Code:
pass in on $wan keep state
pass out on $wan keep state
pass in on $lan keep state
pass out on $lan keep state

Habt ihr noch ne Idee?
 
Zuletzt bearbeitet von einem Moderator:
Kannst du bitte Code-Blocks für die Config benutzen? Ohne fällt mir das Lesen der Regeln eher schwer.
 
pass in on egress inet proto tcp from any to (egress) port { 80 443 } rdr-to 192.168.17.2

Das hier hab ich als alten kommentar in meiner Config gefunden (OpenBSD) - villeicht hilft es?

Evtl. liegts auch an der reihenfolge?
 
Du könntest bei den block-Regeln noch "log" hinzufügen und dann mit tcpdump auf dem pflog-Device lauschen und nachschauen, was und warum da geblockt wird.
 
Zusaetzlich koenntest Du evtl. nochmal folgende Ausgaben hier posten:

# pfctl -s rules und # pfctl -vvs rules

Und wenn Du das Logging aktiviert hast, waere auch noch # tcpdump -lnettti pflog0 hilfreich.
 
uralt syntax .. und verhalten.. das Thema "naechste Regel passt nicht mehr zum umgeschriebenen packet" laesst sich
mit rdr pass erschlagen. (das funktioniert dann wie modern pass ... rdr-to.
Ganz generell ist in nat/rdr Land auch first-match-wins, also die rdr vor den nat Regeln, sonst passt das wieder nicht (spaetestens auf dem Rueckweg)
 
uralt syntax .. und verhalten.. das Thema "naechste Regel passt nicht mehr zum umgeschriebenen packet" laesst sich
mit rdr pass erschlagen. (das funktioniert dann wie modern pass ... rdr-to.
Ganz generell ist in nat/rdr Land auch first-match-wins, also die rdr vor den nat Regeln, sonst passt das wieder nicht (spaetestens auf dem Rueckweg)
Danke, das war es!
 
ja gerne. Here it is
Code:
wan = "tun0"          # WAN interface (PPPoE)
lan = "bridge0"       # LAN interface (bridge)
ssh_port = "2020"       # Port for SSH
jail_ip = "192.121.88"  # Jail IP address
server_big = "192.168.1.2" # Big server IP

martians = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
              10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
              0.0.0.0/8, 240.0.0.0/4 }"

afp_port = "548"


# --- Normalization and State Keeping ---
set skip on lo0    # Skip filtering on loopback interface
set skip on $lan
scrub in all
#antispoof for $wan

# --- NAT ---
# Enable NAT for LAN devices going out on WAN interface

rdr pass on $wan inet proto tcp from any to ($wan) port { 80 443 } -> $jail_ip
nat on $wan from $lan:network to any -> ($wan)


# --- Rules ---
# Block all by default
block all

antispoof for $wan
block drop in quick on $wan from $martians to any
block drop out quick on $wan from any to $martians
block drop out quick on $wan proto tcp from $lan:network to any port $afp_port


# --- FaceTime Related Rules ---
# Allow Apple Push Notification (APNs) for FaceTime signaling
pass in on $wan proto tcp from any to $wan port 5223 keep state

# Allow STUN/TURN for FaceTime (UDP 3478-3497)
pass in on $wan proto udp from any to $wan port 3478:3497 keep state

# Allow RTP media streaming for FaceTime (UDP 16384-16387 and 16393-16402)
pass in on $wan proto udp from any to $wan port 16384:16387 keep state
pass in on $wan proto udp from any to $wan port 16393:16402 keep state



# Allow outgoing traffic from LAN to any
pass out on $lan from $lan:network to any keep state


# --- Final Rules ---
# Allow established and related connections for outgoing traffic
pass out on $wan proto { tcp, udp, icmp } all keep state


Das Problem das ich jetzt noch habe ist, dass pf beim Start irgendwie die Regeln noch nicht lädt. mache ich ein /etc/rc.d/pf restart oder reload erfolgt das ohne Probleme.

Berechtigung für pf.conf ist
Code:
-rwxr-xr-x  1 root wheel 1725 Nov 13 15:42 /etc/pf.conf

und meine rc.conf hat folgenden Eintrag:

Code:
pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"


jemand ne Idee, woran das liegt?
 
Mal geraten, aber eventuell ist beim Start von PF das Interface noch nicht "up" und damit schlägt das ganze fehl?
Denke da insbesondere an das PPPoE-Interface.
 
Ich würde auch vermuten, dass da ein interface noch nicht up ist. PPPoE oder das Jailgebimse "192.121.88" sind da typische Kandidaten.
 
Zurück
Oben