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

[gelöst]Load Balancing / Internetzugang über 2 DSL-Leitungen

M4j3stic

Newbie
Hallo Gemeinde

Ich habe folgendes Problem:

An einem Linux-Router sollen 2 DSL-Leitungen angeschlossen werden bzw sind sie schon.

Der Anschluss an den Linux-Router erfolgt durch 2 einzelne Hardware-Router (diese haben auch Verbindung ins Netzt, sind also alle richtig eingestellt).

Die Verbindung von Linux zu den HW-Routern funktioniert.

Jetzt zum eigentlichen Problem:

Es sollen nun beide Leitungen "gleichzeitig" benutzt werden.
Sozusagen Load Balancing betrieben werden.

Wie mach ich das?
Hab mich schon intensiv mit google beschäftigt und das brauchbarste was ich dazu gefunden habe war das:

http://lartc.org/howto/lartc.rpdb.multiple-links.html

Kann ich das so benutzen?
Habt ihr noch andere Literatur, Tipps oder Links auf Lager die mir weiterhelfen könnten?

Viele Grüße Stephan

SYSTEM: SuSE 10.3
 
OP
M

M4j3stic

Newbie
Leviathan schrieb:
Ich hab nur einen Link:
http://www.linux-magazin.de/heft_abo/ausgaben/2007/05/gemeinsam_stark?category=0

Hallo,
hast du den gesamten Artikel gelesen oder auch nur die Einleitung? Ich befürchte, dass es da nur um die allgemeine Problemstellung des Load Balancings geht.

Grüße
 

Leviathan

Hacker
Steht im Prinzip das gleiche drin wie hier:

http://flaviostechnotalk.com/wordpress/index.php/2005/06/12/loadbalancer-less-clusters-on-linux/

Vlt. hilft dir das weiter.

Gruß Dominik
 
OP
M

M4j3stic

Newbie
Hm.. das sind Interessante und elegante Lösungen, aber (wie zu erwarten war) bei mir nicht umsetztbar. Ich kann ja an den HW-Routern nichts wirklich einstellen.

Aber ich schau mal, vllt find ich ja doch noch was.
 
Code:
for i in PREROUTING OUTPUT; do
        iptables -t mangle -A "$i" -m conntrack --ctstate NEW -j CONNMARK --set-mark 1;
        iptables -t mangle -A "$i" -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j CONNMARK --set-mark 2;
        iptables -t mangle -A "$i" -j CONNMARK --restore-mark;
done;
und dann nach fwmark 1 oder 2 routen.
Statt --mode random --probability 0.5 geht auch --mode nth --every 2
Ohne jegliche Router zu verändern - alles auf deiner eigenen Kiste.
 

Gimpel

Guru
Du willst du einfach 2 Leitungen als eine verwenden, oder?

Stichwort "channel bonding" ...

Auf RHEL/CentOS/Fedora recht einfach, zB http://wiki.openvz.org/Bonding
Allgemein: /usr/src/linux/Documentation/networking/bonding.txt

EDIT: hier für suse
http://www.novell.com/coolsolutions/feature/17605.html
http://support.novell.com/techcenter/sdb/en/2004/09/tami_sles9_bonding_setup.html
http://en.opensuse.org/Bonding
 
OP
M

M4j3stic

Newbie
Hallo,

Klasse Geschichte. Das schaue ich mir mal genauer an.

Bedeutet das auch, dass die last auf beide Leitungen verteilt wird?

Gruß,
Stephan
 
OP
M

M4j3stic

Newbie
jengelh schrieb:
Code:
for i in PREROUTING OUTPUT; do
        iptables -t mangle -A "$i" -m conntrack --ctstate NEW -j CONNMARK --set-mark 1;
        iptables -t mangle -A "$i" -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j CONNMARK --set-mark 2;
        iptables -t mangle -A "$i" -j CONNMARK --restore-mark;
done;

Hm... da komm ich nicht ganz mit.

Du markierst jede Verbindung die in PREROUTING OUTPUT steht und weißt ihr "zufällig" die eine oder andere Leitung zu, versteh' ich das richtig?

Und dann, kannst Du das bitte noch ein wenig erläutern?

Grüße,
Stephan
 

Gimpel

Guru
M4j3stic schrieb:
Hallo,

Klasse Geschichte. Das schaue ich mir mal genauer an.

Bedeutet das auch, dass die last auf beide Leitungen verteilt wird?
Ja. Das macht das bonding modul, wenn man ihm sagt, dass es das machen soll (balance-xor). Man fasst x-beliebig viele physische Leitungen zu einer logischen zusammen - wie LVM/RAID bei Festplatten.

Hab das in der Arbeit an zwei RHEL Maschinen aufgesetzt, einmal zwei arcor DSL Leitungen bundeln für nen proxy (im Prinzip also genau dein Fall), und einmal zwei GB ethernet channels für iSCSI an nem SAN storage server. Letzterer zB hat jetzt also eine 2GB eth Anbindung, genau Sinn der Sache.
 
OP
M

M4j3stic

Newbie
Hallo,

Gimpel schrieb:
Ja. Das macht das bonding modul, wenn man ihm sagt, dass es das machen soll (balance-xor).

