2009-08-13 22:44:50 +0000 2009-08-13 22:44:50 +0000
82
82

Qual é a maneira mais fácil de farejar dados de tráfego TCP no Linux?

Quero uma forma simples de mostrar todos os dados TCP (não os cabeçalhos TCP ou qualquer outra coisa) passando por qualquer interface na minha caixa Linux.

Por exemplo, quero um comando mágico que, se o fizer:

magic_commmand_I_want port=1234

então se houvesse um servidor a ouvir na porta 1234 na minha máquina, e alguém o fizesse:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

Então o comando mágico apenas imprimia:

hello

Tentei “tcpdump”, “ethereal”, “tethereal”, “tshark”, e outros, mas não é óbvio como os conseguir:

  • não mostrar endereços IP ou outros metadados
  • mostrar apenas os “dados” enviados, não pacotes individuais e os seus cabeçalhos
  • imprimir os dados tal como estão, não em hex, e não com marcadores de compensação de pacotes
  • farejar to tráfego de rede (quer esteja em eth0 ou eth1 ou lo, etc. …)

Sim, provavelmente poderia juntar um conjunto encadeado de comandos unix para fazer isto, mas isso não é muito fácil de lembrar para a próxima vez :)

Se tiver um exemplo simples de uma linha de comando exacta que faça isto, é isso que eu gostaria.

Respostas (7)

109
109
109
2009-08-14 17:05:54 +0000

Actualização:

Como apontado por Michal nos comentários: A partir da versão tcpflow 1.3 a opção -e é utilizada para especificar o nome do scanner. Assim, o erro “Nome inválido do scanner ‘8983’” é impresso. O comando correcto é

sudo tcpflow -i any -C -J port 1234

(também -J foi alterado para -g na última versão)


Graças a yves por me apontarem para tcpflow “. Aqui está a linha de comandos:

tcpflow -i any -C -e port 1234 # as root, or with sudo

Isto faz tudo o que eu quero

  • mostra o byte de dados por byte como vem em
  • não mostra nenhum outro metadata
  • escuta em todas as interfaces (por isso captura dados vindos de dentro da máquina e de fora)

O ”-C“ diz-lhe para despejar para a consola em vez de um ficheiro. O ”-e“ permite as cores de modo a que o cliente>servidor e o servidor->cliente sejam visualmente distintos.

I instalou tcpflow simplesmente fazendo

sudo apt-get install tcpflow
30
30
30
2009-08-13 22:48:27 +0000

socat é a ferramenta que está a pedir. Pode actuar como um substituto:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

então a sua aplicação deve ligar a porta 4444 em vez de ligar directamente ao 1234

-v a opção socat é a de imprimir tudo o que recebe no erro padrão (stderr).

Actualização:

Se o socat não estiver disponível na sua máquina, pode ainda assim imitá-lo dessa forma com o netcat:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

caveats: esta opção é unidireccional. a segunda instância netcat imprimirá qualquer resposta do seu servidor para a saída padrão. Poderá ainda assim fazê-lo:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
20
20
20
2009-08-13 22:47:06 +0000

Experimente Wireshark . É um excelente analisador de protocolos direccionado tanto para Linux como para Windows.

13
13
13
2009-08-14 15:04:28 +0000

tcpflow é o que se quer. Extracto da página de homem:

DESCRIÇÃO tcpflow é um programa que captura os dados transmitidos como parte de ligações TCP (fluxos), e armazena os dados de uma forma conveniente para análise ou depuração de protocolos. Um programa como o tcpdump(4) mostra um resumo dos pacotes vistos no fio, mas normalmente não armazena os dados que estão realmente a ser transmitidos. Em contraste, o tcpflow reconstrói os fluxos de dados reais e armazena cada fluxo num ficheiro separado para análise posterior. O tcpflow compreende números de sequência TCP e irá reconstruir correctamente os fluxos de dados independentemente de retransmissões ou entrega fora de ordem.

tcpflow armazena todos os dados capturados em ficheiros que têm nomes da forma

192.168.101.102.02345-010.011.012.013.45103

onde o conteúdo do ficheiro acima seria transmitido do hospedeiro 192.168.101.102 porta 2345, para o hospedeiro 10.11.12.13 porta 45103.

& Configure uma ligação da sua aplicação de aplicação ao seu servidor. Quando a ligação estiver operacional, o tcpflow ainda é capaz de capturar dados a partir dela Por exemplo:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

Cada dado será armazenado num ficheiro chamado 127.000.000.001.48842-127.000.000.000.001.05555.

Pode ainda redireccionar isto na saída padrão com a opção -Cs . Leia a página do manual para jogar com a expressão para afinar os paquetes que deseja que o tcpflow capture.

2
2
2
2009-08-13 23:15:48 +0000

ngrep é muito bom para isto. É preciso um fio de BPF e um fio opcional para procurar dentro dos pacotes, e depois despeja o conteúdo do pacote para o visualizar num formato bastante útil. Opcionalmente, também descarta para um ficheiro pcap_dump que pode examinar mais de perto mais tarde em Wireshark.

0
0
0
2009-08-13 23:08:00 +0000

Dê uma vista de olhos em Chaosreader . Embora faça um pouco mais do que pede e ligeiramente diferente, provavelmente poderia modificar o seu código para fazer o que deseja.

-1
-1
-1
2009-08-13 22:47:31 +0000

Talvez possa escrever um invólucro para o tcpdump, por exemplo, que remova toda a informação redundante