pf config für 2 WAN interfaces (kein load-balancing)

lukesky333

Active Member
Hallo Leute,

ich bin ein wenig verzweifelt, weil meine pf config nicht so will, wie ich es mir vorstelle.

Generell schaut es wie folgt aus:
Wir haben 4 interne IP-Ranges (für Server, User, Gäste, Telefonie) und wollen diese über zwei externe Internetanschlüsse (Breitband & DSL) leiten. Prinzipiell geht der gesamte Traffic über den Breitbandanschluss, lediglich die Telefonie soll den DSL-Anschluss verwenden.

Kann mir da jemand den richtigen Denkanstoß geben? Ich hab mir die Beispiele für's Load-Balancing bereits angesehen, leider hilft mir das nicht wirklich weiter bzw. hab ich da wohl ein kleines Verständnisproblem.

...ich wäre Euch sehr verbunden... :-)
 
Hoert sich nach source based routing an, e.g.:
pass in quick on $int from $telefonie_range to any route-to ($dsl_int $dsl_peer_ip)
 
hi

alternativ kann man auch die ziel ip ( externe Telefonanlage / sip anbieter etc ) als auswahl kriterium nehmen
und das ganze dann mit nat kombinieren

pass in qucik on $lan_in from any to $sip-server nat-to ($dsl_if)

bitte immer die position der rule im ruleset beachten .
sie sollte vor den regeln stehen die den breitband anschluss nutzen

holger
 
Wenn er einen externen unter $sip-server verwendet, ist das klar "einfacher" (route-to ist eine ziemliche Kruecke.. rdomains! :) )
 
In rdomains schaufelt man doch auch wieder nur per pf. Und damit der Rückweg funktioniert, braucht man eine Route über localhost, dazu darf man aber z.B. lo1 nicht in pf.conf "skippen". Und die rules dürfen nicht "if-bound" sein. Das ist alles ein Krampf. :)
 
hi

jo rdomains währe definitiv oversize für das was gewollt ist.


holger
ps. das mit der rück route via lo ist nicht ganz korrekt.

gerade wenn man internet zugänge mit dynamischen ips hat ,kann man mit rdomains einges machen weil das wichtigste ja automaitsch
gesetzt wird , die default route.

der rest ist der richtige umgang mit nat und rdr.

aber hier liegt die crux man muss sich vorher gedanken machen , und kann nicht mal eber das umsetzen
 
Rückweg war das falsche Wort. Ich meine Traffic, der von außen initiiert wird. Konkret habe ich bei mir 2 IPv6-Tunnel, die in separaten rdomains leben, und damit eingehender Traffic funktioniert, muss ich in der rdomain separat nochmal die Routen für die internen Netze vorhalten.

s. https://www.packetmischief.ca/2011/09/20/virtualizing-the-openbsd-routing-table/
/skip on lo

Und selbst dann ist nicht alles 100% problemlos. Traceroutes kriege ich bis heute nicht so hin mit so einem Setup, dass sie "sauber" aussehen.

Edit: Was ich dann mal irgendwann testen wollte, ist das interne Interface mit in die rdomain zu legen. Dann brauch ich aber pro rdomain ein separates internes Interface.
 
Was macht man dann mit pair? In der rdomain ein Interface, draußen eins, und auch wieder route-to, und ich brauch auf dem pair-Paar noch ein Transfernetz? Oder wie ist das gedacht?

Edit: Bzw. funktioniert dann im Fall von IPv6 sowas wie ff02::1%pair0?
 
hi

wenn ich die man page richtig verstehe ist pair ein erweitertes vether .

man muss immer ein "paar definieren in unterschiedlichen rdomains.

alle packete die in das erste pair if reingehen werden weitergeleitet an seinen partner.

könnte die einfache möglichkeit sein zwischen rdomains zu komunizieren ohne pf.

holger
 
Hallo Leute,

erstmal danke für die zahlreichen Kommentare. Scheinbar hab ich Euch mal wieder zu wenig Infos zum Problem gegeben - deshalb hier noch ein wenig mehr Aufklärung...

Zunächst mal, der SIP-Server ist auch im internen Netz, soll aber über eine dezidierte Leitung nach draussen "telefonieren" - deshalb meine Frage hier.

