Come chiudere le porte TCP e UDP tramite la riga di comando di Windows


160

Qualcuno sa come chiudere un socket TCP o UDP per una singola connessione tramite la riga di comando di Windows?

Cercando su questo, ho visto alcune persone chiedere la stessa cosa. Ma le risposte sembravano una pagina manuale di comandi netstat o netsh incentrati su come monitorare le porte. Non voglio risposte su come monitorarli (lo faccio già). Voglio chiuderli / ucciderli.

EDIT, per chiarimenti: supponiamo che il mio server ascolti la porta TCP 80. Un client effettua una connessione e la porta 56789 è allocata per essa. Quindi, scopro che questa connessione non è desiderata (ad esempio, questo utente sta facendo cose cattive, abbiamo chiesto loro di interrompere ma la connessione non è stata interrotta da qualche parte lungo la strada). Normalmente aggiungerei un firewall per fare il lavoro, ma ciò richiederebbe del tempo ed ero in una situazione di emergenza. Uccidere il processo che possiede la connessione è davvero una cattiva idea qui perché questo eliminerebbe il server (tutti gli utenti perderebbero la funzionalità quando vogliamo semplicemente eliminare selettivamente e temporaneamente questa connessione).


1
Perché? Non è possibile chiudere le porte dalla riga di comando o i file. Devi chiudere i programmi che li possiedono. O ti riferisci alle operazioni del firewall? La tua domanda rimane poco chiara.
Marchese di Lorne,

9
Posso capire il voto negativo. Ma perché i voti stretti? Questa domanda è legittima.
Victor Stafusa,

Risposte:


65

Sì, questo è possibile. Non è necessario essere il processo corrente che possiede il socket per chiuderlo. Considerare per un momento che la macchina remota, la scheda di rete, il cavo di rete e il sistema operativo possono causare la chiusura della presa.

Considera anche che il software VPN Fiddler e Desktop può inserirsi nello stack di rete e mostrarti tutto il tuo traffico o reindirizzare tutto il tuo traffico.

Quindi tutto ciò di cui hai veramente bisogno è che Windows fornisca un'API che lo consenta direttamente o che qualcuno abbia scritto un programma che funziona in qualche modo come una VPN o Fiddler e ti dà un modo per chiudere i socket che lo attraversano.

Esiste almeno un programma ( CurrPorts ) che fa esattamente questo e l'ho usato oggi allo scopo di chiudere socket specifici su un processo avviato prima dell'avvio di CurrPorts. Per fare questo è necessario eseguirlo come amministratore, ovviamente.

Si noti che probabilmente non è facilmente possibile impedire a un programma di non essere in ascolto su una porta (beh, è ​​possibile ma quella funzionalità viene definita firewall ...), ma non credo che sia stato chiesto qui. Credo che la domanda sia "come chiudere selettivamente una connessione attiva (socket) alla porta su cui è in ascolto il mio programma?". La formulazione della domanda è un po 'off perché viene fornito un numero di porta per la connessione client in entrata indesiderata ed è stato definito "porta" ma è abbastanza chiaro che si trattava di un riferimento a quel socket e non alla porta di ascolto.


3
Sì, CP è uno strumento meraviglioso: CurrPorts.exe / chiudi <Indirizzo locale> <Porta locale> <Indirizzo remoto> <Porta remota> {Nome processo} Questa sarebbe la linea: CurrPorts.exe / chiudi * 56789 * * server. exe
JasonXA,

CurrPorts non sembra essere in grado di chiudere le connessioni multicast UDP provenienti da un processo
george_h,

143
  1. Aperto cmd

    • digitare netstat -a -n -o

    • find TCP [the IP address]:[port number] .... #[target_PID]#(idem per UDP)

    • (A proposito, kill [target_PID]non ha funzionato per me)

  2. CTRL + ALT + CANC e selezionare "avvia task manager"

    • Fai clic sulla scheda "Processi"

    • Abilita la colonna "PID" andando su: Visualizza> Seleziona colonne> Seleziona la casella PID

    • Trova il PID di interesse e "FINE PROCESSO"

  3. Ora puoi rieseguire il server su [l'indirizzo IP]: [numero porta] senza problemi


8
Quello che stai dicendo è solo per uccidere il processo del server ed eseguirlo nuovamente, che è qualcosa che volevo evitare, poiché questo lascerebbe cadere ogni connessione al server, non solo quella indesiderata.
Victor Stafusa,

7
Mi dispiace non ho aiutato a risolvere la tua domanda specifica. Stavo solo fornendo la mia risposta quando la tua domanda è emersa mentre cercavo su Google come chiudere semplicemente una porta di Windows e ho pensato che potesse essere utile anche ad altri che avevano il mio problema. :)
HaoQi Li

2
@HaoQiLi, Non puoi semplicemente porre fine a tutto. Ad esempio un Systemprocesso che gestisce le connessioni di rete di Windows.
Pacerier,

2
@HaoQiLi penso che per chiudere possiamo usare taskkill /pid 6168 /f6168 è il pid
Madhawa Priyashantha,

9
ridicola questa risposta ha tanti voti positivi quando la domanda afferma chiaramente SINGOLA CONNESSIONE non l'intero processo !!!
Mike,

59

Ad esempio, si desidera liberare la porta 8080 Quindi, seguire questi comandi.

 netstat -ano
 taskkill /f /im [PID of the port 8080 got from previous command]

Fatto!


5
Grazie. Solo la tua soluzione mi ha aiutato.
vvator

1
Bene, aiuta effettivamente a stampare il PID quando si tenta di individuare il PID. (Chi e 'questa gente?).
Adrian M.,

3
questo sta anche uccidendo il processo di pid menzionato e non solo la chiusura della porta.
NDestiny,

1
Questo è utile
Tural Asgar,

Ho testato su Windows 10 e non uccide solo la connessione TCP ma l'intero processo o thread che la utilizza. Come ha affermato Victor, questo non è il suo obiettivo.
Sebastian

54

Se conosci la porta che vuoi liberare, puoi ordinare il tuo elenco netstat cercando la porta specifica in questo modo:

netstat -ano | findstr :8080

Quindi il pid apparirà sul rigth che puoi uccidere con taskkill.

inserisci qui la descrizione dell'immagine

taskkill/pid 11704 /F

Inoltre potresti voler esaminare questa domanda che è specificamente per localhost, ma penso che sia pertinente:


Ho testato su Windows 10 e non uccide solo la connessione TCP ma l'intero processo o thread che la utilizza. Come ha affermato Victor, questo non è il suo obiettivo.
Sebastian

27

Utilizzare TCPView: http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx
o CurrPorts: https://www.nirsoft.net/utils/cports.html

In alternativa, se non si desidera utilizzare il SOFTWARE ESTERNO (questi strumenti non richiedono in alcun modo un'installazione), è possibile PRIMA eseguire il comando netstat (preferibilmente netstat -b) e quindi impostare i Criteri di sicurezza locali per bloccare l'IP indirizzo della macchina dell'utente in questione, ecco cosa ho fatto con connessioni indesiderate o addirittura sconosciute - che ti consente di fare tutto SENZA ALCUN SOFTWARE ESTERNO (tutto viene fornito con Windows) ...


2
Questa è la risposta giusta e completamente supportata da Microsoft.
Dan Bonachea,

Ha funzionato anche per me. Ho usato i criteri di sicurezza locali -> IPSecurity Policy sul computer locale. L'interfaccia utente è abbastanza intuitiva.
Puterdo Borato,

1
Ho provato questo, la stretta connessione è disattivata per ipv6, qual è l'alternativa per chiudere ipv6 se presente?
jjxtra,


7

Non è possibile chiudere socket senza arrestare il processo proprietario di tali socket. I socket sono di proprietà del processo che li ha aperti. Quindi, per scoprire l'ID di processo (PID) per Unix / Linux. Usa netstat in questo modo:

netstat -a -n -p -l

Che stamperà qualcosa del tipo:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State     PID/Program name   
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN     1879/sendmail: acce 
tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN     1860/xinetd         

Dove -a stampa tutti i socket, -n mostra il numero di porta, -p mostra il PID, -l mostra solo ciò che è in ascolto (questo è facoltativo a seconda di ciò che stai cercando).

Le informazioni reali che desideri sono PID. Ora possiamo chiudere quel processo facendo:

kill 1879

Se stai chiudendo un servizio è meglio usare:

service sendmail stop

Kill uccide letteralmente solo quel processo e tutti i bambini che possiede. L'utilizzo del comando di servizio esegue lo script di arresto registrato nella directory init.d. Se usi kill su un servizio, potrebbe non avviarsi correttamente perché non l'hai chiuso correttamente. Dipende solo dal servizio.

Sfortunatamente, il Mac è diverso da Linux / Unix in questo senso. Non puoi usare netstat. Leggi questo tutorial se sei interessato a Mac:

http://www.tech-recipes.com/rx/227/find-out-which-process-is-holding-which-socket-open/

E se sei su Windows, usa TaskManager per interrompere i processi e l'interfaccia utente dei servizi per arrestare i servizi. Puoi usare netstat su Windows proprio come Linux / Unix per identificare il PID.

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/netstat.mspx?mfr=true


Ha fatto un chiarimento sulla sua domanda: socket client remoti che possono essere chiusi con altri strumenti, come altri hanno sottolineato. Questa risposta si concentra principalmente sui socket del server che non possono (senza armeggiare all'interno del sistema operativo). Questo è come abbattere in modo pulito un processo che possiede un socket del server che è quello che vuoi fare se questa è la porta. Ma, se hai molte connessioni in entrata al tuo server, questa è una situazione diversa e sicuramente puoi eliminarle. Non è sbagliato, non è proprio quello che l'OP stava chiedendo.
Chubbsondubs,

È necessario rimuovere la parte "uccidi il processo", perché non è una risposta alla domanda. Potresti anche fermare l'adattatore di rete per fermare il traffico, ma non uccide ancora solo il socket!
Sebastian

La risposta è corretta solo per ipv6, per ipv4 puoi chiamare SetTcpEntry
jjxtra

5

Usa CurrPorts (è gratuito e senza installazione): http://www.nirsoft.net/utils/cports.html

/close <Local Address> <Local Port> <Remote Address> <Remote Port> {Process Name}

Esempi:

# Close all connections with remote port 80 and remote address 192.168.1.10: 
/close * * 192.168.1.10 80
# Close all connections with remote port 80 (for all remote addresses): 
/close * * * 80
# Close all connections to remote address 192.168.20.30: 
/close * * 192.168.20.30 *
# Close all connections with local port 80: 
/close * 80 * *
# Close all connections of Firefox with remote port 80: 
/close * * * 80 firefox.exe

Ha anche una bella interfaccia grafica con funzionalità di ricerca e filtro.

Nota: questa risposta è la risposta e il commento di huntharo e JasonXA messi insieme e semplificati per facilitare i lettori. Gli esempi provengono dalla pagina Web di CurrPorts.


3

Non è possibile chiudere socket sul server senza possedere quei socket, quindi non è possibile chiudere effettivamente il socket senza avere il codice in esecuzione nel processo proprietario del socket del server.

Tuttavia, esiste un'altra opzione che sta dicendo al client di chiudere il suo socket. L'invio di un pacchetto RST TCP alla porta su cui si sta connettendo il client provoca l'interruzione della connessione da parte del client. Puoi farlo con la scansione RST usando nmap.

http://nmap.org/


Questa è una risposta molto migliore della tua risposta precedente! Grazie!
Sebastian


2

wkillcx è uno strumento affidabile della riga di comando di Windows per l'uccisione delle connessioni tcp dalla riga di comando che non è stata menzionata. Tuttavia, a volte presenta problemi con i server con un numero elevato di connessioni. A volte uso tcpview per uccisioni interattive, ma wkillcx può essere usato negli script.



1

Per chiudere la porta è possibile identificare il processo in ascolto su questa porta e terminare questo processo.


2
@Victor, l'ho visto ma non c'è modo di chiudere forzatamente una porta senza interrompere il processo. Un'altra possibilità è quella di scrivere il programma server in modo tale da avere una sorta di pannello di controllo quando è possibile monitorare e amministrare i client.
Darin Dimitrov,

1
Inoltre, se l'interfaccia su cui è in ascolto il socket viene disattivata, il socket si chiuderà.
Rustyx,

Credo che stesse chiedendo un esempio.
EyoelD

1

puoi usare programmi come tcpview da sysinternal. Immagino che possa aiutarti molto sia sul monitoraggio che sull'uccisione di connessioni indesiderate.


1

CurrPorts non ha funzionato per noi e abbiamo potuto accedere al server solo tramite ssh, quindi nemmeno TCPView. Non è stato possibile interrompere il processo, in modo da non eliminare altre connessioni. Ciò che abbiamo finito per fare e non è stato ancora suggerito è stato bloccare la connessione sul firewall di Windows. Sì, questo bloccherà tutte le connessioni che si adattano alla regola, ma nel nostro caso c'era una singola connessione (quella a cui eravamo interessati):

netsh advfirewall firewall add rule name="Conn hotfix" dir=out action=block protocol=T
CP remoteip=192.168.38.13

Sostituisci l'IP con quello che ti serve e aggiungi altre regole se necessario.


0

risposta istantanea / fattibile / parziale : https://stackoverflow.com/a/20130959/2584794 a

differenza della risposta precedente in cui è stato usato netstat -a -o -n l' elenco incredibilmente lungo doveva essere esaminato senza il nome dell'applicazione usando quelli porti


5
Questa è quasi la stessa cosa della risposta di HaoQi Li. Ciò ucciderebbe il processo del server eliminando ogni connessione e non solo quella indesiderata. La sfida è far cadere solo quello indesiderato e niente di più.
Victor Stafusa,

Sono d'accordo con Victor. Questa non è la risposta alla domanda. Quindi potresti anche disabilitare la scheda di rete ...
Sebastian

-3

Sì, è possibile chiudere la porta TCP o UDP, esiste un comando in DOS

TASKKILL /f /pid 1234 

Spero che questo funzioni per te


Ho testato su Windows 10 e non uccide solo la connessione TCP ma l'intero processo o thread che la utilizza. Come ha affermato Victor, questo non è il suo obiettivo.
Sebastian

-3

Se si esegue Windows 8, `Windows Server 2012 o versione successiva con PowerShell v4 sopra installato, è possibile utilizzare lo script seguente. Questo trova i processi associati alla porta e li termina.

Codice

#which port do you want to kill
[int]$portOfInterest = 80

#fetch the process ids related to this port
[int[]]$processId = Get-NetTCPConnection -LocalPort $portOfInterest | 
    Select-Object -ExpandProperty OwningProcess -Unique | 
    Where-Object {$_ -gt 0} 

#kill those processes
Stop-Process -Id $processId 

Documentazione:


Ho testato su Windows 10 e non uccide solo la connessione TCP ma l'intero processo o thread che la utilizza. Come ha affermato Victor, questo non è il suo obiettivo.
Sebastian
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.