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:
Das funktioniert soweit recht gut für sämtlichen traffic der via eth0 per FORWARD rausgeht.
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:
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:
Wo hab ich hier einen Denkfehler?
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?