Use iptables como roteador

3

Estou com a seguinte configuração:

client:192.168.103.55"router"  
192.168.103.30 (eth3), 192.168.102.30 (eth2) 

server-1                   server-2
192.168.102.21 (eth2)      192.168.102.22 (eth2)

O roteador é na verdade uma pequena máquina linux, rodando o iptables.

O objetivo é configurar o iptables de tal forma que eu possa pingar dos servidores (192.168.102.21 e .22) para o cliente (192.168.103.55), através do roteador (192.168.102.30 no lado do servidor e 192.168 .103.30 no lado do cliente)

Os servidores têm uma rota configurada como:

192.168.103.55 via 192.168.102.30 dev eth2 

No roteador eu configurei as seguintes regras em tabelas IP:

*filter
:INPUT ACCEPT [1610193:248234329]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1945999:238163662]
-A FORWARD -i eth3 -j ACCEPT
-A FORWARD -o eth3 -j ACCEPT
-A FORWARD -i eth2 -j ACCEPT
-A FORWARD -o eth2 -j ACCEPT
COMMIT
# Completed on Wed May  2 08:26:55 2018
# Generated by iptables-save v1.4.21 on Wed May  2 08:26:55 2018
*nat
:PREROUTING ACCEPT [5610:715368]
:INPUT ACCEPT [2029:121740]
:OUTPUT ACCEPT [326029:19788110]
:POSTROUTING ACCEPT [326029:19788110]
-A POSTROUTING -d 192.168.103.55/32 -o eth3 -j SNAT --to-source 192.168.103.30
COMMIT

O ping de 192.168.102.21 está chegando ao cliente (192.168.103.55), e o cliente envia a resposta para 192.168.103.30. Mas a resposta não é encaminhada para o cliente (.55). Ele fica preso no roteador

O que estou perdendo aqui?

Agradecemos antecipadamente pelo seu tempo!

=================== UPDATE ===================

Sugestão de Guntbert em O encaminhamento já foi feito.

A regra SNAT é necessária para que o roteador saiba a qual servidor encaminhar a resposta ICMP. Na minha primeira explicação, deixei de fora o segundo servidor. Atualizei a pergunta agora para obter uma visão geral completa.

O SNAT parece funcionar de alguma forma, desde que eu posso ver o pacote de resposta ICMP indo para o servidor correto:

[router ~]# tcpdump -ni eth2 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes

08:38:26.110245 IP 192.168.102.21 > 192.168.103.55: ICMP echo request, id 4471, seq 1, length 64
08:38:26.112722 IP 192.168.103.55 > 192.168.102.21: ICMP echo reply, id 4471, seq 1, length 64

08:39:53.238281 IP 192.168.102.22 > 192.168.103.55: ICMP echo request, id 8285, seq 1, length 64
08:39:53.239110 IP 192.168.103.55 > 192.168.102.22: ICMP echo reply, id 8285, seq 1, length 64

O que realmente deve acontecer a seguir, eu acho, é que o IP de origem (192.168.103.55) na resposta precisa ser substituído pelo IP do roteador (192.168.102.30). Ou estou errado?

    
por Radje 13.04.2018 / 13:42

1 resposta

3

  1. você precisa ativar o encaminhamento de pacotes no kernel

    • edite /etc/sysctl.conf e ative a linha

      net.ipv4.ip_forward=1
      

      removendo # no início.

    • reinicialize ou ative a configuração imediatamente com

      echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
      
  2. Não use SNAT (na verdade, não use nenhum tipo de NAT em tudo ). Você tem duas redes, o roteador está conectado a ambos (tem uma perna em ambos). Então remova a terceira linha do seu iptables -rules.

    • remova a regra de NAT do roteador
    • configura todos os sistemas para alcançar a "outra" rede através do roteador
      • nos servidores substitua sua rota com% 192.168.103.0/24 via 192.168.102.30 dev eth2
        (isso diz a eles como alcançar toda a rede, não apenas um cliente)
      • no cliente, adicione a seguinte rota em 192.168.102.0/24 via 192.168.103.30 dev eth0

Agora, você verá que todos os pacotes dos dois servidores alcançarão o cliente com o endereço de origem original. O cliente sabe como chegar a esse endereço de origem e pode enviar uma resposta exatamente ao servidor que fez o ping.

    
por guntbert 13.04.2018 / 23:44