Internetverbindung über 2 ISP langsam und instabil

schleicher

New Member
hi,

ich habe ein pf-problem unter openbsd 3.6.
Der von mir konfigurierte Internetzugang ist langsam und instabil.

Ersteinaml ein paar Eckdaten:

Es handelt um ein C-Netz 192.168.0/24. Die OpenBSD-Box stellt Router, Firewall und Caching-DNS zur Verfügung. Hinter der Box hängen 3 clients, der Zugang ins Internet erfolgt über 2 ISP's.
ISP1 hat noch einen Router vor der OpenBSD-Box mit der IP 192.168.0.1 und zum Internet hin eine static IP. ISP2 ist über ein DSL-Modem direkt an der OpenBSD-Box und ppp erreichbar.
Externe NIC's der OBSD-Box sind rl1 (192.168.0.2) zu ISP1 und rl2 (192.168.0.4) zu ISP2, das interne NIC rl0 hat die 192.168.0.3.
Es ist kein load-balancing gewünscht.
Die 2 Rechner mit den IP's 192.168.0.51 und 192.168.0.53 sollen über ISP2 ins Internet gelangen, der Rest über ISP1.
Außerdem will ich durch ändern der Routen und pf.conf den gesamten Verkehr über einen ISP laufen lassen, ohne etwas an den Clients zu verändern.
Auf der OBSD-Box läuft desweiteren ein Caching-DNS mit den DNS-IP's beider ISP's.

Ausserdem ein vereinfachter Auszug aus den Routing-Tabellen:
---
default x.x.x.x UGS rl2 (Gateway ISP2)

default 192.168.0.1 UGS rl1

192.168.0/24 link#1 UC rl0

192.168.0.1 [MAC-Adresse] rl1

127.0.0.1 127.0.0.1 UH lo0

...
---

Für die Verbinfungen zu jeweils nur einem ISP verwende ich eigene pf.conf's die auch funktionieren. Eine Verbindung zu einem einzelnen ISP bereitet keine Probleme. Der Aufbau des Netwerks ansich ist historisch bedingt und soll (eigentlich) nicht geändert werden.

Das problematische pf.conf-file habe ich mir aus den eigenen files und verschiedenen examples (openbsd.org, groups google) zusammengetragen:

---
# interfaxes & networks
extIf_1 = "rl1"
extIf_2 = "tun0"
extIf_1GW = "192.168.0.1"
extIf_2GW = "x.x.x.x"
intNIC = "rl0"
intNet = "192.168.0.0/24"
routerIP = "192.168.0.3"
Loop = "lo0"
protos = "{udp,icmp}"
serverIPs = "{192.168.0.51,192.168.0.53}"
table <privNets> {127.0.0.0/8,172.16.0.0/12,192.168.0.0/16,!$intNet,10.0.0.0/8,255.255.255.255/32}

set block-policy return
set loginterface $extIf_1
scrub in all

# nat + rdr
nat on $extIf_2 from $serverIPs to any -> ($extIf_2)
nat on $extIf_2 from $intNIC:network to any -> ($extIf_1)
rdr on $intNIC proto tcp from !$routerIP to !intNet port 21 -> 127.0.0.1 port 8021

#
block all
pass quick on $Loop all

# spoofing
block drop in quick on {$extIf_1,$extIf_2} from <privNets> to any
block drop out quick on {$extIf_1,$extIf_2} from any to <privNets>

# ftp
pass in on $intNIC proto tcp from $intNet to any port 8021 keep state
pass in on $extIf_1 inet proto tcp from port 20 to ($extIf_1) user proxy flags S/SA keep state
pass in on $extIf_2 inet proto tcp from port 20 to ($extIf_2) user proxy flags S/SA keep state

# ping
pass in inet proto icmp all icmp-type 8 code 0 keep state

#
pass out on $intNIC from any to $intNIC:network keep state
pass in quick on $intNIC from $intNIC:network to $intNIC keep state
pass in quick on $intNIC route-to ($extIf_2 $extIf_2GW) random proto tcp from $serverIPs to any modulate state flags S/SA
pass in quick on $intNIC route-to ($extIf_2 $extIf_2GW) random proto protos from $serverIPs to any keep state
pass in on $intNIC route-to ($extIf_1 $extIf_1GW) random proto tcp from $intNet to any modulate state flags S/SA
pass in on $intNIC route-to ($extIf_1 $extIf_1GW) random proto protos from $intNet to any keep state

#
pass out on $extIf_1 proto tcp from any to any flags S/SA modulate state
pass out on $extIf_2 proto tcp from any to any flags S/SA modulate state
pass out on $extIf_1 proto $protos from any to any keep state
pass out on $extIf_2 proto $protos from any to any keep state

#
pass out on $extIf_1 route-to ($extIf_2 $extIf_2GW) from $extIf_2 to any
pass out on $extIf_2 route-to ($extIf_1 $extIf_1GW) from $extIf_1 to any
---

Da ich bei weitem kein Netzwerk oder Firewall-Experte bin und nicht alle settings in dem ruleset wirklich "gerafft" habe, vermute ich den Fehler dort.
Die Idee, das bestimmte Rechner über einen bestimmten ISP geleitet wird, wollte ich mit den route-to's erreichen.
Das Problem ist, das oftmals ein Timeout erfolgt bevor die URL aufgelöst wurde. Manchmal klappt auch die Namens-Auflösung und die Verbindung dümpelt mit 1k-2k vor sich hin.
Von mir durchgeführte Traceroute's haben ergeben, dass die Routen in der Routingtabelle funktionieren.
Sobald der Name aufgelöst werden konnte, wird das gewünschte Verbindungsziel erreicht. Allerdings mit schlechteren Zeiten, als wenn man über einen einzelnen ISP gehen würde ( laut traceroute).
Ab und zu gibt es auch ftp-Probleme, d.h. es werden weniger Bytes für ein file Übertragen als die Maschine es erwartet. Liegt das auch am ruleset, oder hat der ftp-proxy Macken?
Was ist falsch an den rule-settings? Meiner Meinung nach, müsste es funktionieren.

Schon mal vielen Dank im voraus für eure Mühe
 
Ich würde als erstes für die externen NIC's ein eigenes Netz erstellen.
Die internen und "externen" NIC's im selben Netz kann imho nur Probleme verursachen.
Dies würde auch kein load balancing darstellen sondern "irgendwas", das System kann in solchen Fällen nicht mehr "sagen" über welches Interface der Traffic wieder "zurückgeroutet" werden soll (Ich denke dies über PF Rules zu definieren ist auch nicht sinnvoll).

Du hast dieses FAQ schon gelesen?
http://www.openbsd.org/faq/faq6.html

Für das Routing zwischen mehreren ISP's (auch wenn dies meist load balancing zwischen den ISP's betrifft, aber Hilfe ist es immer für den Aubau des Netzes :) ) gibt es einiges zu lesen.

Zum Bleistift:

http://groups.google.at/groups?hl=de&lr=&q=openbsd+pf+routing+2+isp

http://groups.google.at/groups?hl=de&lr=&q=openbsd+pf+load+balancing&btnG=Suche

Du wirst mit den PF Rules auch nicht mehr "diese" Probleme haben wenn Du separate Netze erstellst.

Sorry daß ich Dir hier nicht mehr helfen konnte aber solch Setup habe ich noch nie gesehen (und dies ist nicht böse gemeint :) ).
 
Danke für die schnelle Hilfe. Werde mir die Links mal anschauen. Hatte schon befürchtet, dass das Setup so wenig Sinn macht.
 
Zurück
Oben