Ich hab jetzt mal die Rule von "double-p" adaptiert und eingebaut - testen kann ich aber erst nach Geschäftsschluss...

Code:
pass in quick on $int_if from $lan_phone to any route-to ($ext_if2 $nat_ip_phone)

Ein weiteres Problem ist, dass über selbiges Interface auch von Aussen auf die SIP-Anlage (ist gemietet) zugegriffen werden soll. Dafür hab ich folgende Regel, die aber auch nicht so recht will:

Code:
pass in $log_opt on $ext_if2 inet proto tcp to { $nat_ip_phone, $ext_ip2 } port $sec_tcp_services
pass in $log_opt on $ext_if2 inet proto udp to { $nat_ip_phone, $ext_ip2 } port $sec_udp_services

Ich find das Thema Firewall mit OpenBSD echt spannend, allerdings schein ich da immer wieder auf der Leitung zu stehen. Sobald dieses Problem gelöst ist, hätt ich auch gern noch ein "gröberes" Problem in der Config gelöst. Ich will per default alles sperren (block all), jedoch geht dann garnichts mehr und ich hab keinen schimmer warum.

Hier mal die (fast) gesamte Config:

Code:
set block-policy return
#set loginterface egress

# don't filter on the loopback interface
set skip on lo0

######################################################################

#match in log all scrub (no-df random-id reassemble tcp)

# NEED TO BE FIXED AS SOON AS POSSIBLE
#block $log_opt all

#block in quick from urpf-failed

# antispoof on external interfaces
antispoof $log_opt quick for { $ext_if1, $ext_if2 } inet

match in $log_opt all scrub (no-df random-id reassemble tcp)
match out $log_debug on $ext_if1 from $lan_server to any nat-to $nat_ip_server
match out $log_debug on $ext_if1 from $lan_user to any nat-to $nat_ip_user
match out $log_debug on $ext_if1 from $lan_guest to any nat-to $nat_ip_guest
match out $log_debug on $ext_if1 from $vpn_net to any nat-to $nat_ip_vpn
match out $log_debug on $ext_if2 from $lan_phone to any nat-to $nat_ip_phone

#pass out on $ext_if1 from $ext_if2 route-to ($ext_if2 $ext_gw2)
#pass out on $ext_if2 from $lan_phone route-to ($ext_if2 $ext_gw2)

# block our special friends from /etc/pf.blocked.ip.conf
block in quick $log_opt on { $ext_if1, $ext_if2 } from <blocked_ip> to any

# allow loopback connections
pass quick on lo0 all

# internal incomming traffic
pass in $log_debug on { $int_if, $vpn_if } from { $lan_server, $lan_user, $vpn_if } route-to ($ext_if1 $ext_gw1)
pass in $log_debug on $int_if from $lan_guest to { $lan_guest, ! ($int_if:network) } route-to ($ext_if1 $ext_gw1)
pass in quick $log_debug on $int_if from $lan_phone to { $lan_phone, ! ($int_if:network) } route-to ($ext_if2 $ext_gw2)

# external incomming traffic for specified services
pass in $log_opt on $ext_if1 inet proto tcp to { $nat_ip_server, $nat_ip_user, $nat_ip_vpn, $ext_ip1 } port $ext_tcp_servic
es
pass in $log_opt on $ext_if1 inet proto udp to { $nat_ip_server, $nat_ip_user, $nat_ip_vpn, $ext_ip1 } port $ext_udp_servic
es
pass in $log_opt on $ext_if2 inet proto tcp to { $nat_ip_phone, $ext_ip2 } port $sec_tcp_services
pass in $log_opt on $ext_if2 inet proto udp to { $nat_ip_phone, $ext_ip2 } port $sec_udp_services

# allow all outgoing connections
pass out $log_debug all keep state

# VPN connections inbound
pass $log_opt on $vpn_if

# icmp / traceroute
pass inet proto icmp icmp-type { echoreq, unreach }

# rules for internal mail server - to be deleted after migration!!
pass in on $ext_if1 proto tcp from any to $ext_if1 port http \
    rdr-to $mail_server port http
# HTTPS is actually SMTP on mail.
pass in on $ext_if1 proto tcp from any to $ext_if1 port https \
    rdr-to $mail_server port smtp
