2010-04-06 03:39:57 +0000 2010-04-06 03:39:57 +0000
116
116

Chiusura manuale di una porta da linea di comando

Voglio chiudere una porta aperta che è in modalità di ascolto tra il mio client e l'applicazione server.

C'è un'opzione manuale da linea di comando in Linux per chiudere una porta?

** NOTA:** Sono venuto a sapere che “solo l'applicazione che possiede il socket collegato dovrebbe chiuderla, cosa che accadrà quando l'applicazione termina”

Non capisco perché sia possibile solo dall'applicazione che la apre … Ma sono ancora ansioso di sapere se c'è un altro modo per farlo.

Risposte (13)

137
137
137
2013-11-01 01:43:00 +0000

Ho avuto lo stesso problema, il processo deve rimanere vivo ma la presa deve chiudersi. La chiusura di un socket in un processo in corso non è impossibile ma difficile:

  1. individuare il processo :

  2. individuare il descrittore del file del socket nel processo

  3. individuare il descrittore del file del socket nel processo. 3. Ora collegare il processo:

    1. Ora chiudere il socket:
20
20
20
2012-02-13 08:44:54 +0000

Fuser può essere utilizzato anche

fuser -k -n *protocol portno*
``` ```
fuser -k -n tcp 37

Qui il protocollo è tcp/udp e portno è il numero che si desidera chiudere. Ad es.

&001 &001

Maggiori informazioni su fuser man page

6
6
6
2010-04-06 09:38:15 +0000

In alternativa si può usare iptables:

iptables -I INPUT -p tcp --dport 80 -j DROP

In pratica realizza ciò che si vuole. Questo farà cadere tutto il traffico TCP sulla porta 80.

3
3
3
2010-04-06 03:45:53 +0000
netstat -anp | grep 80

Dovrebbe dirvi, se state eseguendo apache, “httpd” (questo è solo un esempio, usate la porta che la vostra applicazione sta usando invece di 80)

pkill -9 httpd
``` ```
killall -9 httpd

o

&001

2
2
2
2015-05-27 03:46:19 +0000

Ho cercato prima i processi mongo e nodo, poi ho fatto quanto segue:

ps -A | grep node

10418 pts/23 00:00:05 node

10551 pts/23 00:00:00 node

ps -A | grep mongo

10490 pts/23 00:00:00 mongod

Una volta identificati, basta uccidere i processi con il comando kill.

kill -9 10418
kill -9 10490
``` &001 


Infine, digitare `meteor` e dovrebbe funzionare di nuovo.
2
2
2
2012-04-22 05:02:17 +0000

Probabilmente si potrebbe solo scoprire quale processo ha aperto il socket a cui la porta è associata, e uccidere quel processo.

Ma, ci si dovrebbe rendere conto che a meno che quel processo non abbia un gestore che de-inizializzi tutte le cose che stava usando (file aperti, socket, forchette, cose che possono indugiare a meno che non sia chiuso correttamente al termine) allora si sarebbe creato quel trascinamento sulle prestazioni del sistema. Inoltre, il socket rimarrà aperto fino a quando il kernel non si renderà conto che il processo è stato interrotto. Di solito ci vuole solo un minuto.

Suppongo che la domanda migliore sarebbe: Quale porta (appartenente a quale processo) vuoi fermare?

Se stai cercando di porre fine a una backdoor o a un virus che hai trovato, allora dovresti almeno imparare quali dati vanno avanti e indietro prima di terminarlo. (Wireshark va bene per questo) (E il nome eseguibile del processo in modo da poterlo cancellare ed evitare che torni al riavvio) o, se si tratta di qualcosa che avete installato (come HTTPD o FTPD o qualcosa del genere) allora dovreste già avere accesso al processo stesso.

Di solito avrà un programma di controllo (HTTPD stop|start o qualcosa del genere). Oppure, se si tratta di una cosa di sistema, probabilmente non si dovrebbe interferire con esso. Ad ogni modo, ho pensato che, dato che tutti gli altri vi stanno dando l'angolo del “come fare”, dovrei darvi le avvertenze.

2
2
2
2015-04-23 06:06:09 +0000

Se si desidera che la porta venga rilasciata prima, è necessario impostare il seguente valore:

echo 1 > /proc/sys/net/ipv4/tcp_fin_timeout

per impostarla da 60 secondi (default) a 1 secondo

1
1
1
2010-04-06 04:10:46 +0000

Si potrebbe scrivere uno script che modifichi gli iptables e li riavvii. Uno script per aggiungere una regola che fa cadere tutti i pacchetti sulla porta, un altro script per rimuovere detta regola.

Le altre risposte hanno mostrato come uccidere il processo legato alla porta - questo potrebbe non essere quello che si vuole. Se si vuole che il server continui a funzionare, ma per evitare connessioni da parte dei client, allora si vuole bloccare la porta, non fermare il processo.

1
1
1
2015-07-29 02:25:58 +0000

È possibile utilizzare il comando denominato killcx, chiudendo una connessione senza alcun processo da interrompere.

  • sintassi:
killcx [dest_ip:dest_port] {interface}

dest_ip : remote IP
dest_port : remote port
interface (optional) : network interface (eth0, lo etc).
  • esempio:
killcx 120.121.122.123:1234
killcx 120.121.122.123:1234 eth0
1
1
1
2015-10-15 08:45:34 +0000

Sono consapevole che questa risposta non risponde alla domanda in sé, in senso stretto, ma leggendo in essa questa potrebbe essere un'informazione rilevante:

Il comportamento predefinito di legare un socket a una porta (e indirizzo) è che quando il socket viene chiuso da una brusca interruzione del processo, il socket rimarrà in TIME_WAIT per un po ‘. Ciò significa che non è possibile effettuare immediatamente il re-bind a questo indirizzo/porta. Se si sta sviluppando il sistema stesso attraverso l'interfaccia standard del socket BSD, è possibile (almeno in una certa misura) controllare questo comportamento con l'opzione socket SO_REUSEADDR. Questo vi permetterà fondamentalmente di effettuare nuovamente il binding allo stesso indirizzo/porta se il socket è nello stato TIME_WAIT. Ancora un socket per porta però!

Tuttavia, questa informazione dovrebbe essere utilizzata solo come aiuto allo sviluppo, poiché c'è una ragione per cui TIME_WAIT esiste in primo luogo, già spiegata nelle altre risposte.

1
1
1
2013-11-01 02:08:35 +0000

Un'altra questione: a volte il kernel possiede le porte stesse. So che il routing NAT tiene aperte alcune porte per l'uso NAT. Non si può uccidere un processo per questo, questo è un kernel, ed è necessaria una riconfigurazione e un riavvio.

0
0
0
2016-03-30 10:02:54 +0000

Se non volete traffico sulla presa, ma volete mantenere vivo il processo: tcpkill .

tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy
``` &001 


inizierà un demone sniffing che intercetta e distrugge tutto il traffico su quella porta. Molto utile per testare le vostre applicazioni per le divisioni di rete.
0
0
0
2019-08-07 15:17:33 +0000

Si può chiudere una presa di ascolto usando ss :

sudo ss --kill state listening src :1234

dove 1234 è il numero della porta.

ss fa parte del pacchetto iproute2, quindi c'è un forte cambiamento che è già installato su un moderno Linux.

Ho appreso questo da una risposta ad una domanda correlata .