Come chiudere le porte in Linux?


38

Ho qualche domanda nel chiudere il porto, penso di avere delle cose strane.

Quando uso esegui

nmap --top-ports 10 192.168.1.1

mostra che la porta 23 / TCP è aperta.

Ma quando eseguo

nmap --top-ports 10 localhost

mostra che la porta 23 / tcp è chiusa.

Quale di loro è vero? Voglio chiudere questa porta su tutto il mio sistema, come posso farlo?


10
sono entrambi veri. Le porte TCP non sono associate agli host. sono associati alle interfacce di rete. la differenza è sottile ma importante. le interfacce sono spesso le stesse degli host, ma non sempre. in questo caso (come indicato nelle risposte) localhoststa accedendo all'interfaccia lo(loopback). l'indirizzo IP viene accesing l'interfaccia vera e propria, probabilmente eth0o wlan0o somesuch.
strugee,

3
L'apparente ingenuità di questa domanda ha portato ad alcune risposte formidabili. Grazie per la domanda!
dotancohen,

Risposte:


47

Nmap è un ottimo port scanner, ma a volte vuoi qualcosa di più autorevole. Puoi chiedere al kernel quali processi hanno quali porte si aprono usando l' netstatutilità:

io @ miohost: ~ $ sudo netstat -tlnp
Connessioni Internet attive (solo server)
Proto Recv-Q Send-Q Indirizzo locale Indirizzo esterno Stato PID / Nome programma
tcp 0 0 127.0.0.1:53 0.0.0.0:* ASCOLTA 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* ASCOLTA 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* ASCOLTA 822 / cupsd       
tcp6 0 0 ::: 22 ::: * ASCOLTA 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * ASCOLTA 822 / cupsd       

Le opzioni che ho dato sono:

  • -t Solo TCP
  • -l Solo porte di ascolto
  • -n Non cercare i nomi dei servizi e degli host, ma solo visualizzare i numeri
  • -p Mostra informazioni sul processo (richiede il privilegio di root)

In questo caso, possiamo vedere che sshdè in ascolto su qualsiasi porta di interfaccia ( 0.0.0.0) 22 e in cupsdascolto sulla porta di loopback ( 127.0.0.1) 631. L'output potrebbe mostrare che telnetdha un indirizzo locale di 192.168.1.1:23, il che significa che non risponderà alle connessioni sull'adattatore di loopback (ad esempio non puoi telnet 127.0.0.1).

Esistono altri strumenti che mostreranno informazioni simili (ad esempio lsofo /proc), ma netstat è il più ampiamente disponibile. Funziona anche su Windows ( netstat -anb). BSD netstat è un po 'diverso: dovrai usare sockstat (1) per ottenere invece le informazioni sul processo.

Una volta che hai l'ID processo e il nome del programma, puoi cercare il processo e ucciderlo se desideri chiudere la porta. Per un controllo più preciso, è possibile utilizzare un firewall (iptables su Linux) per limitare l'accesso solo a determinati indirizzi. Potrebbe essere necessario disabilitare l'avvio di un servizio. Se il PID è "-" su Linux, è probabilmente un processo del kernel (questo è comune con NFS per esempio), quindi buona fortuna scoprire di cosa si tratta.

Nota: ho detto "autorevole" perché non sei ostacolato da condizioni di rete e firewall. Se ti fidi del tuo computer, è fantastico. Tuttavia, se sospetti di essere stato violato, potresti non essere in grado di fidarti degli strumenti sul tuo computer. Sostituire le utility standard (e talvolta anche le chiamate di sistema) con quelle che nascondono determinati processi o porte (aka rootkit) è una pratica standard tra gli aggressori. La tua scommessa migliore a questo punto è fare una copia forense del tuo disco e ripristinare dal backup; quindi usa la copia per determinare il modo in cui sono entrati e chiuderla.


14

Un sistema Linux ha una cosiddetta interfaccia di loopback, che è per la comunicazione interna. Il suo nome host è localhoste il suo indirizzo IP è 127.0.0.1.

Quando si esegue nmapsu localhost, in realtà si corre il portscan sul virtuale interfaccia di loopback. 192.168.1.1è l'indirizzo IP della tua interfaccia fisica (molto probabilmente eth0).

