Linux als Router mit mehreren Internetprovidern

16

Linux als Router: Ich habe 3 Internetprovider mit jeweils eigenem Modem.

Provider1 , Gateway-Adresse 192.168.1.1
Verbunden mit Linux-Router eth1 /192.168.1.2

Provider2 , Gateway-Adresse 192.168.2.1
Verbunden mit Linux-Router eth2 /192.168.2.2

Provider3 , Gateway-Adresse 192.168.3.1
Verbunden mit Linux-Router eth3 /192.168.3.2

                                                                           ________
                                                   +------------+         /
                                                   |            |        |
                            +----------------------+ Provider 1 +--------|
        __                  |192.168.1.2           |192.168.1.1 |       /
    ___/  \_         +------+-------+              +------------+      |
  _/        \__      |    eth1      |              +------------+      /
 /             \ eth0|              |192.168.2.2   |            |      |
|Client network -----+  ROUTER  eth2|--------------+ Provider 2 +------|     Internet
 \10.0.0.0/24 __/    |              |              |192.168.2.1 |      |
   \__     __/       |    eth3      |              +------------+      \
      \___/          +------+-------+              +------------+       |
                            |192.168.3.2           |            |       \
                            +----------------------+ Provider 3 +-------|
                                                   |192.168.3.1 |       |
                                                   +------------+       \________

Ich möchte die Clients im Netzwerk 10.0.0.0/24 nach Quell-IP an verschiedene Gateways weiterleiten.
Die Schnittstelle zum Client-Netzwerk ist eth0 / 10.0.0.1. Dies ist das Standard-Gateway für alle Clients.

Beispiel:
10.0.0.11 sollte an Provider1 @ eth1 weitergeleitet werden
10.0.0.12 sollte an Provider2 @ eth2 weitergeleitet werden
... und so weiter ...

Ich denke, ich muss ip routeund iptablesfür SNAT verwenden, aber ich habe nicht genau herausgefunden, wie.
Hier ist das Skript, das ich bisher habe.
Die IPv4-Weiterleitung ist aktiviert.

#!/bin/bash
# flush tables
ip route flush table connection1
ip route flush table connection2
ip route flush table connection3

# add the default gateways for each table
ip route add table connection1 default via 192.168.1.1
ip route add table connection2 default via 192.168.2.1
ip route add table connection3 default via 192.168.3.1

# add some IP addresses for marking
iptables -t mangle -A PREROUTING -s 10.0.0.11 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s 10.0.0.12 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -s 10.0.0.13 -j MARK --set-mark 3

# add the source nat rules for each outgoing interface
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.2
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.2.2
iptables -t nat -A POSTROUTING -o eth3 -j SNAT --to-source 192.168.3.2

# link routing tables to connections (?)
ip rule add fwmark 1 table connection1
ip rule add fwmark 2 table connection2
ip rule add fwmark 3 table connection3

