capturar pacotes IP quando o gateway não for o roteador do ISP

capturar pacotes IP quando o gateway não for o roteador do ISP

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 funcionando como servidor DNS e DHCP local (executando dnsmasq)
  • C é qualquer cliente conectado ao AP e configurado por 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 proveniente de qualquer cliente C. Aqui está o que fiz em B:

  1. ativar o encaminhamento de IP com

    # sysctl net.ipv4.ip_forward=1"
    
  2. forneça B como gateway. Claro, 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 acessar a internet

O que não funciona.Exceto pela primeira solicitação, parece que B foi 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 redirecionamento ocorre porque C será cortado da Internet se eu desabilitar o encaminhamento de IP em B.

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

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

Responder1

Você precisa do host B para fazer 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 iptablesregra como segue:

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

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

Observe a -s ...parte que limita a regra para ser aplicada apenas aos pacotes provenientes 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 não funciona sem NAT seria que o host B percebe que o pacote entra e sai inalterado na mesma interface, para que possa melhorar a rede informando a C falar diretamente com A sobre o trânsito em questão.

informação relacionada