Quindi hai eseguito nmapdue diverse interfacce di rete, ecco perché c'è una differenza nelle porte aperte. Sono entrambi veri.

Se hai la porta TCP 23 aperta, è probabile che tu abbia un telnetserver in esecuzione (il che non è una buona cosa a causa della sua mancanza di crittografia) o che hai qualche tipo di cavallo di Troia sul tuo computer.


1
quindi come posso chiuderlo?
user74080,

4
@ user74080 Puoi aggiungere una iptablesregola come suggerisce una risposta vicina, ma manterrà il servizio inutilizzato, che consuma risorse. Quindi, se hai telnetdcorsa, basta spegnerlo.
psimon

12

Per "chiudere" la porta è possibile utilizzare iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP

1
In questa risposta, "chiudere la porta" significa "ignorare qualsiasi traffico verso di essa". La porta è ancora aperta, ma non è più raggiungibile. Nota anche che DROPfa come dice, vede il pacchetto e poi lo ignora. Normalmente (senza iptables abilitato), il kernel invierebbe indietro un pacchetto irraggiungibile della porta ICMP (che può essere simulato con la REJECTdestinazione invece che DROP).
Lekensteyn,

3
La porta ICMP di @Lekensteyn non raggiungibile è per UDP. Il pacchetto corretto con cui rispondere è un pacchetto TCP RST, che può anche essere generato usando la REJECTdestinazione scrivendo -j REJECT --reject-with tcp-reset.
Kasperd,

Nonostante il suo punteggio più basso, questa è la prima risposta a rispondere effettivamente alla domanda. Chiunque può aggiungere più punteggi qui, per favore fallo.
EnzoR,

2

Se lo fai nmap localhost, ti dice di una situazione diversa: alcuni programmi su Linux funzionano come server anche se vengono utilizzati solo localmente. Questo perché altri programmi li usano come un server a cui si connettono. Quindi entrambe le risposte sono vere, poiché chiedi qualcosa di diverso.

La porta 23 è utilizzata per telnet. Normalmente non più utilizzato. Prova a fare nmap -sV 192.168.1.1per scoprire quale programma apre la porta.

(192 ... è un IP di rete locale, quindi il risultato di nmap <your outside world IP>darà anche un risultato diverso, a causa delle possibili impostazioni del firewall, ecc.)


1

Se si dispone di un servizio in esecuzione e in ascolto sulla porta 23, è probabilmente più pulito interrompere il processo che ascolta la porta 23 (probabilmente telnet) piuttosto che mantenerlo in esecuzione e chiudere o bloccare l' utilizzo della porta 23 iptables.

Quando non è in corso alcun processo di ascolto su una porta, anche in assenza di un blocco firewall, qualsiasi tentativo di connessione ad essa dovrebbe tradursi in un immediato "rifiuto della connessione" ( ECONNREFUSEDa connect(2))

Un modo per trovare il processo (e il suo pid) in ascolto sulla porta 23, se esiste tale processo, è:

sudo lsof -i -P | grep ':23 '

Negli -ielenchi sopra si aprono le porte Internet (sia UDP che TCP) e -P inibisce la traduzione delle porte in nomi di servizi (via /etc/services)

Dopo aver trovato il processo in esecuzione in ascolto sulla porta 23, puoi capire come è iniziato guardando l'albero del processo (con, diciamo, pstree). Se il suo genitore è init(molto probabilmente), puoi cercare ricorsivamente il nome del processo sotto /etc. per esempio:

sudo grep -r telnet /etc

Questo dovrebbe portarti al modo migliore per disabilitare l'esecuzione dal 1 ° posto.


Non è necessario utilizzare grep (e se ci fosse, non c'è bisogno di virgolette). È possibile utilizzare sudo lsof -Pi :23.
Théophile,

Le citazioni sono lì per una buona ragione. Per assicurarsi che solo la porta telnet ( 23) sia abbinata. Se non si include uno spazio dopo :23l'abbinerà :234, :2345ecc
arielf

Ah, capisco. Questo ha senso per grep. Per inciso, sembra che il comando senza grep ( lsof -Pi :23) cerchi una corrispondenza esatta.
Théophile,
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.