Monitorar o tráfego TCP na porta específica

49

Eu procurei bastante isso, mas não consigo encontrar um exemplo de trabalho.

Meu objetivo é monitorar o tráfego TCP em uma porta específica para ver as conexões recebidas e gravá-las em um arquivo de texto. O problema é que também preciso de um registro de data e hora em cada linha para mostrar exatamente quando o cliente se conectou à segunda.

Já exaurei o netstat, o nmap e o tcptrack, mas nenhum deles suporta o carimbo de data e hora.

Eu estava pensando que um script de shell linux poderia funcionar se eu monitorasse uma porta local específica e escrevesse texto em um arquivo quando uma conexão fosse estabelecida, concatenando a data em cada linha.

Eu estava brincando com isso:

netstat -ano|grep 443|grep ESTABLISHED

assim como isso:

tcptrack -i eth0 port 443

mas também não atendem às minhas necessidades, pois preciso do horário em que a conexão chega.

Se você tiver alguma sugestão ou me indicar a direção certa, seria muito apreciada.

Obrigado. :)


fonte
Haha migrou do stackoverflow, mas precisa migrar para unix / linux
Kolob Canyon

Respostas:

71

edit : Eu ainda estou recebendo votos por isso anos depois. Por favor, não escolha esta resposta, a resposta que usamosiptables aqui é muito superior em minha opinião.


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

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

Wrikken
fonte
Em vez de mostrar o nome do host para cada conexão, existe uma maneira de substituí-lo pelo IP?
Yep, adicione -ndepois tcpdump (man tcpdump: -n Não converter endereços (ou seja, endereços de acolhimento, números de portas, etc.) para nomes. )
Wrikken
5
Eu diria que enviar spam para o log do kernel não é realmente superior. ;)
Daniel B
1
Ah, mas eu gostaria, desde que se configura propriamente onde que os registros devem ir claro: P Mas hey, essa resposta é ainda aqui se isso é um disjuntor do negócio :)
Wrikken
2
@Wrikken O problema de usar o log do kernel para isso é que, usando sua solução quando você pressiona a tecla Ctrl + C do tcpdump, tudo permanece como antes. A solução iptables significa deixar uma "surpresa" para trás se você não remover a regra manualmente. Essa surpresa pode ser traduzida em ter um disco raiz completo em pouco tempo. Desculpe, mas estou votando positivamente neste (:
John Blackberry
31

Você pode usar o suporte ao iptables no kernel do Linux para isso. A vantagem é que ele não requer nenhum software extra para ser moderadamente útil. A desvantagem é que ele requer privilégios de root para configurar (mas, como você está falando da porta 443, que é uma porta privilegiada, provavelmente precisará de privilégios de root na 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 -I INPUTpeça de acordo com o seu gosto.)

Quando a regra é acionada, uma entrada syslog será emitida pelo kernel. Por exemplo, com uma regra de entrada, a entrada do log pode se parecer com:

5 de dezembro 09:10:56 nome do host do kernel: [1023963.185332] HTTPS SYN: IN = ifX OUT = MAC = 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 80: 08: 00 SRC = ABCD DST = WXYZ LEN = 52 TOS = 0x00 PREC = 0x20 TTL = 119 ID = 11901 DF PROTO = TCP SPT = 37287 DPT = 443 JANELA = 8192 RES = 0x00 SYN URGP = 0

Você pode usar qualquer ferramenta de monitoramento de logs comum para fazer algo útil com essas informações. Se a sua implementação do syslog suportar, você pode direcioná-los para um arquivo de log separado, cumprindo efetivamente o requisito de gravar os dados da conexão em um arquivo com carimbo de data e hora no segundo sem nenhum software adicional.

Observe que o LOGdestino é um destino sem término, o que significa que qualquer regra a seguir ainda será avaliada e o pacote não será rejeitado ou aceito pela própria regra LOG. Isso torna o LOGdestino útil também para depurar regras de firewall.

Para evitar inundar seu log, considere usar o limitmódulo em conjunto com isso. Veja a página de manual do iptables (8) para detalhes.

um CVn
fonte
é possível executar um script python acionando isso?
22818 Karl Zillner
Não se esqueça de excluir essas regras de tabelas de IP quando terminar, caso contrário, elas enviarão spam aos logs com muita intensidade, dependendo da regra. digitalocean.com/community/tutorials/…
Mo Beigi
26

Resolução em microssegundos

Por padrão, o utilitário tcpdump relatará tempo com resolução de microssegundos. Por exemplo:

$ sudo tcpdump -i any port 443

mostrará uma saída semelhante à seguinte:

12: 08: 14.028945 IP localhost.33255> localhost.https: Flags [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: Flags [R.], seq 0, ack 1828376762, vitória 0, comprimento 0

Veja tcpdump (8) para obter uma lista completa das opções tcpdump e pcap-filter (7) para obter a sintaxe completa dos filtros que você pode usar.

CodeGnome
fonte
5

443 é tráfego criptografado - tão difícil de fazer cara ou coroa de tráfego nesta porta de qualquer maneira:

você pode fazer

yum install ngrep ou apt-get install ngrep

então corra

ngrep -W byline -d any port 443 -q
Halcyon Vindicado
fonte
2

Você também pode exigir isso para monitorar os pacotes de entrada e saída de outras máquinas.

tcpflow -i eth0 -c port 7891

(opção -ipara mencionar a rede, opção -cpara imprimir os pacotes no console)

reegan vijay
fonte
Este é realmente um comentário e não uma resposta à pergunta original. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem - você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post . Leia Por que preciso de 50 reputação para comentar? O que posso fazer em vez disso?
DavidPostill
1

Você pode usar o tcpdump ou o Wireshark.

sigjuice
fonte
0

Se você precisar de uma solução permanente que sempre monitore o tráfego nas portas de interesse, sugiro usar QoS (o comando tc no linux). O tc é um pouco enigmático e não documentado, então eu uso o FireQoS para configurar QoS e netdata para monitorá-lo em tempo real.

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

Costa Tsaousis
fonte
Eu diria que isso é um pouco exagerado, simplesmente para conexões de log, onde o iPTables + --log funcionará.
Djsmiley2k - CoW
Você está certo, é um exagero se você precisar registrar as conexões. Uso essa solução não para monitorar quais clientes estão conectados, mas quanto de largura de banda o serviço usa.
Costa Tsaousis