Frage bzgl Portweiterleitungen mit PF

Sebbo86

Member
Hallo!
Ich habe bereits zwei Abende mit googlen und lesen verbracht ohne dass das Problem behoben werden konnte und bitte um Hilfe.
Ich möchte mir einen NAT Router mit OpenBSD 4.9 einrichten und scheiter momentan an PF. Das NAT funktioniert einwandfrei, jedoch kriege ich keine Portweiterleitungen ans laufen, obwohl das normalerweise recht simpel sein soll....


Code:
# macros

int_if="rl0"
ext_if="tun0"
int_net="192.168.0.0/24"

tcp_services="{ 22, 113 }"
icmp_types="echoreq"

#server="192.168.0.20"

# options

set block-policy return
set loginterface $ext_if
set skip on lo

# match rules

match out on egress inet from !(egress) to any nat-to (egress:0)

# filter rules

block in log

antispoof quick for { lo $int_if }

pass in on egress inet proto tcp from any to (egress) \
    port $tcp_services

#pass in on $ext_if proto tcp from !$int_net to any port 80 rdr-to 192.168.0.20 port 80
#pass in quick on $ext_if proto tcp from any to $ext_if port 80 rdr-to 192.168.0.20 port 80
#pass out log on $ext_if proto tcp to any port 80
#pass in on egress inet proto tcp from any to egress port 80 rdr-to 192.168.0.20 port 80
#pass out on egress inet proto tcp from any to 192.168.0.20 port 80
#match in on egress inet proto tcp from any to any port 80 \
#    rdr-to 192.168.0.20
#pass in on egress inet proto tcp from any to 192.168.0.20 port 80
#pass out on $int_if inet proto tcp from any to 192.168.0.20 port 80



pass in inet proto icmp all icmp-type $icmp_types

pass in on $int_if

pass out quick

Die Auskommentieren PASS Anweisungen zeigen meine bisherigen Versuche. Ich habe von Firewalls bisher keine Ahnung und daher auch kein nennenswertes Verständnis. Ich möchte doch nur das Port 80 an den Server mit der IP 192.168.0.20 weitergeleitet wird. Als interne Schnittstelle dient rl0. An fxp0 hängt das DSL Modem, dessen DSL Verbindung per ppp -ddial pppoe aufgebaut wird. PF wird mit pfctl -e /etc/pf.conf gestartet. Als Quelle für oben stehende Konfiguration diente http://www.openbsd.org/faq/pf/example1.html

Warum funktioniert das nicht?
 
Da habe ich bereits geguckt und es auch schon mit
Code:
    pass in on tl0 proto tcp from any to any port 80 rdr-to 192.168.0.20
in allen denkbaren Varianten was Interfaces etc angeht versucht, es funktioniert jedoch nicht.
 
Zuletzt bearbeitet:
Ich mal habe deine Konfiguration mit meiner verglichen, der einzige Unterschied zu der meinigen sind ist in dieser Zeile:
Code:
pass in on egress inet proto tcp to (egress) port 80 rdr-to 192.168.0.20 port 80 synproxy state

Ich kann vor dem ersten Kaffee aber nicht beurteilen, inwieweit die runden Klammern signifikant sind. :cool:

Hast du denn z.B. mit tcpdump probiert, ob die Pakete an deinem externen Interface (hier z.B. vr1) ankommen?
Code:
tcpdump -i vr1 tcp and dst port 80
Was sagt denn das Logging beim Verbindungsaufbau an deine externe IP?
 
Zuletzt bearbeitet:
moin

de runden klammern um das interface besagt das pf die ip vom interface selber ausliest

hat gerade bei dynamischen ips vorteile ;)

also ein

Code:
match in on wan_if proto tcp from any to (wan_if) port 80 rdr-to 192.168.0.20 port 80

sollte gehen

holger
 
Es funktioniert leider immer noch nicht. Trotzdem schonmal danke für die Hilfe.

