2013-06-07 15:55:48 +0000 2013-06-07 15:55:48 +0000
51
51

Monitorizar tráfego TCP numa porta específica

Procurei extensivamente por isto, mas não consigo encontrar um exemplo que funcione.

O meu objectivo é monitorizar o tráfego TCP numa porta específica para ver as ligações de entrada e escrevê-las num ficheiro de texto. O senão é que também preciso de um timestamp em cada linha para mostrar exactamente quando o cliente se ligou à segunda.

Já esgotei netstat, nmap e tcptrack, mas nenhum suporta timestamp.

Estava a pensar que um script de shell linux poderia funcionar se eu monitorizasse uma porta local específica e escrevesse texto para um ficheiro quando é feita uma ligação e depois apenas concatenasse a data em cada linha.

Estava a brincar com isto:

netstat -ano|grep 443|grep ESTABLISHED

e com isto:

tcptrack -i eth0 port 443

mas nenhum deles se adequa às minhas necessidades pois preciso do tempo em que a ligação chega.

Se tiverem alguma sugestão ou se me puderem apontar na direcção certa seria muito apreciado.

Obrigado. :)

Respostas (7)

73
73
73
2013-06-07 16:03:28 +0000

edit* : Ainda estou a receber votos para estes anos mais tarde. Por favor não vá para esta resposta, a resposta usando iptables aqui é muito superior na minha opinião.


tcpdump port 443 and '(tcp-syn|tcp-ack)!=0'

ou apenas tcp-syn, ou apenas tcp-ack (o meu palpite seria esse), dependendo do que você precisa.

33
33
33
2014-12-05 15:08:24 +0000

Pode usar o suporte a iptables no kernel Linux para isto. O lado positivo é que não requer nenhum software extra para ser moderadamente útil. O lado negativo é que requer privilégios de root para configurar (mas dado que está a falar da porta 443, que é uma porta privilegiada, provavelmente precisa de privilégios de root com a maioria das soluções).

Adicione uma regra do iptables com algo como:

sudo iptables -I INPUT -p tcp --dport 443 --syn -j LOG --log-prefix "HTTPS SYN: "

(Ajuste a parte -I INPUT de acordo com o seu gosto.)

Quando a regra é accionada, uma entrada de syslog será emitida pelo kernel. Por exemplo, com uma regra de entrada, a entrada de log pode parecer algo como:

Dez 5 09:10:56 hostname kernel: [1023963.185332] HTTPS SYN: IN=ifX OUT= MAC=80:80:80:80:80:80:80:80:80:80:80:80:08:00 SRC=A.B.C.D DST=W.X.Y. Z LEN=52 TOS=0x00 PREC=0x20 TTL=119 ID=11901 DF PROTO=TCP SPT=37287 DPT=443 WINDOW=8192 RES=0x00 SYN URGP=0

Pode então utilizar qualquer ferramenta de monitorização de registos de funcionamento da fábrica para fazer algo útil com esta informação. Se a sua implementação syslog o suportar, pode mesmo direccioná-los para um ficheiro de registo separado, cumprindo efectivamente o seu requisito de escrever os dados de ligação num ficheiro com a hora marcada para o segundo sem qualquer software adicional.

Note que o alvo LOG é um alvo sem terminação, o que significa que quaisquer regras que o sigam continuarão a ser avaliadas, e o pacote não será rejeitado nem aceite pela própria regra LOG. Isto torna o alvo LOG útil também para a depuração de regras de firewall.

Para evitar flooding seu log, considere usar o módulo limit em conjunto com isto. Veja a página man do iptables(8) para mais detalhes.

26
26
26
2013-06-07 16:13:36 +0000

Resolução Micro-Segundo

Por defeito, o utilitário tcpdump irá reportar o tempo com a resolução do micro-segundo. Por exemplo:

$ sudo tcpdump -i any port 443

mostrarão resultados semelhantes aos seguintes:

12:08:14.028945 IP localhost.33255 > localhost.https: Bandeiras [S], seq 1828376761, win 43690, opções [mss 65495,sackOK,TS val 108010971 ecr 0,nop,wscale 7], comprimento 0 12:08:14.028959 IP localhost.https > localhost.33255: Bandeiras [R.], seq 0, ack 1828376762, win 0, comprimento 0

Ver tcpdump(8) para uma lista completa de opções tcpdump, e pcap-filter(7) para a sintaxe completa dos filtros que pode utilizar.

5
5
5
2013-06-07 16:09:31 +0000

443 é tráfego encriptado - tão difícil de fazer cabeças ou caudas de tráfego nesta porta de qualquer maneira:

pode fazer

yum instalar ngrep ou apt-get install ngrep

depois correr

ngrep -W byline -d any port 443 -q
2
2
2
2016-06-02 09:48:03 +0000

Pode também requerer isto para monitorizar a entrada e saída de pacotes de outras máquinas.

tcpflow -i eth0 -c port 7891

(opção -i para mencionar a rede, opção -c para imprimir os pacotes na consola)

1
1
1
2013-06-07 15:59:57 +0000

Você pode usar tcpdump ou Wireshark.

0
0
0
2017-05-26 11:08:35 +0000

Se necessita de uma solução permanente que monitorize sempre o tráfego nas portas de interesse, sugiro a utilização do QoS (o comando tc no linux). O tc é um pouco críptico e não documentado, por isso utilizo o FireQoS para configurar o QoS e a netdata para o monitorizar em tempo real.

Verifique isto para mais informações: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers