Como carregar o tráfego entre dois dispositivos NAT independentes usando o kernel do Linux?

2

Eu tenho uma rede com várias estações de trabalho / servidores Linux, e duas conexões de Internet, cada uma com um roteador NAT de nível de consumidor na frente dela. Então, para a concretude, digamos que os dispositivos são:

192.0.2.0/26  network
192.0.2.1     router A
192.0.2.62    router B
192.0.2.10    host X
192.0.2.11    host Y

Aqui está um diagrama, semelhante a um no LARTC HOWTO:

                                                             ________
                                           +------------+        /
                                           |            |       |
         +-----------+-[NAT router A]------+ Provider 1 +-------
        _|                                 |            |     /
    ___/  \_         +--------------+      +------------+    |
  _/        \__      | Linux host   |                      /
 /             \     |              |                      |
| Local network -----+  if1         |                      |     Internet
 \_           __/    |              |                      |
   \__     __/       |              |                      \
      \___/          +--------------+     +------------+    |
        |                                 |            |     \
        +---------------[NAT router B]----+ Provider 2 +-------
                                          |            |       |
                                          +------------+        \________

Se uma nova conexão TCP entrar por meio de um ou outro roteador, o tráfego de retorno precisa ser enviado por meio desse roteador. Caso contrário, o pacote SYN de retorno será indevidamente NATted (se mesmo desmaiado de todo), e a conexão será efetivamente blackholed. Eu poderia configurar conjuntos de encaminhamento de porta mutuamente exclusivos nos dois roteadores se isso ajudasse, mas prefiro mantê-los iguais (ou pelo menos em alguns casos se sobrepondo), se possível.

Para novas conexões de saída, desejo alocar tráfego por intervalo usando a tabela de roteamento principal, mas para determinado tráfego, convém equilibrar aleatoriamente novas conexões entre os dois roteadores.

Suspeito que o que estou perguntando é factível usando iptables e ip , ou talvez apenas uma dessas ferramentas. No entanto, os HOWTOs e outras respostas que eu encontrei parecem endereçar um único roteador (rodando Linux), ou host, com múltiplas interfaces ... não políticas entre múltiplos roteadores conectados à mesma interface.

Editar : encontrei um outro pergunta , também não respondida, que está perguntando sobre a mesma situação (note 192.168.0.0/23 como a rede local), mas se concentra na política de tráfego de saída; Minha pergunta aqui é especificamente sobre a política de tráfego de entrada. (Ambos os dispositivos NAT possuem uma função "port forward by port-range para host".)

    
por david 21.08.2016 / 14:17

1 resposta

1

Sim, é possível fazer isso usando iptables e ip juntos. No meu caso, todas as caixas Linux em questão rodam o Debian Stable, então eu escrevi um script personalizado para /etc/network/if-up.d .

# First set up two routing-tables
ip route add to default table 11 via 192.0.2.1  dev $IFACE
ip route add to default table 33 via 192.0.2.62 dev $IFACE

# ... and rules to use them.
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33

# Copy connmark to fwmark for applicable outgoing packets.
iptables -t mangle -A OUTPUT ! -d 192.0.2.0/26 \
  -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark

# Set connmark for applicable incoming packets.
iptables -A INPUT -i $IFACE ! -s 192.0.2.0/26 \
  -m addrtype --src-type UNICAST \
  -m mac --mac-source 00:00:5E:00:53:05 \
  -j CONNMARK --set-mark 11
iptables -A INPUT -i $IFACE ! -s 192.0.2.0/26 \
  -m addrtype --src-type UNICAST \
  -m mac --mac-source 00:00:5E:00:53:07 \
  -j CONNMARK --set-mark 33

Note que é definido nessa ordem para que a coisa toda tenha efeito com os dois últimos comandos. 00:00:5E:00:53:05 e 00:00:5E:00:53:07 seriam os endereços no link dos dois dispositivos NAT.

    
por 02.09.2016 / 19:56