pass in on $ext_if1 proto tcp from any to $ext_if1 port smtp \
    rdr-to $mail_server port smtp
pass in on $ext_if1 proto tcp from any to $ext_if1 port smtps \
    rdr-to $mail_server port smtps
pass in on $ext_if1 proto tcp from any to $ext_if1 port imap \
    rdr-to $mail_server port imap
pass in on $ext_if1 proto tcp from any to $ext_if1 port imaps \
    rdr-to $mail_server port imaps
pass in on $ext_if1 proto tcp from any to $ext_if1 port pop3 \
    rdr-to $mail_server port pop3
pass in on $ext_if1 proto tcp from any to $ext_if1 port pop3s \
    rdr-to $mail_server port pop3s

pass in on $ext_if2 proto tcp from any to $ext_if2 port 80 \
    rdr-to $sip_server port 80
pass in on $ext_if2 proto udp from any to $ext_if2 port 5060 \
    rdr-to $sip_server port 5060
pass in on $ext_if2 proto udp from any to $ext_if2 port 16000:16015 \
    rdr-to $sip_server port 16000:16015

pass in on $ext_if1 proto tcp from any to ($ext_if1) port $camera_port \
        rdr-to $camera_server port $camera_port

# IPsec to second location
pass in  $log_debug on $ext_if1 proto esp from $remote_gw to $ipsec_ip
pass out $log_debug on $ext_if1 proto esp from $ipsec_ip to $remote_gw

pass in  $log_debug on $ext_if1 proto udp from $remote_gw to $ipsec_ip port {isakmp, ipsec-nat-t}
pass out $log_debug on $ext_if1 proto udp from $ipsec_ip to $remote_gw port {isakmp, ipsec-nat-t}

pass in  $log_opt on enc0 from $remote_nets to $int_if:network keep state (if-bound)
pass out $log_opt on enc0 from $int_if:network to $remote_nets keep state (if-bound)

Ich bin gespannt auf Euren Input und wie falsch ich mit meiner derzeitigen Config liege. ...bitte seid gnädig, ist meine erste Firewall-Config mit PF... ;-)
 
hi

also das user netz verbindet sich mit dem sip server im server netz

$srv_if = server segment
$cln_if = client segment
$wan_if = dsl internet
$inet_telefonie = internet_ anlage
# alles blocken mit log ( pflog0 )
block log
# in out fuer client segment erlauben
pass quick $cln_if client alles erlauben
# inbound traffic von client zum sip server

pass quick on $srv_if inet proto tcp from $cln_net to $sip_server port { x,y,z }
pass quick on $srv_if inet proto udp from $cln_net to $sip_server port { x,y,z }

da ich davon ausgehe das nur der sip server sich mit der telefon anlage im inet verbinden

# out bound sip server to internet telefonanlage
pass quick on $srv_if from $sip_server to $inet_telefonie

#nun zum internet
# via nat bestimmen welche leitung verwendet werden soll

pass quick $wan_if from $sip_server to $inet_telefonie nat-to ($wan_if)



via tcpdump -n -i plfog0
debuggen ;)

holger
 
hallo holger,

danke für Deine Ausführungen, aber das ist nicht ganz das, was ich brauche. Vielleicht muss ich noch etwas mehr ausholen...

Wir haben intern 4 Netze (Server, Client, Guest, Phone) und gehen über 2 Leitungen (Cable, DSL) ins Internet. Alle Verbindungen sollen über das Cable-Internet rausgehen, lediglich die Telefonie soll über DSL rausgehen. Intern möchte ich die Netze auch gern gegeneinander abschotten, zumindest das Guest-Netz - dieses darf nur ins Internet und in keines der anderen Subnetze....

Im Phone-Netz befinden sich alle Telefone sowie auch unser SIP-Server, der über mehrere Trunks mit unserem Provider Verbindung aufnimmt (über DSL!!!).

Die obige Config habe ich probiert, sie will aber nicht. Ich bekomme es zwar hin, dass das NAT funktioniert - trotzdem gehen die Paket über das Cable und nicht über DSL raus.

Es ist echt verzwickt - hab gestern auch länger mit nem Kumpel dran gesessen - leider sind wir dem Problem nicht auf die Schliche gekommen.

