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

79

Eu quero uma maneira 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, eu quero um comando mágico que, se eu fizer:

magic_commmand_I_want port=1234

se houvesse um servidor escutando 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 seria impresso:

hello

Eu tentei "tcpdump", "ethereal", "tethereal", "tshark" e outros, mas não é óbvio como você os leva a:

  • não mostrar endereços IP ou outros metadados
  • mostra apenas os "dados" enviados, não os pacotes individuais e seus cabeçalhos
  • imprima os dados como estão, não em hexadecimal e não com marcadores de deslocamento de pacote
  • cheirar todo o tráfego de rede (seja em eth0 ou eth1 ou lo , etc ...)

Sim, você provavelmente poderia reunir um conjunto de comandos unix para fazer isso, mas isso não é muito fácil de lembrar da próxima vez :)

Se você tem um exemplo simples de uma linha de comando exata que faz isso, é isso que eu gostaria.

Dustin Boswell
fonte
2
tcpdump é o comando mágico que você deseja. Wireshark é uma boa GUI em cima do tcpdump biblioteca usa
Vinko Vrsalovic
3
Eu sei que esta é uma pergunta antiga, mas estou curioso para saber por que usar nc para o "lado do servidor" também não era uma opção? "nc -l 1234" cria um servidor que escuta na porta 1234 e imprime o que for enviado a ele e fecha a conexão. Se você deseja manter a conexão ativa e não desconectar, você pode adicionar a opção "-k".
StFS 13/08/14
2
@StFS porque ele quer cheirar uma porta em execução e a NC reclama.
infoclogou

Respostas:

106

Atualizar:

Conforme apontado por Michal nos comentários: No tcpflow versão 1.3, a opção -e é usada para especificar o nome do scanner. Portanto, o erro "Nome inválido do scanner '8983'" é impresso. O comando correto é

sudo tcpflow -i any -C -J port 1234

(também -Jfoi alterado para -gna versão mais recente)


Obrigado a yves por me apontar para " tcpflow ". Aqui está a linha de comando:

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

Isso faz tudo que eu quero

  • exibe os dados byte a byte conforme
  • não exibe nenhum outro metadado
  • ouve em todas as interfaces (para capturar dados vindos de dentro e de fora da máquina)

O " -C" diz para despejar no console em vez de em um arquivo. O " -e" ativa as cores para que cliente-> servidor e servidor-> cliente sejam visualmente distintos.

Eu instalei o tcpflow simplesmente fazendo

sudo apt-get install tcpflow
Dustin Boswell
fonte
2
Uau. O tcpflow é incrível, obrigado! Me salvou uma tonelada de dor que estava sentindo com o wireshark. O Wireshark, o tcpdump, etc. têm muitas informações e, na verdade, não fazem o que a pergunta original faz. O tcpflow é perfeito para isso.
19412 Russ
10
Na versão 1.3 do tcpflow, a -eopção é usada para especificar o nome do scanner. Portanto, o erro "Nome inválido do scanner '8983'" é impresso. O comando correto ésudo tcpflow -i any -C -J port 1234
Michal Kováč
6
Observe que -Jfoi alterado para -gnas versões mais recentes.
Tvon 13/04
2
Alguém precisa explicar aos autores da ferramenta o que significa o termo "compatibilidade com versões anteriores"!
Sridhar Sarnobat
Imprime "coisas" duas vezes, para mim. Por que é que ? lpaste.net/3984129577801744384
user1198559
29

socat é a ferramenta que você está pedindo. Pode atuar como um proxy:

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

seu aplicativo deve conectar a porta 4444 em vez de conectar-se diretamente à 1234

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

Atualizar:

Se o socat não estiver disponível em sua máquina, você ainda pode emular dessa maneira com o netcat:

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

advertências: essa opção é unidirecional. a segunda instância do netcat imprimirá qualquer resposta do seu servidor para a saída padrão. Você ainda pode fazer:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo
yves Baumes
fonte
Suponha que eu não tenha controle sobre o cliente e o servidor (ou não queira pará-lo); portanto, não posso alterar qual porta está envolvida nem interceptar o tráfego. Então o que?
20

Experimente o Wireshark . É um excelente analisador de protocolo direcionado para Linux e Windows.

Kevin Boyd
fonte
3
Minha experiência é que a interface realmente é uma droga no linux.
9139 Joe Phillips
caramba, você chegou lá antes de mim, +1 no wireshark #
Você pode dar um exemplo de linha de comando?
Dê uma olhada neste link wiki.wireshark.org/Tools Fornece uma lista de ferramentas de linha de comando para o wireshark. Procure o Dumpcap.
21730 Kevin Boyd
13

tcpflow é o que você deseja. Extrair da página do manual:

DESCRIÇÃO O
tcpflow é um programa que captura dados transmitidos como parte das conexões TCP (fluxos) e armazena os dados de maneira conveniente para análise ou depuração de protocolo. Um programa como o tcpdump (4) mostra um resumo dos pacotes vistos no fio, mas geralmente não armazena os dados que estão sendo transmitidos. Por outro lado, o tcpflow reconstrói os fluxos de dados reais e armazena cada fluxo em um arquivo separado para análise posterior. O tcpflow entende os números de sequência TCP e reconstrói corretamente os fluxos de dados, independentemente de retransmissões ou entrega fora de ordem.

O tcpflow armazena todos os dados capturados em arquivos que possuem nomes no formato

192.168.101.102.02345-010.011.012.013.45103

onde o conteúdo do arquivo acima seria dados transmitidos da porta 2345 do host 192.168.101.102, para a porta 45103 do host 10.11.12.13.

Configure uma conexão do aplicativo para o servidor. Quando a conexão estiver em funcionamento, o tcpflow ainda poderá capturar dados dela. Por exemplo:

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

Todos os dados serão armazenados em um arquivo chamado 127.000.000.001.48842-127.000.000.001.05555.

Você ainda pode redirecionar isso na saída padrão com a opção -Cs. Leia a página do manual para brincar com a expressão e ajustar os paquets que você deseja que o tcpflow capture.

yves Baumes
fonte
2

ngrepé muito bom para isso. É necessária uma cadeia BPF e uma cadeia opcional para pesquisar nos pacotes e depois despeja o conteúdo do pacote para a tela em um formato bastante útil. Opcionalmente, também despeja em um arquivo pcap_dump que você pode examinar mais de perto no Wireshark posteriormente.

hobbs
fonte
0

Dê uma olhada no Chaosreader . Embora faça um pouco mais do que você solicita e um pouco diferente, provavelmente você pode modificar o código para fazer o que quiser.

Andrew Y
fonte
-1

Talvez você possa escrever um wrapper para o tcpdump, por exemplo, que removerá todas as informações redundantes

dimba
fonte