#default route for anything not configured above should be eth2
Flav
quelle
Sie müssen in CONNMARK hinzufügen, glaube ich, um die Marke zu speichern / wiederherzustellen , so kann es auf Pakete 2..n angewendet werden (die NAT'd durch Connection Tracking wird)
Derobert
Ich habe eine Antwort mit Auszügen aus der hier verwendeten Konfiguration hinzugefügt. Ich werde versuchen, über das Wochenende
einzuchecken

Antworten:

13

Hier ist ein ähnliches Setup von einem unserer Router (mit etwas irrelevantem Material). Beachten Sie, dass dies auch eingehende Verbindungen behandelt.

Beachten Sie die Verwendung von Variablen anstelle von fest codierten Markierungsnummern. So viel einfacher zu warten! Sie werden in einem separaten Skript gespeichert und stammen aus. Tabellennamen werden in konfiguriert /etc/iproute2/rt_tables. Schnittstellennamen werden eingestellt /etc/udev/rules.d/70-persistent-net.rules.

##### fwmark ######
iptables -t mangle -F
iptables -t mangle -X

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j RETURN # if already set, we're done
iptables -t mangle -A PREROUTING -i wan      -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A PREROUTING -i comcast  -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A PREROUTING -i vz-dsl   -j MARK --set-mark $MARK_VZDSL

iptables -t mangle -A POSTROUTING -o wan     -j MARK --set-mark $MARK_CAVTEL
iptables -t mangle -A POSTROUTING -o comcast -j MARK --set-mark $MARK_COMCAST
iptables -t mangle -A POSTROUTING -o vz-dsl  -j MARK --set-mark $MARK_VZDSL
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

##### NAT ######
iptables -t nat -F
iptables -t nat -X
for local in «list of internal IP/netmask combos»; do
    iptables -t nat -A POSTROUTING -s $local -o wan     -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o comcast -j SNAT --to-source «IP»
    iptables -t nat -A POSTROUTING -s $local -o vz-dsl  -j SNAT --to-source «IP»
done

# this is an example of what the incoming traffic rules look like
for extip in «list of external IPs»; do
    iptables -t nat -A PREROUTING   -p tcp -d $extip --dport «port» -j DNAT --to-destination «internal-IP»:443
done

Und die Regeln:

ip rule flush
ip rule add from all               pref 1000  lookup main 
ip rule add from A.B.C.D/29        pref 1500  lookup comcast # these IPs are the external ranges (we have multiple IPs on each connection)
ip rule add from E.F.G.H/29        pref 1501  lookup cavtel
ip rule add from I.J.K.L/31        pref 1502  lookup vzdsl
ip rule add from M.N.O.P/31        pref 1502  lookup vzdsl # yes, you can have multiple ranges
ip rule add fwmark $MARK_COMCAST   pref 2000  lookup comcast
ip rule add fwmark $MARK_CAVTEL    pref 2001  lookup cavtel
ip rule add fwmark $MARK_VZDSL     pref 2002  lookup vzdsl
ip rule add                        pref 2500  lookup comcast # the pref order here determines the default—we default to Comcast.
ip rule add                        pref 2501  lookup cavtel
ip rule add                        pref 2502  lookup vzdsl
ip rule add                        pref 32767 lookup default

Die Routing-Tabellen werden so eingerichtet /etc/network/interfaces, dass beim Herunterfahren einer Schnittstelle eine andere verwendet wird:

iface comcast inet static
        address A.B.C.Q
        netmask 255.255.255.248
        up ip route add table comcast default via A.B.C.R dev comcast
        down ip route flush table comcast

Hinweis: Wenn Sie tun und Filterung (die Sie wahrscheinlich sind) werden Sie auch die entsprechenden Regeln hinzufügen müssen , FORWARDum ACCEPTden Verkehr. Vor allem für eingehenden Verkehr.

derobert
quelle
Vielen Dank! Ich werde dies nun an meine Bedürfnisse anpassen, es auf die Box laden und diesen Beitrag aktualisieren.
Flav
Funktioniert wie ein Zauber, danke nochmal. Mit Ausnahme der Voreinstellung / Standardroute zu "comcast". (Für mich sollte das eth2 sein.) Aber ich denke, ich habe es umgangen, indem ich eine allgemeine Regel hinzugefügt ip rule add from 10.0.0.0/24 pref 1400 lookup eth2und anschließend die Ausnahmen erstellt habe.
Flav
1
@Flav Sie können Ihre Ausnahmen auch mit den Firewall-Markierungen festlegen (in PREROUTING). Übrigens: Eine der verknüpften Fragen ( unix.stackexchange.com/questions/70440/… ) enthält weitere Erklärungen zu einem Teil dieser Konfiguration. Diese IP / Mask-Regeln gelten eigentlich für nicht-NAT-Datenverkehr in meiner Konfiguration (SNAT findet in POSTROUTING statt, daher nach den IP-Regeln)
derobert