
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:
ativar o encaminhamento de IP com
# sysctl net.ipv4.ip_forward=1"
forneça B como gateway. Claro, o próprio B usa A como seu próprio gateway
- 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 iptables
regra 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.