Mit tcpdump kann ich feststellen, dass die Pakete ankommen, allerdings nur an der tun0, nicht an der Netzwerkkarte fxp0 wo das Modem dranhängt.
 
Hi,

ich würde mal auf ne falsche Rule Reihenfolge tippen.
Prüf mal ob die Reihenfolge der Rulearten passt. Pi mal Bärenpfote müsste die rdr pass Konstruktion eigentlich vor de Filter kommen bzw. aufgeteilt der rdr davor und das pass bei de Filter.

Also wenn ich das recht im Bärenkopf han:
- Macros, Tabellen, Optionen, Scrub, Queueing, Translation, Filterregeln
(NAT vor Filter)


Gruß Bär
 
Zuletzt bearbeitet:
wenn tun0 verwendet wird muss natuerlich auch dieses als interface fuer pf verwendet werden

ich gehe dann davon mal aus das du pppoe mit dem pppd machst ?

wenn ja gebe ich mal als tip den kernel pppoe zu verwenden.( man 4 pppoe )


Code:
deny on tun0 all

match in on tun0 proto tcp from any to (tun0) port 80 rdr-to 192.168.0.20 port 80

man beachte auch die unterscheide bei match und pass

kurz gesagt match vereint die rdr und die allow regel in einem ( bis obsd 4.6 waren das 2 regeln ) oder man verwendet pass da funktioniert das aehnlich .



holger
 
Das mit dem Kernel pppoe habe ich auch schon probiert, was ebenfalls nicht funktioniert. Die ifconfig sagt immer nur "no carrier", muß pppd hingegen funktioniet die Verbindung einwandfrei.

Mit PF gibts es immernoch nichts neues.

Habe es mit
Code:
deny on tun0 all

match in on tun0 proto tcp from any to (tun0) port 80 rdr-to 192.168.0.20 port 80

portbiert, aber es geht nicht. Bei deny on sagt er Syntax Fehler. Das match in nimmt er ohne Fehlermeldung, funktionieren tut es aber nicht
Bzgl der Reihenfolge:
Ich habe das match u.A. direkt unter die nat Anweiung gesetzt ohne Erfolg.
 
beim kernel pppoe muss zuert ein
ifconfig ethernet interface up gemacht werden.
z.b. ifconfig em0 up

in /etc eine datei hostname.em0 inhalt up angelegt werden
danachtr klappt das auch mit mit den pppoe0 interface

das macht der pppd automatisch
das deny war nur als beispiel.

ist net.inet.ip.forwaring gesetzt ?
wenn tun0 up ist ( sprich verbindung hergestellt )
und dann pfctl -f /etc/pf.conf

geht es dann

normalerweise muss man die regeln , beim pppd, laden wenn die pppoe verbindung hergestellt ist.

das kann man per hand machen oder via ip-up und ip-down siehe man pppd

wie testest du den rdr ?

holger
 
Also bei mir hängt das DSL Modem an der fxp0.
im /etc Odner habe ich bereits eine hostname.fxp0 mit dem Inhalt up angelegt.

Für das pppoe habe ich im selben Ordner eine Datei namens hostname.pppoe0 mit dem Inhalt aus der man page. Selbstverständlich mit den richtigen Zugangsdaten^^
Stelle ich dann erst fpx0 up und dann pppoe0 zeigt ifconfig "no carrier" bei pppoe0.

Den rdr habe ich getestet indem ich kurzer Hand die zugewiesene IP im Browser eingegeben habe. So wie ich das verstehe sollte dann die Seite von 192.168.0.20 kommen.

Code:
192.168.0.20 <-------> 192.168.0.21 <-------> INTERNET
Webserver               OpenBSD Router

IP forwaring ist aktiviert in der /etc/sysctl.conf
net.inet.ip.forwarding=1

Was mir gerade aufgefallen ist:
In der rc.conf.local hab ich pf=NO drin stehen. PF startet aber in Verbindung mit der Anweisung
Code:
 ! sh -c "/sbin/pfctl -e -f /etc/pf.conf"
