• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Policy Routing bei 2 DSL Provider

j__k

Newbie
Hallo,


Habe einen Opensuse 11.0 Server mit 3 Netzwerkkarten:

eth0 = internes Netz mit vielen Client's inet Adresse:192.168.1.1

eth1 = hängt an einer Fritzbox (192.168.2.2) mit DSL 2000( Rückfall auf 1536 kbit) inet Adresse:192.168.2.1

eth2 = hängt an einer Fritzbox( 192.168.3.2) mit DSL 6000 ( ist neu, war auf 1536 kbit) inet Adresse:192.168.3.1

habe mit dieser Konfiguration per wechselseitiges Verteilen der ausgehenden Verbindungen auf beide DSL Provider mehr als 2 Jahre in Betrieb gehabt.

Nachdem jetzt durch Überbau der alten Kupfer Leitungen DSL 6000 möglich ist wurde 1 Anschluss "aufgerüstet".
Ich möchte nun die wechselseitige Lastverteilung nicht mehr betreiben da es bei verschiedenen Diensten (ssh, banking, onlinespiele ...) Probleme gab da die Verbindungen nicht immer über 1 Leitung gehen sondern mittendrin auf die jeweils andere Leitung rausgehen.
Problem ist wohl hier das connection tracking was wohl nicht funktioniert, aber egal.

Da der Traffic so zu 80 % via Port 80 und 443 rausgeht (laut ntop) ist die Idee den Port80 und 443 über eth2(dsl6000) zu routen, alles andere via eth1(dsl2000)
Nach langer Suchen hab ich folgende Lösung:

Code:
in /etc/iproute2/rt_tables eine neue Tabelle hinzugefügt:
1    port80

dann per script natürlich folgende Befehle ausgeführt:

ip route add default via 192.168.2.2  # default route setzen auf eth1 ( 1536 kbit)
ip route add default via 192.168.3.2 table port80  # route zu eth2 (6000kbit) via table port80 setzen
ip rule fwmark 1 table port80 #  alles was mit einer 1 markiert ist über table port80 routen
iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 1  # markiere mit 1 wenn zielport 80 
iptables -A PREROUTING -t mangle -p tcp --dport 443 -j MARK --set-mark 1  # dito


Das funktioniert soweit recht gut für sämtlichen traffic der via eth0 per FORWARD rausgeht.

iptables -vnL -t mangle
Chain PREROUTING (policy ACCEPT 66M packets, 41G bytes)
pkts bytes target prot opt in out source destination
3169K 374M MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 MARK set 0x1
18166 3926K MARK tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 MARK set 0x1

Chain INPUT (policy ACCEPT 29M packets, 10G bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 37M packets, 31G bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 28M packets, 6549M bytes)
pkts bytes target prot opt in out source destination

Da auf dem Server noch ein squid Proxy läuft hab ich aber festgestellt das dieser traffic via squid nur über:
eth1 (dsl 1536) rausgeht, ist ja klar das keine FORWARD Regel greift sondern OUTPUT

also schnell noch eine Zeile eigefügt:

Code:
iptables -A OUTPUT -t mangle -p tcp --dport 80 -j MARK --set-mark 1 # ausgehende Verbindungen mit 1 markieren

aber nach ausführen dieser Regel geht via squid ( b.z.w. sämtlicher traffic zu port 80 direkt vom server) überhaupt nichts mehr raus weder via eth1 (192.168.2.2) noch wie es eigentlich sein sollte über eth2 (192.168.3.2)

Nun meine Frage warum das so nicht funktioniert, wo hin werden meine augehenden verbindungen geroutet? Die Markierung von ausgehenden traffic scheint ja zu funktionieren:

Code:
Chain OUTPUT (policy ACCEPT 28M packets, 6239M bytes)
 pkts bytes target     prot opt in     out     source               destination
   18  1072 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 MARK set 0x1

Wo hab ich hier einen Denkfehler?
 

spoensche

Moderator
Teammitglied
Eine Anleitung zum PBR (Policy Based Routing).

http://www.linupedia.org/opensuse/Policy_Based_Routing
 
OP
J

j__k

Newbie
Eine Anleitung zum PBR (Policy Based Routing).

http://www.linupedia.org/opensuse/Policy_Based_Routing

Danke, aber das hilft mir nicht weiter, da ich schon diese Anleitung gelesen habe.
Es funktioniert ja alles soweit bis eben auf lokal vom Server ausgehende Verbindungen, die falsch geroutet werden(b.z.w. gar nicht)
 

spoensche

Moderator
Teammitglied
Gib mal bei der Output- Regel ein Interface oder eine IP an. Dann sollte es funktionieren. Die Regel definiert ja nur den Output für die Source 0.0.0.0/0 zur Destination 0.0.0.0/0.
 
OP
J

j__k

Newbie
Ne tut auch nicht :( "verzweifel"

Hab mal Logging eingeschaltet bei OUTPUT und da steht auch das falsche Device drin:
Apr 19 16:16:17 server kernel: IPTABLES packed output: IN= OUT=eth1 SRC=192.168.2.1 DST=209.85.135.100 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=38999 DF PROTO=TCP SPT=49713 DPT=80 WINDOW=108 RES=0x00 ACK FIN URGP=

sollte ja eigentlich via eth2 192.168.3.1 rausgehen. Übrigens wenn ich ein:

iptables -A FORWARD -t mangle -p tcp --dport 80 -j MARK --set-mark 1

setze funktioniert auch der Forward nicht mehr, alle Daten zu Port 80 verschwinden im Nirwana.

sollte ich vieleicht mal nen neuen Kernel probieren ? Oder fehlt gar hier irgendeine kleine Option in der Configuration?

Code:
server:~ # uname -r
2.6.25.7-default
 

spoensche

Moderator
Teammitglied
Wie ich dir das in meinem vorherigen Post schon gesagt habe musst du bei dem anlegen Regeln mal die Interfaces (z.B. eth0) oedr die IP- Adressen angeben.
 
Oben