captura pacotes ip quando o gateway não é o roteador do ISP

0

Na minha rede doméstica, tenho a seguinte topologia

          Internet
              |
     wifi     |
C ----------- A ---------- B

onde

  • A (IP estático 192.168.0.254) é o roteador / AP fornecido pelo meu ISP.
  • B (IP estático 192.168.0.1) é uma máquina linux que funciona como servidor DNS e DHCP local (executando dnsmasq)
  • C é qualquer cliente conectado ao AP e configurado pelo DHCP.

Por enquanto, o gateway padrão fornecido por B (como servidor DHCP) é apenas A.

Então, suponha que eu queira capturar em B todo o tráfego vindo de qualquer cliente C. Veja o que eu fiz em B:

  1. ativar o encaminhamento de IP com

    # sysctl net.ipv4.ip_forward=1"
    
  2. forneça B como gateway. É claro que o próprio B usa A como seu próprio gateway

  3. execute o tcpdump em B para ver o que está acontecendo

Em um cliente C, inicio qualquer solicitação, por exemplo

$ traceroute www.google.com

Agora, espero que o tráfego originado de C seja roteado para B, depois para A e, finalmente, para a Internet.

O que funciona. C é capaz de alcançar a internet

O que não funciona. Exceto pela primeira requisição, parece que B é completamente ignorado: tcpdump não mostra nada; o endereço de B não aparece na saída do traceroute. Ainda assim, tenho certeza de que o reencaminhamento ocorre porque o C é cortado da Internet se eu desabilitar o encaminhamento de IP no B.

Se algum tipo de curto-circuito acontecer, como posso evitá-lo?

Aviso de isenção de responsabilidade : sei que alterar a topologia da rede pode resolver o problema de "capturar todo o tráfego" (por exemplo, espelhamento de porta etc.), mas realmente quero entender o que está acontecendo com minha configuração e como corrigir isso sem alterar a topologia.

    
por theuncle 20.11.2017 / 11:59

1 resposta

0

Você precisa que o host B faça traduções NAT para que A não veja o mesmo pacote novamente. Em vez disso, B deve enviar pacotes através de A como se fossem originados de B. Para conseguir isso, você adiciona uma regra iptables da seguinte forma:

# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE

Por essa regra, todos os pacotes de B serão reescritos para serem originados de B, mas mantendo uma tabela de retrotraduções, para que as respostas associadas possam ser retrotraduzidas e enviadas para C.

Observe a parte -s ... que limita a regra a ser aplicada apenas aos pacotes originados de C (ou pode ser definida como a LAN local) e, por exemplo, não aos pacotes de resposta.

EDIT (levando em consideração o comentário do theuncle): A explicação de por que ele não funciona sem o NAT seria que o host B perceba que o pacote entra e sai inalterado na mesma interface, para melhorar o trabalho em rede. dizendo a C para falar diretamente com A sobre o tráfego em questão.

    
por 20.11.2017 / 12:30