in der /etc/ppp/ppp.linkup automatisch.
Sonst würde das NAT warscheinlich gar nicht funktionieren.

Nachtrag:
In dem Rechner gibt es noch eine dritte Netzwerkkarte, stge0, diese ist jedoch nicht konfiguriert, also es gibt keine hostname.stge0.
Kann das vielleicht ursächlich sein?
Zumal die beiden Netzwerkkarten sich per pci riser karte einen pci slot teilen.
 
Zuletzt bearbeitet:
das was von pf startet ist das default ruleset nicht dein rule set ...
du musst schon pf via pf.conf.local starten und dort ggf deine eigene datei angeben.

sonst wird das nix.
nat kann , scheinbar wird, vom pppd gemacht.

mal mit pfctl -vvsr pruefen ob der eigne ruleset geladen ist.

holger
 
Eine pf.conf.local gibt es hier nicht. Ich denke schon das die Regeln richtig geladen worden sind. Zumal wenn ich die NAT Zeile in der pf.conf auskommentiere, funktioniert das NAT nicht mehr.

pfctl -vvsr gibts u.A folgendes aus:
Code:
@13 pass in on tun0 inet proto tcp from any to 77.5.71.194 port = www flags S/SA keep state rdr-to 192.168.0.20 port 80
  [ Evaluations: 192       Packets: 3         Bytes: 192         States: 0     ]
  [ Inserted: uid 0 pid 29444 State Creations: 1     ]
@14 pass in on tun0 inet proto tcp from any to 77.5.71.194 port = https flags S/SA keep state rdr-to 192.168.0.20 port 443
  [ Evaluations: 6         Packets: 3         Bytes: 192         States: 1     ]

Ich habe über eine andere Internet Leitung auf die IP zugegriffen, mittlerweile kriege ich timeouts vom Browser ausgegeben.

Die pf.conf sieht indes so aus:
Code:
# macros

int_if="rl0"
ext_if="tun0"

tcp_services="{ 22, 113 }"
icmp_types="echoreq"

lspro="192.168.0.10"
server="192.168.0.20"

# options

set block-policy return
set loginterface fxp0
set skip on lo

# match rules

match out on egress inet from !(egress) to any nat-to (egress:0)
#match in on tun0 proto tcp from any to (tun0) port 80 rdr-to 192.168.0.10 port 80

# filter rules

block in log
pass out quick

antispoof quick for { lo $int_if }

pass in on egress inet proto tcp from any to (egress) \
    port $tcp_services

pass in on $ext_if proto tcp from any to $ext_if port 80 \
    rdr-to $server port 80

pass in on $ext_if proto tcp from any to $ext_if port 443 \
    rdr-to $server port 443

pass in inet proto icmp all icmp-type $icmp_types


pass in on $int_if

Ist die Reihenfolge der Regeln denn soweit in Ordnung?
Kann die Problematik am pppd liegen?
Hat bzgl des Kernel pppoe jemand Ideen warum die scheiße nicht funktioniert?
 
Zuletzt bearbeitet:
hi

reihenfolge spielt keine grosse rolle mehr.

das mit der rc.conf.local solltest du dir schnell angewoehnen da bei einen
update die rc.conf ueberschrieben wird.

siehe man rc.conf

hat du in der hostname.pppoe0 auch ein up gemacht ?

bei deinem auszug der regeln sieht man das die rdr matchen d.h.
es sollte am internen 192.er interface der fw auch die packete zu sehen sein
wenn sie zum ziel gehen ,sowie auf dem interface der maschine selber.


ist bei dem ziel ( 192.168.0.20 ) auch die default route richtig gesetzt ?
spirch gw firewall interne addr ?

wobei ich gerade sehe
Code:
match out on egress inet from !(egress) to any nat-to (egress:0)

versuch das mal ohne das !

holger
 
Zurück
Oben