Falls also jemand anhand meiner Config (Link) den Fehler findet bzw. mir sagen kann, was ich falsch mache, so würde mir das echt weiterhelfen!
 
hi

bedeneke routing vor packet filter

mein beispiel geht davon aus das auf dem cable anschluss die default route liegt.
der dsl anschluss ist nur akiv , setzt aber keine default route !

dadurch das dann mii nat gearbeitet wird kann man die dsl leitung auch so nutzen.

drüber hinaus ist die position der nat regel entscheidet
sie sollte vor der "globalen" regel für den cable anschluss stehen.


holger
 
So ähnlich hab ich mir das auch gedacht. Deshalb habe ich unsere funktionierende Config vom Cable-Anschluss hergenommen und wollte diese lediglich um das NAT und ROUTING für das Phone-Netz erweitern. Leider war dem nicht so - es funktioniert einfach nicht.

Das NAT schein zu ziehen, jedoch geht es nachwievor über das falsche Interface (Cable) raus.

Ich hab jetzt versucht die Config nochmal etwas zu überarbeiten... Testen kann ich es leider nur ausserhalb der Geschäftszeiten, aber vielleicht kannst Du da nochmal drüberschauen?

Code:
#block in quick from urpf-failed

# antispoof on external interfaces
antispoof $log_opt quick for { $ext_if1, $ext_if2 } inet

match in $log_opt all scrub (no-df random-id reassemble tcp)
match out $log_debug on $ext_if2 from $lan_phone to any nat-to $nat_ip_phone
match out $log_debug on $ext_if1 from $lan_server to any nat-to $nat_ip_server
match out $log_debug on $ext_if1 from $lan_user to any nat-to $nat_ip_user
match out $log_debug on $ext_if1 from $lan_guest to any nat-to $nat_ip_guest
match out $log_debug on $ext_if1 from $vpn_net to any nat-to $nat_ip_vpn

# block our special friends from /etc/pf.blocked.ip.conf
block in quick $log_opt on { $ext_if1, $ext_if2 } from <blocked_ip> to any

# allow loopback connections
pass quick on lo0 all

# internal incomming traffic
pass in quick $log_debug on $int_if from $lan_phone to { ! $int_if:network } route-to ($ext_if2 $ext_gw2)
pass in $log_debug on { $int_if, $vpn_if } from { $lan_server, $lan_user, $vpn_if }
pass in $log_debug on $int_if from $lan_guest to { $lan_guest, ! ($int_if:network) }
pass in $log_debug on $int_if from $lan_phone to { $lan_phone}

# external incomming traffic for specified services
pass in $log_opt on $ext_if1 inet proto tcp to { $nat_ip_server, $nat_ip_user, $nat_ip_vpn, $ext_ip1 } port $ext_tcp_servic
es
pass in $log_opt on $ext_if1 inet proto udp to { $nat_ip_server, $nat_ip_user, $nat_ip_vpn, $ext_ip1 } port $ext_udp_servic
es
pass in $log_opt on $ext_if2 inet proto tcp to { $nat_ip_phone, $ext_ip2 } port $sec_tcp_services
pass in $log_opt on $ext_if2 inet proto udp to { $nat_ip_phone, $ext_ip2 } port $sec_udp_services

# allow all outgoing connections
pass out $log_debug all keep state

# VPN connections inbound
pass $log_opt on $vpn_if

# icmp / traceroute
pass inet proto icmp icmp-type { echoreq, unreach }

# rules for internal mail server - to be deleted after migration!!
pass in on $ext_if1 proto tcp from any to $ext_if1 port http \
    rdr-to $mail_server port http
# HTTPS is actually SMTP on mail.
pass in on $ext_if1 proto tcp from any to $ext_if1 port https \
    rdr-to $mail_server port smtp
pass in on $ext_if1 proto tcp from any to $ext_if1 port smtp \
    rdr-to $mail_server port smtp
pass in on $ext_if1 proto tcp from any to $ext_if1 port smtps \
    rdr-to $mail_server port smtps
pass in on $ext_if1 proto tcp from any to $ext_if1 port imap \
    rdr-to $mail_server port imap
pass in on $ext_if1 proto tcp from any to $ext_if1 port imaps \
    rdr-to $mail_server port imaps
