Come posso monitorare tutte le richieste / connessioni in uscita dalla mia macchina?


71

La mia macchina è un server, quindi desidero ignorare le connessioni effettuate al mio server (ad es. Quando qualcuno visita il mio sito Web). Voglio vedere solo le connessioni / richieste fatte dal mio server in altri luoghi.

Come vedo solo quelle connessioni in uscita?

EDIT: sono nuovo a questo tipo di cose. Quello che sto cercando di fare è vedere se qualcosa dal mio server viene inviato oltre ai dati per le mie app Web. Ad esempio, se qualcuno visita i miei siti Web, ovviamente il mio server invierà i dati al browser del client. Ma supponiamo che ci sia anche un codice da qualche parte nel framework della mia app Web che invia dati statistici da qualche altra parte di cui non sono a conoscenza. Mi piacerebbe vedere in quali posti il ​​mio server sta inviando dati, se presenti. Probabilmente non è probabile, ma supponiamo che tu decida di utilizzare un framework php o nodejs che non hai scritto: c'è una piccola possibilità che possa inviare qualche tipo di dati da qualche parte. Se è così, è quello che mi piacerebbe vedere.

Risposte:


77

Usa netstat. Per esempio

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

elenca tutte le connessioni in uscita UDP ( u), TCP ( t) e RAW ( w) (non utilizzando lo a) in forma numerica ( n, impedisce possibili query DNS a esecuzione prolungata) e include il programma ( p) associato.

Valuta di aggiungere l' copzione per ottenere l'aggiornamento continuo dell'output.


Grazie. Questa è una buona informazione. Potresti dare un'occhiata alla mia domanda aggiornata?
trusktr,

1
Dirottamento completamente inappropriato (tranne per il fatto che questa risposta ha funzionato bene su Google): questa risposta funziona anche con Windows. Da utilizzare netstatin "modalità continua" lì, -cnon funziona. Si utilizzano invece numeri, ad esempio netstat -na 1 | find "[Scan_Host_IP_Addr]"per l'aggiornamento ogni 1secondo (in questo esempio). ( fonte ).
ruffin,

4
Questo sondaggi, quindi non prenderà sempre tutte le connessioni.
reinierpost,

C'è un modo per visualizzare informazioni più user-friendly come nomi di dominio, informazioni sull'ip? Forse usando uno script personalizzato?
awm

@awm Bene, sarebbe fattibile con straceil processo, filtrando le ricerche dei nameserver (nessun dettaglio, questa non è una risposta completa ad esso). In alternativa, è possibile mostrare il DNS inverso degli IP elencati netstatomettendo l' nopzione inclusa nella mia risposta.
gertvdijk,

11

