Encaminhamento de porta com dois roteadores

Encaminhamento de porta com dois roteadores

Tenho servidores atrás de dois IPs públicos diferentes e faço DNAT para enviar o tráfego para diferentes servidores internos dependendo da porta.


-------------------------                  -----------------------
| server a (port 80/tcp)|                  |       router A      |
|   (eth0) 192.168.1.123|..................|192.168.1.1 (eth1)   |
-------------------------         :        |       (eth0) 1.2.3.4|............
                                  :        -----------------------           :
                                  :                                          :
                                  :        -----------------------           :.... INTERNET
-------------------------         :        |       router B      |           :
| server a (port 25/tcp)|         :        |       (eth0) 2.3.4.5|...........:
|   (eth0) 192.168.1.234|..................|192.168.1.2 (eth1)   |
-------------------------                  -----------------------

No roteador A e BI habilitado o encaminhamento e os seguintes iptables:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123

Na verdade tenho a seguinte rota adicionada nos servidores A e B:

route add default gw 192.168.1.1

Assim, todo o tráfego interno para a Internet passa pelo roteador A e todo o tráfego para as portas 25 e 80 é enviado corretamente para os servidores A e B, mas as conexões só funcionam se o tráfego vier pelo roteador A. Na verdade, o tráfego pelo roteador B chega para os servidores, mas é retornado pelo roteador A em vez do B, portanto as conexões não funcionam.

Adicionei uma nova rota nos servidores:

route add default fw 192.168.1.2

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0
0.0.0.0         192.168.1.2     0.0.0.0         UG    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0

Mas as conexões ainda não funcionam.

Como posso gerenciar isso?

Não é importante equilibrar o tráfego Interno -> Externo, mas quero que todas as conexões de entrada da Internet contra os IPs externos sejam estabelecidas corretamente.

OBS: Também tentei fazer o DNAT em um dos roteadores contra o IP externo do outro roteador, mas eles estão em redes diferentes e não funcionou:

iptables -t nat -I PREROUTING -p tcp --dport 25 -d ${ExternalIPA} -i eth0 -j DNAT --to ${ExternalIPB}

Responder1

Sua configuração atual não funcionará conforme esperado. Você precisa ter um IP virtual que flutue Router-Ae Router-B. Isso também equilibrará a carga entre os dois roteadores com simplicidade. Neste exemplo, usarei o padrão da indústriaVRRPem um roteador Linux (Ubuntu-16).

Aqui está o procedimento:

No Linux Router-Ae no Router-B, execute os seguintes comandos:

$ sudo echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
$ sudo sysctl -p

Instale keepalived em ambos os roteadores

$ sudo apt-get update
$ sudo apt-get install keepalived -y

Então vá para Router-Aque atuará como MASTER. Crie um novo arquivo de configuração /etc/keepalived/keepalived.confcom as seguintes entradas:

vrrp_instance VI_1 {
    interface eth1
    state MASTER
    virtual_router_id 50
    priority 101

    authentication {
        auth_type AH
        auth_pass pass123
    }

    virtual_ipaddress {
        192.168.1.99
    }
}

Em seguida, vá para Router-Baquele que atuará como BACKUPe faça o mesmo com o novo arquivo de configuração /etc/keepalived/keepalived.conf:

vrrp_instance VI_1 {
    interface eth1
    state BACKUP
    virtual_router_id 50
    priority 100

    authentication {
        auth_type AH
        auth_pass pass123
    }

    virtual_ipaddress {
        192.168.1.99
    }
}

Explicação:

net.ipv4.ip_nonlocal_bind=1informa ao kernel que o IP virtual NÃO deve estar vinculado a nenhuma interface física.

vrrp_instance VI_1deve corresponder em ambos os roteadores. Este é um identificador, pois você pode ter vários VRRPs em execução no mesmo roteador.

interface eth1é a interface voltada para a LAN (voltada para os servidores internos).

state MASTERcontinuamente Router-Aé autoexplicativo state BACKUP.Router-B

virtual_router_id 50deve corresponder em ambos os roteadores. Este é um identificador.

priority 101continuamente ( o roteador-A tem uma prioridade Router-Amais alta neste caso).priority 100Router-B

authenticationdeve corresponder em ambos os roteadores. Neste caso usei uma chave pré-compartilhada depassw123

virtual_ipaddressé o endereço IP flutuante que o VRRP usará. Este IP deve corresponder em ambos os roteadores. Este IP não deve ser utilizado por nenhum dispositivo no segmento LAN. Neste caso eu escolhi192.168.1.99

Habilitar serviço keepalived

$ sudo systemctl enable keepalived

Iniciar serviço keepalived

$ sudo systemctl start keepalived

É hora de manipular as regras do iptables em ambos os roteadores.

Limpe todas as regras NAT de ambos os roteadores (livre-se de regras NAT quebradas)

$ sudo iptables -t nat -F
$ sudo iptables -t mangle -F

Em seguida, adicione regras NAT corretas:

Roteador-A

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234

Roteador-B

$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123

Isso é tudo que você precisa do lado do roteador. Agora vá para os servidores (Servidor-A e Servidor-B), exclua o gateway padrão existente ( 192.168.1.1) e atribua o novo gateway ( 192.168.1.99)

$ sudo ip route del 0/0
$ sudo route add default gw 192.168.1.99

Quando as conexões são estabelecidas a partir da internet, os dois servidores (Servidor-A e Servidor-B) retornarão o tráfego para o IP virtual ( 192.168.1.99) que está flutuando acima Router-AeRouter-B

Referência:https://www.keepalived.org/manpage.html

Responder2

Finalmente consegui fazê-lo funcionar sem usar IP virtual, basicamente usando CONNNMARK e adicionando diferentes rotas:

OBSERVAÇÃO:

  • Roteador A eth1 MAC = AA:AA:AA:AA:AA:AA
  • Roteador B eth1 MAC = BB:BB:BB:BB:BB:BB

Tenho que adicionar as seguintes rotas e iptables em todos os servidores que usam rotas assimétricas:

# add the two routing tables
ip route add to default table 11 via 192.168.1.1 dev eth0
ip route add to default table 33 via 192.168.1.2 dev eth0

# add the mark to the routing tables
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33

# mark the packets that came from the different routes
iptables -t mangle -A OUTPUT ! -d 192.168.1.0/24 -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source AA:AA:AA:AA:AA:AA -j CONNMARK --set-mark 33
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source BB:BB:BB:BB:BB:BB -j CONNMARK --set-mark 11

Agora tudo está funcionando bem. Todas as conexões da Internet para qualquer um dos endereços IP externos são roteadas através do roteador que gerencia a conexão DNAT.

informação relacionada