Eu gostaria de capturar o tráfego nas interfaces virtuais do Linux, para fins de depuração. Tenho feito experiências com veth
, tun
e dummy
interface de tipos; nos três, estou tendo problemas tcpdump
para mostrar qualquer coisa.
Aqui está como eu configuro a interface fictícia:
ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up
Em um terminal, assista-o com tcpdump
:
tcpdump -i dummy10
Em um segundo, ouça com nc
:
nc -l 99.99.99.1 2048
Em um terceiro, faça uma solicitação HTTP com curl
:
curl http://99.99.99.1:2048/
Embora no terminal 2 possamos ver os dados da curl
solicitação, nada aparece tcpdump
.
Um tutorial Tun / Tap esclarece algumas situações em que o kernel pode realmente não enviar pacotes quando um está operando em uma interface local:
Olhando para a saída do tshark, não vemos ... nada. Não há tráfego passando pela interface. Isso está correto: como estamos executando o ping do endereço IP da interface, o sistema operacional decide corretamente que nenhum pacote precisa ser enviado "on the wire" e o próprio kernel está respondendo a esses pings. Se você pensar bem, é exatamente o que aconteceria se você pingasse o endereço IP de outra interface (por exemplo, eth0): nenhum pacote seria enviado. Isso pode parecer óbvio, mas pode ser uma fonte de confusão a princípio (era para mim).
No entanto, é difícil ver como isso pode se aplicar aos pacotes de dados TCP.
Talvez tcpdump
deva estar vinculado à interface de uma maneira diferente?
Respostas:
O tráfego está passando pela
lo
interface.Quando um IP é adicionado a uma caixa, uma rota para esse endereço é adicionada à tabela 'local'. Todas as rotas nesta tabela direcionam o tráfego pela interface de loopback.
Você pode visualizar o conteúdo da tabela 'local' com o seguinte:
Que no meu sistema se parece com isso:
Então, basicamente, se eu enviar qualquer tráfego para
10.230.134.38
,127.0.0.0/8
,127.0.0.1
(redundante) ,172.17.42.1
ou192.168.0.20
, o tráfego vai ser encaminhadas através da interface de auto-retorno, mesmo que esses IPs são realmente em uma interface diferente.fonte
Você pode usar
tcpdump
com qualquer interface no host (tcpdump -i any ...
)fonte
Isso deve ser possível invocando um segundo sistema (pode até ser uma VM nesse host).
Você pode usar
DNAT
naOUTGOING
cadeia danat
tabela e redirecionar os pacotes para uma interface que o kernel não controla. Você precisa refleti-los lá:fonte