pass in on $ext_if1 proto tcp from any to $ext_if1 port pop3 \
    rdr-to $mail_server port pop3
pass in on $ext_if1 proto tcp from any to $ext_if1 port pop3s \
    rdr-to $mail_server port pop3s

pass in on $ext_if2 proto tcp from any to $ext_if2 port 80 \
    rdr-to $sip_server port 80
pass in on $ext_if2 proto udp from any to $ext_if2 port 5060 \
    rdr-to $sip_server port 5060
pass in on $ext_if2 proto udp from any to $ext_if2 port 16000:16015 \
    rdr-to $sip_server port 16000:16015

pass in on $ext_if1 proto tcp from any to ($ext_if1) port $camera_port \
        rdr-to $camera_server port $camera_port

# IPsec to second location
pass in  $log_debug on $ext_if1 proto esp from $remote_gw to $ipsec_ip
pass out $log_debug on $ext_if1 proto esp from $ipsec_ip to $remote_gw

pass in  $log_debug on $ext_if1 proto udp from $remote_gw to $ipsec_ip port {isakmp, ipsec-nat-t}
pass out $log_debug on $ext_if1 proto udp from $ipsec_ip to $remote_gw port {isakmp, ipsec-nat-t}

pass in  $log_opt on enc0 from $remote_nets to $int_if:network keep state (if-bound)
pass out $log_opt on enc0 from $int_if:network to $remote_nets keep state (if-bound)
 
hi

was sind die macro ?
hast du verschiede publc ips ?

ist der unterschied zwischen match und pass bekannt ( firt match , last match )

du solltes nat und route-to nicht mischen , es se den du weisst was du tust


denk ueber dein ruleset nach , und bedenke "keep simple"



holger
 
Ich denke, dass sich hier auch nat-to und route-to quasi beisst (insofern, dass es nicht mehr "from $lan_phone" ist).
Pack das route-to mal oberhalb des lan_phone nat-to
 
hi

was sind die macro ?
hast du verschiede publc ips ?
holger
Ja, wir haben auf jedem externen Interface mehrere IPs.

hi
ist der unterschied zwischen match und pass bekannt ( firt match , last match )
Im groben ja... Wie gesagt, mit PF hatte ich vorher noch nicht zu tun. Soweit hat es bis dato auch (mehr oder weniger) funktioniert, nur jetzt bin ich mit meinem Latein am Ende.

Ich denke, dass sich hier auch nat-to und route-to quasi beisst (insofern, dass es nicht mehr "from $lan_phone" ist).
Das versteh ich jetzt aber nicht ganz... Es steht doch bei beiden Rules (nat-to & route-to) "from $lan_phone" dabei. Oder meinst Du damit, dass "from $lan_phone" nicht mehr zieht, weil ich bereits ein match mit "nat-to" habe?

Pack das route-to mal oberhalb des lan_phone nat-to
Aber zieht dann die Match-Rule überhaupt noch, wenn ich vorher schon ein "pass in quick" habe? ...eigentlich schon, beim "pass out" oder?
 
hi
wenn das "zeuberwort" quick verwendet wird in einer regel so hört das verarbeiten des packets an genau der stelle auf.

das packet durch läuft keine weiteren regeln.

holger
 
so meinte ich das
Prinzipiell wäre ich da auch Deiner Meinung, aber zieht das match nicht erst, wenn es eine pass-Regel durchläuft?

In den anderen Fällen zieht auch die match- und die später folgende pass-Regel... Es gibt da zwar kein Routing, aber das kann ja auch nicht das Problem sein?!

Würde ich die Regeln umdrehen (von der Reihenfolge her), dann würde die match-Regel ja nie ziehen, weil es keine passende pass-Regel gibt. ...oder?
hi
wenn das "zeuberwort" quick verwendet wird in einer regel so hört das verarbeiten des packets an genau der stelle auf.

das packet durch läuft keine weiteren regeln.

holger
Auf welches quick beziehst Du Dich da? Ich hab die Config nochmal durchgesehen und meiner Meinung nach sollte es für den Fall der Telefonie kein quick geben...

...falls ich mal wieder gehörig auf dem Schlauch stehe, dann sagt es mir bitte...
 
Zurück
Oben