Wie sag ich ihm das genau? Will heißen, wo muss ich das dem Modul sagen?

Also, das "bonding" Interface ist gesetzt, startet auch, läuft eigentlich auch...

Aber...

Wenn ich die "falsche" Leitung raus nehme geht gar nichts mehr,auch nach wieder einsetzten der Selbigen.

Folgende Konfiguration:

HW-Router1 - 192.168.178.1
HW-Router2 - 192.168.178.1

bond0 - 192.168.178.251


Ist das korrekt? Oder muss ich den HW-Routern unterschiedliche IPs geben? Aber das wäre doch sinnfrei?

Gimpel schrieb:
einmal zwei arcor DSL Leitungen bundeln für nen proxy (im Prinzip also genau dein Fall)

Kannst du mir bitte mal einen Auszug von den Configs zu kommen lassen? Gehst du mit den Leitungen direkt ins Netzt oder ist da auch ein Router vorgeschaltet?

Grüße,
Stephan
 

Gimpel

Guru
Die eth's kriegen keine IP, sind ja beides slaves. Zumindest hab ich nur dem bond0 eine gegeben.

Da is is das original RH howto, welches ich benutzt hatte. Das erklärt auch die bonding modul parameter etc.
http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ref-guide/s1-networkscripts-interfaces.html

Hier is noch was suse spezifisches:
http://www.linux-foundation.org/en/Net:Bonding?printable=yes#Configuring_Bonding_Devices

Steht im Prinzip das selbe drin, nur die Dateinamen für die Interfaces sind anders
 
OP
M

M4j3stic

Newbie
Servus,

Dann hab ich ja schon mal alles so gemacht, wie ich es machen muss :)

Vermute das Problem liegt noch an dem HW-Router ich schau nochmal nach.
Soweit läuft ja alles,
Vielen Dank für Deine (Eure) Hilfe

Grüße,
Stephan
 
Meine Annahme basiert darauf, dass du typisches DSL hast, also den zwei DSL-Teilnehmern unterschiedliche IP-Adressen zugewiesen werden. Daher können nicht einzelne Pakete auf die verschiedenen Leitungen gegeben werden, sondern nur ganze Verbindungen. Bonding ist ein noch speziellerer Fall von Lastverteilung - hier kommt nämlich nicht mehr der Linux-Routing-Code zum Zuge, sondern die Methoden, die der Bonding-Treiber (üblicherweise Round Robin) bereitstellt, womit sich Bonding hauptsächlich innerhalb eines LANs eignet.
 
OP
M

M4j3stic

Newbie
Hallo,
Hört sich für mich sehr plausibel an.

Kann Du Deinen Code noch ein wenig erläutern?
Hab zwar schon ein bißchen was mit iptables gemacht, aber so richtig versteh ich deinen Code nicht.



Dank & Gruß,

Stephan

EDIT:
Btw wie sieht es dann bei dem Verfahren mit der Ausfallsicherheit?
 
Code:
for i in PREROUTING OUTPUT
soll gelten für alle weiterzuleitenden Pakete (muss man in PREROUTING machen) und für alle lokal generierten Pakete (in OUTPUT zu tun).
Code:
iptables -t mangle -A "$i" -m conntrack --ctstate NEW -j CONNMARK --set-mark 1;
Auf allen (neuen) Verbindungen zunächst "1" setzen.
Code:
iptables -t mangle -A "$i" -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j CONNMARK --set-mark 2;
mit einer Wahrscheinlichkeit von 50% "2" setzen.
Somit ist statistisch gewährleistet, dass 1 und 2 jeweils 50% Zuteilung erhalten.
Code:
iptables -t mangle -A "$i" -j CONNMARK --restore-mark;
Routing ist paketbasiert, also wird die Marke der Verbindung auf das Paket kopiert, um hinterher mittels "ip ru ... fwmark X" das auch klappt.
 
OP
M

M4j3stic

Newbie
Hallo,

Hab den ganzen Spaß jetzt mal in ein Script gepackt:
EDIT:
Code:
#!/bin/sh

# Diese Schleife markiert alle rausgehenden Pakete
#
for i in PREROUTING OUTPUT; do
        iptables -t mangle -A "$i" -m conntrack --ctstate NEW -j CONNMARK --set-mark 1;
# it einer Wahrscheinlickeit von 50% bekommt er die marke 2

        iptables -t mangle -A "$i" -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j CONNMARK --set-mark 2;
        iptables -t mangle -A "$i" -j CONNMARK --restore-mark;
done;

ip route add default via 192.168.178.1 table DSL1 dev eth1

ip route add default via 192.168.178.1 table DSL2 dev eth2

ip rule add from 192.168.1.0/24 table DSL1 priority 100 fwmark 1

ip rule add from 192.168.1.0/24 table DSL2 priority 200 fwmark 2

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

Ich habe in der "/etc/iproute2/rt_tables" noch die 2 Tabellen (DSL1 und DSL2) eingefügt.
Passt das so? Hab ich Dich richtig verstanden?

EDIT: Im 1. Test hervorragende Ergebnisse.
 
Oben