Linux come router con più provider Internet


16

Linux come router: ho 3 provider Internet, ognuno con il proprio modem.

Provider1 , che è l'indirizzo gateway 192.168.1.1
Connesso al router linux eth1 /192.168.1.2

Provider2 , indirizzo gateway 192.168.2.1
Connesso al router linux eth2 /192.168.2.2

Provider3 , indirizzo gateway 192.168.3.1
Connesso al router linux 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 |       |
                                                   +------------+       \________

Vorrei instradare i client nella rete 10.0.0.0/24 tramite IP di origine verso diversi gateway.
L'interfaccia per la rete client è eth0 /10.0.0.1, che è il gateway predefinito per tutti i client.

Ad esempio:
10.0.0.11 deve essere indirizzato a Provider1 @ eth1
10.0.0.12 deve essere indirizzato a Provider2 @ eth2
... e così via ...

Penso di dover usare ip routee iptablesper SNAT, ma non ho capito esattamente come.
Ecco la sceneggiatura che ho finora.
l'inoltro ipv4 è abilitato.

#!/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

È necessario aggiungere CONNMARK, credo, per salvare / ripristinare il segno in modo che possa essere applicato ai pacchetti 2..n (che sarà NAT'd dal tracciamento della connessione)
derobert

Ho aggiunto una risposta con estratti della configurazione che usiamo qui. Proverò a fare il check-in durante il fine settimana per chiarire qualsiasi cosa ...
derobert il

Risposte:


13

Ecco una configurazione simile da uno dei nostri router (con alcune cose irrilevanti tagliate). Si noti che questo gestisce anche le connessioni in entrata .

Notare l'uso di variabili anziché numeri di marcatura codificati. Molto più facile da mantenere! Sono memorizzati in uno script separato e inseriti. I nomi delle tabelle sono configurati in /etc/iproute2/rt_tables. I nomi dell'interfaccia sono impostati in /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

E le regole:

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

Le tabelle di routing vengono configurate in /etc/network/interfacesmodo tale che, togliendo un'interfaccia, si passa a usarne un'altra:

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

Nota: se stai eseguendo anche il filtro (cosa che probabilmente stai facendo) dovrai anche aggiungere le regole appropriate FORWARDal ACCEPTtraffico. Soprattutto per qualsiasi traffico in entrata.


Grazie mille! Ora ho intenzione di modificare questo alle mie esigenze, caricarlo sulla scatola e aggiornare questo post.
Flav

Funziona come un incantesimo, grazie ancora. Fatta eccezione per l'ordine pref / route predefinita a "comcast". (Per me dovrebbe essere eth2) Ma penso di averlo aggirato aggiungendo una regola generale ip rule add from 10.0.0.0/24 pref 1400 lookup eth2e creando in seguito le eccezioni.
Flav

1
@Flav puoi anche impostare le tue eccezioni con i segni del firewall (in PREROUTING). A proposito: una delle domande collegate ( unix.stackexchange.com/questions/70440/… ) contiene ulteriori spiegazioni su parte di questa configurazione. Quelle regole ip / mask sono in realtà per il traffico non NAT nella mia configurazione (SNAT accade in POSTROUTING, quindi dopo le cose della regola ip)
derobert
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.