Frage bzgl Portweiterleitungen mit PF

Dieses Thema im Forum "OpenBSD - Allgemein" wurde erstellt von Sebbo86, 19 August 2011.

  1. Sebbo86

    Sebbo86 New Member

    Registriert seit:
    19 August 2011
    Beiträge:
    6
    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?
  2. Bummibaer

    Bummibaer Registered Schwarzbär

    Registriert seit:
    30 Januar 2004
    Beiträge:
    1.005
    Wohnort:
    RZ Bärenhöhle Raum Stuttgart grob
  3. Sebbo86

    Sebbo86 New Member

    Registriert seit:
    19 August 2011
    Beiträge:
    6
    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: 20 August 2011
  4. Azazyel

    Azazyel Member

    Registriert seit:
    2 Juni 2005
    Beiträge:
    471
    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: 20 August 2011
  5. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    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
  6. Sebbo86

    Sebbo86 New Member

    Registriert seit:
    19 August 2011
    Beiträge:
    6
    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.
  7. Bummibaer

    Bummibaer Registered Schwarzbär

    Registriert seit:
    30 Januar 2004
    Beiträge:
    1.005
    Wohnort:
    RZ Bärenhöhle Raum Stuttgart grob
    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: 20 August 2011
  8. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    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
  9. Sebbo86

    Sebbo86 New Member

    Registriert seit:
    19 August 2011
    Beiträge:
    6
    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.
  10. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    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
  11. Sebbo86

    Sebbo86 New Member

    Registriert seit:
    19 August 2011
    Beiträge:
    6
    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: 21 August 2011
  12. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    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
  13. Sebbo86

    Sebbo86 New Member

    Registriert seit:
    19 August 2011
    Beiträge:
    6
    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: 22 August 2011
  14. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    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
  15. oenone

    oenone Programmierer

    Registriert seit:
    30 November 2002
    Beiträge:
    2.551
    Wohnort:
    Bremen
    bloß nicht!

    Gibts Log-Einträge? Wie sieht der Traffic in tcpdump aus?
  16. mark05

    mark05 Member

    Registriert seit:
    19 November 2003
    Beiträge:
    659
    Wohnort:
    Bergisch Gladbach
    warum bedeutet nur das die fw selber raus darf wen die verbindung
    von ihr aus initiert wird.

    reingehende verbindungen sind davon eh nich betroffen.


    holger