Se vuoi semplicemente registrare ogni tentativo di connessione, probabilmente il più semplice è il iptables LOGtarget su Linux (o l'equivalente funzionalità di registrazione del firewall sul tuo sistema).

Se hai bisogno di maggiori informazioni come la durata della connessione e la quantità di dati scambiati in entrambe le direzioni, allora conntrackd(su Linux) è probabilmente l'opzione migliore.

Tuttavia, nota che i due precedenti registrano solo il traffico che attraversa netfilter, che è generalmente tutto il traffico ma non tiene conto del traffico generato con stack IP nello spazio utente (come macchine virtuali o qualsiasi cosa che utilizzi socket non elaborati) o traffico a ponte.

Per le soluzioni più generali, si può dare un'occhiata a cose come argus, bro-ids, sancpo ntopche registrare tutti i tipi di informazioni in base al traffico che annusano su un'interfaccia.


9

Ho provato una serie di strumenti, tra cui iftop, ntop, iptraf, e, naturalmente, il built-in molto utili netstat -tupln(opzioni supportate sono OS-dipendente), ma il più pratico per il mio caso d'uso si è rivelato nethogs- è aggrega i collegamenti dalla originario app , ed è il meno rumoroso di tutti.

Installabile tramite:

sudo apt-get install nethogs

Esegui come root:

sudo nethogs

Se il tuo obiettivo è vedere solo tutte le connessioni TCP avviate da qualsiasi app, puoi utilizzare:

sudo tcpdump -i lo -A | grep Host:

6

Quello che penso che tu voglia fare è ottenere un elenco di porte di ascolto e quindi rimuoverle da qualsiasi altra connessione TCP, quindi saranno tutte le connessioni in uscita. Il comando ss (stato socket) genera le colonne "Indirizzo locale: porta" e "Indirizzo peer: porta", dobbiamo rimuovere le porte di ascolto dalla colonna "Indirizzo locale: porta" e non dalla colonna "Indirizzo peer: porta", altrimenti potresti perdere alcune connessioni in uscita. Quindi, per ottenere ciò, sto usando \s{2}+dietro la stringa ": $ port" nel grep per abbinare gli spazi dietro la colonna "Indirizzo locale: Porta"; quella colonna ha due o più spazi bianchi dietro, dove "Indirizzo peer: Porta" ha uno spazio e quindi una nuova riga (grrr ... dovrebbe avere solo una nuova riga, IMO,\s+\s{2}+.) Normalmente potrei provare a usare la funzionalità di filtro di ss, come con ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Ma sembra che ci sia un limite a quanto può essere lunga quella stringa, è esplosa su un sistema in cui avevo molte porte di ascolto. Quindi sto provando a fare la stessa cosa con grep. Credo che funzionerà quanto segue:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Nota che questo dipende dalla versione di ss che stai utilizzando, le versioni precedenti (come: ss utility, iproute2-ss111117) hanno un formato di output diverso, quindi potresti dover usare $ 3 invece di $ 4 in awk. Nota anche ss -tlne ss -tn state listeningti dà un output diverso, il che è un po 'contro-intuitivo per me. YMMV.

Ho trovato una soluzione leggermente più elegante che non richiede la conoscenza dell'IP dell'host, ss -tn state established dst :*funziona bene, ho modificato le righe di comando sopra.


Vorresti aggiungere qualche spiegazione su come funziona? ( Modifica la risposta; non pubblicare informazioni di chiarimento come commenti.) Penso di averlo parzialmente capito. Sembra che potrebbe aver bisogno di un po 'più di lavoro. Ho funzionato ss -tn state listeningsu un host che esegue un server FTP, e naturalmente il comando ha mostrato che la macchina era in ascolto sulla porta 21. Quindi ciò non significa che egrep -vfiltrerà qualsiasi host remoto il cui indirizzo IP includa "21" (incluso "210 "," 211 "," 212 ", ...)? Inoltre, è asortdavvero necessario, o solo una vetrina?
G-Man,

Ho dovuto risolvere praticamente tutto, lo script corretto è sopra.
Dale,

In definitiva, sarebbe molto più bello se ss o netstat includessero solo questa funzionalità. Fare un ss --outper ottenere un elenco di connessioni in uscita.
Dale,

Bene, mi piace questa risposta. Lo proverò quando torno a migliorare la sicurezza sul mio server. : D
trusktr,

Sembra che questo possa essere usato anche per UDP, ma devi solo usare diversi flag e stati, ovviamente.
Dale,

4

tcpdumpconsente di vedere tutto il traffico IP che fluisce verso / da un'interfaccia specifica con la possibilità di filtrare in base a determinati criteri. tcpdumpviene generalmente installato sulla maggior parte dei sistemi * nix per impostazione predefinita, in caso contrario di solito c'è una porta da qualche parte per afferrarla per la tua distribuzione specifica.


2

netstat è una buona opzione. Usa i parametri come richiesto (vedi le sue pagine man) Ad esempio

netstat -antup

Qui può monitorare tutto (a) processo di ascolto numerico (n) tcp (t) e udp (u) (p).

Puoi anche provare il sscomando. Per uso di riferimento:

Informazioni su rete e socket TCP / UDP di SS Linux


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.