Linux comme routeur avec plusieurs fournisseurs Internet

16

Linux comme routeur: j'ai 3 fournisseurs Internet, chacun avec son propre modem.

Provider1 , qui est l'adresse de passerelle 192.168.1.1
Connecté au routeur linux eth1 /192.168.1.2

Provider2 , adresse de passerelle 192.168.2.1
Connecté au routeur linux eth2 /192.168.2.2

Provider3 , adresse de passerelle 192.168.3.1
Connecté au routeur 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 |       |
                                                   +------------+       \________

Je voudrais router les clients du réseau 10.0.0.0/24 par IP source vers différentes passerelles.
L'interface avec le réseau client est eth0 /10.0.0.1, qui est la passerelle par défaut pour tous les clients.

Par exemple:
10.0.0.11 doit être routé vers Provider1 @ eth1
10.0.0.12 doit être routé vers Provider2 @ eth2
... et ainsi de suite ...

Je pense que je dois utiliser ip routeet iptablespour SNAT, mais je n'ai pas compris exactement comment.
Voici le script que j'ai jusqu'à présent.
le transfert ipv4 est activé.

#!/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
la source
Vous devez ajouter CONNMARK, je pense, pour enregistrer / restaurer la marque afin qu'elle puisse être appliquée aux paquets 2..n (qui seront NAT par le suivi des connexions)
derobert
J'ai ajouté une réponse avec des extraits de la configuration que nous utilisons ici. J'essaierai de vérifier ce week-end pour clarifier quoi que ce soit ...
derobert

Réponses:

13

Voici une configuration similaire de l'un de nos routeurs (avec des trucs non pertinents coupés). Notez que cela gère également les connexions entrantes .

Notez l'utilisation de variables au lieu de numéros de repère codés en dur. Tellement plus facile à entretenir! Ils sont stockés dans un script séparé et fournis dans. Les noms de table sont configurés dans /etc/iproute2/rt_tables. Les noms d'interface sont définis /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

Et les règles:

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

Les tables de routage sont configurées /etc/network/interfaces, de sorte que la suppression d'une interface permet de passer à une autre:

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

Remarque: Si vous effectuez également le filtrage (ce que vous êtes probablement), vous devrez également ajouter les règles appropriées FORWARDau ACCEPTtrafic. Surtout pour tout trafic entrant.

derobert
la source
Merci beaucoup! Je vais maintenant modifier cela à mes besoins, le charger sur la boîte et mettre à jour ce message.
Flav
Fonctionne comme un charme, merci encore. Sauf pour l'ordre préféré / l'itinéraire par défaut vers «comcast». (Pour moi, cela devrait être eth2) Mais je pense que j'ai travaillé en ajoutant une règle générale ip rule add from 10.0.0.0/24 pref 1400 lookup eth2et en créant des exceptions par la suite.
Flav
1
@Flav, vous pouvez également définir vos exceptions avec les marques de pare-feu (dans PREROUTING). BTW: Une des questions liées ( unix.stackexchange.com/questions/70440/… ) a plus d'explications sur une partie de cette configuration. Ces règles ip / mask sont en fait pour le trafic non NAT dans ma configuration (SNAT se produit dans POSTROUTING, donc après les règles ip)
derobert