Monitorare il traffico TCP su una porta specifica


49

Ho cercato abbastanza ampiamente questo, ma non riesco a trovare un esempio funzionante.

Il mio obiettivo è monitorare il traffico TCP su una porta specifica per vedere le connessioni in entrata e scriverle in un file di testo. Il problema è che ho anche bisogno di un timestamp su ogni riga per mostrare esattamente quando il client si è collegato alla seconda.

Ho già esaurito netstat, nmap e tcptrack, ma nessuno supporta il timestamp.

Stavo pensando che uno script di shell Linux potrebbe funzionare se monitorassi una porta locale specifica e scrivessi del testo su un file quando viene stabilita una connessione, quindi concatenare la data su ogni riga.

Stavo giocando con questo:

netstat -ano|grep 443|grep ESTABLISHED

così come questo:

tcptrack -i eth0 port 443

ma non soddisfa i miei bisogni poiché ho bisogno del momento in cui arriva la connessione.

Se hai qualche suggerimento o potresti indicarmi la giusta direzione, sarebbe molto apprezzato.

Grazie. :)

linux  bash 

Haha è migrato da StackOverflow ma deve migrare su unix / linux
Kolob Canyon,

Risposte:


71

modifica : sto ancora ricevendo voti per questi anni dopo. Per favore, non andare per questa risposta, la risposta usandoiptables qui è di gran lunga superiore secondo me.


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

o solo tcp-syn, o solo tcp-ack(la mia ipotesi sarebbe quella), a seconda di cosa hai bisogno.


Invece di mostrare il nome host per ogni connessione, c'è un modo per sovrascriverlo con l'IP?

Sì, aggiungi -ndopo tcpdump (man tcpdump: -n Non convertire gli indirizzi (ad es. Indirizzi host, numeri di porta, ecc.) In nomi. )
Wrikken

5
Direi che lo spamming nel registro del kernel non è davvero superiore. ;)
Daniel B,

1
Ah, ma lo farei, a patto che uno configuri correttamente dove dovrebbero andare i log ovviamente: P Ma hey, questa risposta è ancora qui se questo è un patto :)
Wrikken,

2
@Wrikken il problema con l'uso del log del kernel per questo è che, usando la tua soluzione quando ctrl + c su tcpdump tutto rimane come prima. La soluzione iptables significa lasciare una "sorpresa" se non si rimuove manualmente la regola. Questa sorpresa può tradursi in un disco root completo in pochissimo tempo. Mi dispiace, ma sto votando questo (:
John Blackberry il

31

Per questo puoi usare il supporto iptables nel kernel Linux. Il lato positivo è che non richiede alcun software aggiuntivo per essere moderatamente utile. Il rovescio della medaglia è che richiede l'impostazione dei privilegi di root (ma dato che stai parlando della porta 443, che è una porta privilegiata, probabilmente avrai bisogno dei privilegi di root con la maggior parte delle soluzioni).

Aggiungi una regola iptables con qualcosa del tipo:

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

(Regola la -I INPUTparte secondo i tuoi gusti.)

Quando la regola viene attivata, il kernel emetterà una voce syslog. Ad esempio, con una regola di input, la voce di registro potrebbe essere simile a:

5 dic 09:10:56 kernel nome host: [1023963.185332] HTTPS SYN: IN = ifX OUT = MAC = 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 FINESTRA = 8192 RES = 0x00 SYN URGP = 0

È quindi possibile utilizzare qualsiasi strumento di monitoraggio dei log run-of-the-mill per fare qualcosa di utile con queste informazioni. Se l'implementazione di syslog lo supporta, è anche possibile indirizzarli in un file di registro separato, soddisfacendo in modo efficace il requisito di scrivere i dati di connessione in un file timestampato al secondo senza software aggiuntivo.

Si noti che il LOGtarget è un target non terminante, il che significa che eventuali regole che lo seguiranno verranno comunque valutate e il pacchetto non verrà né rifiutato né accettato dalla stessa regola LOG. Ciò rende la LOGdestinazione utile anche per il debug delle regole del firewall.

Per evitare di inondare il registro, considerare l'utilizzo del limitmodulo insieme a questo. Vedere la pagina man iptables (8) per i dettagli.


è possibile eseguire uno script Python innescando questo?
Karl Zillner,

Non dimenticare di eliminare queste regole delle tabelle IP una volta terminato, altrimenti spargeranno i log abbastanza pesantemente a seconda della regola. digitalocean.com/community/tutorials/…
Mo Beigi

26

Risoluzione Micro-Second

Per impostazione predefinita, l' utilità tcpdump riporterà il tempo con una risoluzione di microsecondi. Per esempio:

$ sudo tcpdump -i any port 443

mostrerà un output simile al seguente:

12: 08: 14.028945 IP localhost.33255> localhost.https: Flags [S], seq 1828376761, win 43690, opzioni [mss 65495, sackOK, TS val 108010971 ecr 0, nop, wscale 7], lunghezza 0
12:08: 14.028959 IP localhost.https> localhost.33255: Flags [R.], seq 0, ack 1828376762, vittoria 0, lunghezza 0

Vedere tcpdump (8) per un elenco completo delle opzioni di tcpdump e pcap-filter (7) per la sintassi completa dei filtri che è possibile utilizzare.


5

443 è un traffico crittografato, quindi è difficile fare head o code di traffico su questa porta:

tu puoi fare

yum install ngrep o apt-get install ngrep

quindi corri

ngrep -W byline -d any port 443 -q

2

Potrebbe essere necessario anche questo per monitorare i pacchetti in entrata e in uscita da altre macchine.

tcpflow -i eth0 -c port 7891

(opzione -iper menzionare la rete, opzione -cper stampare i pacchetti nella console)


Questo è davvero un commento e non una risposta alla domanda originale. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post: puoi sempre commentare i tuoi post e una volta che avrai una reputazione sufficiente sarai in grado di commentare qualsiasi post . Leggi Perché ho bisogno di 50 reputazione per commentare? Cosa posso fare invece?
DavidPostill


0

Se hai bisogno di una soluzione permanente che monitorerà sempre il traffico sulle porte di interesse, ti suggerisco di usare QoS (il comando tc in linux). tc è un po 'criptico e non documentato, quindi uso FireQoS per configurare QoS e netdata per il monitoraggio in tempo reale.

Controlla questo per maggiori informazioni: https://github.com/firehol/netdata/wiki/You-should-install-QoS-on-all-your-servers


Direi che questo è un po 'eccessivo semplicemente per la registrazione delle connessioni, dove iPTables + --log funzionerà.
djsmiley2k - CoW,

Hai ragione, è eccessivo se è necessario registrare le connessioni. Uso questa soluzione non per monitorare i client connessi, ma la larghezza di banda utilizzata dal servizio.
Costa Tsaousis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.