![Encaminhamento de porta com dois roteadores](https://rvso.com/image/761005/Encaminhamento%20de%20porta%20com%20dois%20roteadores.png)
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-A
e 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-A
e 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-A
que atuará como MASTER
. Crie um novo arquivo de configuração /etc/keepalived/keepalived.conf
com 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-B
aquele que atuará como BACKUP
e 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=1
informa ao kernel que o IP virtual NÃO deve estar vinculado a nenhuma interface física.
vrrp_instance VI_1
deve 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 MASTER
continuamente Router-A
é autoexplicativo state BACKUP
.Router-B
virtual_router_id 50
deve corresponder em ambos os roteadores. Este é um identificador.
priority 101
continuamente ( o roteador-A tem uma prioridade Router-A
mais alta neste caso).priority 100
Router-B
authentication
deve 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-A
eRouter-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.