Linux como roteador com vários provedores de internet

16

Linux como roteador: Eu tenho 3 provedores de Internet, cada um com seu próprio modem.

Provedor1 , que é o endereço de gateway 192.168.1.1
Conectado ao roteador linux eth1 /192.168.1.2

Provider2 , endereço de gateway 192.168.2.1
Conectado ao roteador linux eth2 /192.168.2.2

Provider3 , endereço de gateway 192.168.3.1
Conectado ao roteador 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 |       |
                                                   +------------+       \________

Gostaria de rotear os clientes na rede 10.0.0.0/24 por IP de origem para diferentes gateways.
A interface para a rede do cliente é eth0 /10.0.0.1, que é o gateway padrão para todos os clientes.

Por exemplo:
10.0.0.11 deve ser roteado para Provider1 @ eth1
10.0.0.12 deve ser roteado para Provider2 @ eth2
... e assim por diante ...

Eu acho que preciso usar ip routee iptablespara o SNAT, mas ainda não descobri exatamente como.
Aqui está o script que eu tenho até agora.
o encaminhamento de ipv4 está ativado.

#!/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
fonte
Você precisa adicionar em CONNMARK, penso eu, para salvar / restaurar a marca para que possa ser aplicada a pacotes 2..n (que será NAT'd por rastreamento de conexão)
derobert
Adicionei uma resposta com trechos da configuração que usamos aqui. Vou tentar fazer check-in no fim de semana para esclarecer qualquer coisa ...
derobert

Respostas:

13

Aqui está uma configuração semelhante de um de nossos roteadores (com algumas coisas irrelevantes cortadas). Observe que isso também lida com conexões de entrada .

Observe o uso de variáveis ​​em vez de números de marca codificados. Muito mais fácil de manter! Eles são armazenados em um script separado e originados. Os nomes das tabelas são configurados /etc/iproute2/rt_tables. Os nomes da interface estão definidos /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 as regras:

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

As tabelas de roteamento são configuradas /etc/network/interfacespara que a desativação de uma interface mude para o uso de uma interface diferente:

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 você estiver fazendo filtragem também (o que provavelmente é), também precisará adicionar as regras apropriadas FORWARDao ACCEPTtráfego. Especialmente para qualquer tráfego de entrada.

derobert
fonte
Muito obrigado! Agora vou modificar isso de acordo com minhas necessidades, carregá-lo na caixa e atualizar esta postagem.
Flav
Funciona como um encanto, obrigado novamente. Exceto pela rota de pré-ordem / padrão para 'comcast'. (Para mim, deveria ser eth2) Mas acho que resolvi adicionando uma regra geral ip rule add from 10.0.0.0/24 pref 1400 lookup eth2e criando as exceções posteriormente.
quer
11
@Flav, você também pode definir suas exceções com as marcas de firewall (em PREROUTING). Entre: Uma das perguntas vinculadas ( unix.stackexchange.com/questions/70440/… ) tem mais explicações sobre parte dessa configuração. Essas regras IP / máscara são realmente para o tráfego não-NAT'd na minha config (SNAT acontece em POSTROUTING, portanto, após o material regra ip)
derobert