Load Balancing & NAT-ing mehrerer ISP-Verbindungen unter Linux

15

Ich habe zwei Internetverbindungen von zwei verschiedenen ISPs und muss den Verkehr zwischen den beiden ISPs von und zu meinem Netzwerk verteilen. Ich benutze Debian GNU / Linux.

Mein Setup ist wie folgt -

eth0 (192.168.0.0/24) - Lokales Netzwerk

eth1 (192.168.1.0/24) - ISP # 1

eth2 (192.168.2.0/24) - ISP # 2

Mein lokales Netzwerk ist über eth0 mit diesem Server verbunden und die Box ist der DHCP-Server mit Gateway für alle Maschinen im LAN.

Der Server muss einen Lastenausgleich zwischen den beiden Internetdienstanbietern durchführen und muss auch NAT durchführen.

Ich habe die Routing-Anweisungen auf lartc.org befolgt , benötige jedoch weiterhin Anweisungen, um das NAT-ing ordnungsgemäß durchzuführen .

Jede Hilfe wird geschätzt.

PS - Ich kenne mich mit pFsense aus, muss aber Linux verwenden.

Baishampayan Ghose
quelle
2
welche art von anleitung brauchst du alles ist auf lartc.org erklärt. Haben Sie ein besonderes Problem?
Lorenzog

Antworten:

19

Ich habe den Lastenausgleich sowohl mit der Methode lartc.org als auch mit der Methode iptables durchgeführt und finde, dass die Methode iptables einfacher zu verstehen und zu implementieren ist. Der einzige Nachteil ist , dass Sie eine ziemlich neue brauchen iptables - Version in der Lage sein zu verwenden Statistikmodul

Nehmen wir ein paar Dinge an:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, Gateway: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, Gateway: 192.168.2.2/24

So würde ich mit der iptables-Methode vorgehen:

Routentabellen

Bearbeiten Sie zuerst die / etc / iproute2 / rt_tables, um eine Karte zwischen Routentabellennummern und ISP-Namen hinzuzufügen

...
10 ISP1
20 ISP2
...

Die Tabellen 10 und 20 gelten also für ISP1 bzw. ISP2. Ich muss diese Tabellen mit Routen aus der Haupttabelle mit diesem Codeausschnitt füllen (den ich aus hxxp entnommen habe: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

Fügen Sie ISP1 über das Gateway dieses ISP1 ein Standardgateway hinzu:

ip route add default via 192.168.1.2 table ISP1

Machen Sie dasselbe für ISP2

Jetzt habe ich 2 Routentabellen, eine für jeden ISP.

Iptables

OK, jetzt verwende ich iptables, um Pakete gleichmäßig auf die einzelnen Routentabellen zu verteilen. Weitere Informationen zu dieser Arbeit finden Sie hier ( http://www.diegolima.org/wordpress/?p=36 ) und hier ( http://home.regit.org/?page_id=7 ).

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

Nun NAT ist einfach:

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
mefat
quelle
3
Gute Antwort mit Links. Dazu benötigen Sie nicht unbedingt eine neue iptables, da vor der Statistikübereinstimmung zufällige und n-te Übereinstimmungen vorhanden waren, für die der Server dieselbe Rolle hat.
SiegeX
1
Ich habe eine Frage zu den Markierungen auf Iptables. Auf dem bereitgestellten Link markieren sie nur die Pakete, die dem neuen Status entsprechen. Warum machst du das anders?
Matías
Kann ich ein weiteres Netzwerk wie ISP3, ISP4 usw. verwenden?
Vitor Mazuco
3

Die Antwort von mefat hat mir sehr geholfen, aber anstatt eine einmalige Kopie aller Regeln der Haupttabelle in die beiden ISP-Tabellen zu kopieren, ist es möglicherweise besser, das Regel-Prio zu verwenden, um die Standardregeln nach der Haupttabelle hinzuzufügen.

Richten Sie / etc / iproute2 / rt_tables wie gewohnt ein:

...
10 ISP1
20 ISP2
...

Beachten Sie, dass

ip rule show

Zeigt die Regeln 0-> local, 32766-> main und 32767-> default an. Sehen Sie man ipfür weitere Details.

Entscheidend ist, dass der Routing-Prozess von Low-Prio-Regeln zu High-Prio-Regeln funktioniert ... aber 32767 ist nicht die höchste Regel #. Wenn die Hauptrouting-Tabelle also keine Standardroute enthält (aber möglicherweise alle Arten von sich dynamisch ändernden Routen für VPNs usw. enthält), wird bei Nichtübereinstimmung die Standardroute (normalerweise leer) verwendet und nach höheren Prio-Regeln gesucht.

Siehe den Abschnitt 'throw' hier: http://linux-ip.net/html/routing-tables.html

Also jetzt einrichten

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

und um sicherzugehen, dass sie sich um den Haupttisch kümmern:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

Verwenden

ip rule show

erneut, um sicherzustellen, dass diese Regeln höher sind als main

Dann benutze CONNMARK Mangling, wie Mefat sagte:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

Dinge, die zu beachten sind: pppd muss nodefaultrouteansonsten in main eingerichtet werden; Beim Neustart eines Geräts werden die ISP1 / ISP2-Tabellen bereinigt. Sie müssen daher mithilfe eines Skripts wiederhergestellt werden.

Ich benutze ein Skript in /etc/ppp/ip-{up,down}.d/dual-routing

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

Dies ist ein verbindungsbasierter Lastenausgleich. Daher werde ich die Verwendung von Load zum Überwachen und Ersetzen der Statistikregel untersuchen: iptables -t mangle -R PREROUTING <n>From Userspace. Wenn also eine Verbindung über einen längeren Zeitraum heruntergeladen wird und die andere Verbindung leicht geladen ist, sollten wir die leicht geladene Verbindung vorziehen.

lbt
quelle