Como fechar portas TCP e UDP via linha de comando do Windows

160

Alguém sabe como fechar um soquete TCP ou UDP para uma única conexão via linha de comando do Windows?

Pesquisando sobre isso, vi algumas pessoas perguntando a mesma coisa. Mas as respostas pareciam uma página manual de comandos netstat ou netsh, com foco em como monitorar as portas. Não quero respostas sobre como monitorá-los (eu já faço isso). Eu quero fechar / matar eles.

EDIT, para esclarecimento: digamos que meu servidor escute a porta TCP 80. Um cliente faz uma conexão e a porta 56789 é alocada para ela. Então, descobri que essa conexão é indesejada (por exemplo, esse usuário está fazendo coisas ruins, pedimos que parassem, mas a conexão não caiu em algum lugar ao longo do caminho). Normalmente, eu adicionaria um firewall para fazer o trabalho, mas isso levaria algum tempo e eu estava em uma situação de emergência. Matar o processo que possui a conexão é realmente uma péssima idéia, porque isso derrubaria o servidor (todos os usuários perderiam a funcionalidade quando apenas desejássemos eliminar seletiva e temporalmente essa conexão).

Victor Stafusa
fonte
1
Por quê? Você não pode fechar portas da linha de comando ou arquivos. Você precisa fechar os programas que os possuem. Ou você está se referindo a operações de firewall? Sua pergunta permanece incerta.
Marquês de Lorne
9
Eu posso entender o voto negativo. Mas por que os votos próximos? Esta questão é legítima.
Victor Stafusa

Respostas:

65

Sim, isso é possível. Você não precisa ser o processo atual que possui o soquete para fechá-lo. Considere por um momento que a máquina remota, a placa de rede, o cabo de rede e o sistema operacional podem causar o fechamento do soquete.

Considere também que os softwares VPN do Fiddler e do Desktop podem se inserir na pilha da rede e mostrar todo o seu tráfego ou redirecionar todo o seu tráfego.

Então, tudo o que você realmente precisa é que o Windows forneça uma API que permita isso diretamente ou que alguém tenha escrito um programa que funcione como uma VPN ou Fiddler e que seja uma maneira de fechar os soquetes que passam por ela.

Há pelo menos um programa ( CurrPorts ) que faz exatamente isso e eu o usei hoje com o objetivo de fechar soquetes específicos em um processo iniciado antes do início do CurrPorts. Para fazer isso, você deve executá-lo como administrador, é claro.

Observe que provavelmente não é fácil fazer com que um programa não escute em uma porta (bem, é possível, mas esse recurso é chamado de firewall ...), mas acho que isso não foi solicitado aqui. Acredito que a pergunta é "como fecho seletivamente uma conexão ativa (soquete) à porta em que meu programa está ouvindo?". A redação da pergunta é um pouco complicada porque é fornecido um número de porta para a conexão indesejada do cliente de entrada e foi referido como "porta", mas é bastante claro que era uma referência a esse soquete e não à porta de escuta.

huntharo
fonte
3
Sim, o CP é uma ferramenta maravilhosa: CurrPorts.exe / close <Endereço local> <Porta local> <Endereço remoto> <Porta remota> {Nome do processo} Esta seria a linha: servidor CurrPorts.exe / close * 56789 * *. exe
JasonXA
Não CurrPorts não parece ser capaz de UDP ligações multicast perto provenientes de um processo
george_h
143
  1. abrir cmd

    • digitar netstat -a -n -o

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

    • (Btw, kill [target_PID]não funcionou para mim)

  2. CTRL + ALT + DELETE e escolha "iniciar gerenciador de tarefas"

    • Clique na aba "Processos"

    • Habilite a coluna "PID" acessando: Exibir> Selecionar Colunas> Marque a caixa quanto ao PID

    • Encontre o PID de interesse e "END PROCESS"

  3. Agora você pode executar o servidor novamente em [endereço IP]: [número da porta] sem problemas

HaoQi Li
fonte
8
O que você está dizendo é apenas para matar o processo do servidor e executá-lo novamente, o que é algo que eu queria evitar, pois isso eliminaria todas as conexões com o servidor, e não apenas as indesejadas.
Victor Stafusa
7
Desculpe, não ajudei a resolver sua pergunta específica. Eu estava apenas fornecendo minha resposta, quando sua pergunta apareceu quando eu estava pesquisando sobre como simplesmente fechar uma porta do Windows e achei que poderia ser útil para outras pessoas que também tinham o meu problema. :)
HaoQi Li
2
@HaoQiLi, você não pode simplesmente acabar com tudo e qualquer coisa. Por exemplo, Systemprocesso que lida com as conexões de rede do Windows.
Pacerier
2
@HaoQiLi eu acho que para fechar podemos usar taskkill /pid 6168 /f6168 é o pid
Madhawa Priyashantha
9
ridículo, essa resposta tem tantos votos positivos quando a pergunta afirma claramente que a ÚNICA CONEXÃO não é um processo inteiro !!!
Mike
59

Por exemplo, você deseja liberar a porta 8080 Em seguida, siga estes comandos.

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

Feito!

Rahul
fonte
5
Thanx. Somente sua solução me ajudou.
vvator
1
Certo, ajuda realmente imprimir o PID ao tentar localizá-lo. (Quem são essas pessoas?).
Adrian M.
3
isso também está matando o processo de pid mencionado e não apenas fechando o porto.
NDestiny
1
Isso é útil.
Tural Asgar
Eu testei no Windows 10 e ele não mata a conexão TCP sozinha, mas todo o processo ou o segmento que a utiliza. Como Victor afirmou que não é seu objetivo.
7773 Sebastian
54

Se você conhece a porta que deseja liberar, pode classificar sua lista netstat procurando a porta especificada como esta:

netstat -ano | findstr :8080

Então o pid aparecerá no nível que você pode matar com o taskkill.

insira a descrição da imagem aqui

taskkill/pid 11704 /F

Além disso, você pode querer examinar esta questão que é especificamente para o host local, mas acho que é relevante:

Felipe Centeno
fonte
Eu testei no Windows 10 e ele não mata a conexão TCP sozinha, mas todo o processo ou o segmento que a utiliza. Como Victor afirmou que não é seu objetivo.
7773 Sebastian
27

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

Como alternativa, se você não quiser usar o SOFTWARE EXTERNO (essas ferramentas não requerem instalação a propósito), você pode simplesmente PRIMEIRO executar o comando netstat (de preferência netstat -b) e configurar a Política de Segurança Local para bloquear o IP endereço da máquina do usuário em questão, é o que tenho feito com conexões indesejadas ou até desconhecidas - que permitem que você faça tudo SEM QUALQUER SOFTWARE EXTERNO (tudo vem com o Windows) ...

Vman
fonte
2
Esta é a resposta certa e é totalmente suportado pela Microsoft.
Dan Bonachea
Trabalhou para mim também. Usei Política de Segurança Local -> Políticas de Segurança IPS no Computador Local. A interface do usuário é bastante intuitiva.
Puterdo Borato
1
Tentei isso, a conexão estreita está acinzentada para o ipv6, qual é a alternativa para fechar o ipv6, se houver?
Jjxtra # 10/19
7

Você não pode fechar soquetes sem desligar o processo que possui esses soquetes. Os soquetes pertencem ao processo que os abriu. Então, para descobrir o ID do processo (PID) do Unix / Linux. Use netstat da seguinte maneira:

netstat -a -n -p -l

Isso imprimirá algo como:

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         

Onde -a imprime todos os soquetes, -n mostra o número da porta, -p mostra o PID, -l mostra apenas o que está ouvindo (isso é opcional, dependendo do que você procura).

A informação real que você deseja é PID. Agora podemos encerrar esse processo fazendo:

kill 1879

Se você estiver encerrando um serviço, é melhor usar:

service sendmail stop

Matar literalmente mata exatamente esse processo e todos os filhos que possui. O uso do comando service executa o script de desligamento registrado no diretório init.d. Se você usar kill em um serviço, ele poderá não iniciar corretamente, porque você não o desligou corretamente. Depende apenas do serviço.

Infelizmente, o Mac é diferente do Linux / Unix a esse respeito. Você não pode usar o netstat. Leia este tutorial se estiver interessado em Mac:

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

E se você estiver no Windows, use o TaskManager para eliminar processos e interface do usuário de serviços para desligar os serviços. Você pode usar o netstat no Windows, assim como o Linux / Unix, para identificar o PID.

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

chubbsondubs
fonte
Ele fez um esclarecimento sobre sua pergunta, que é soquetes remotos de clientes que podem ser fechados com outras ferramentas, como outros já apontaram. Esta resposta é focada principalmente em soquetes de servidor que não podem (sem mexer dentro do sistema operacional). É assim que você limpa um processo que possui um soquete de servidor que é o que você deseja fazer se essa for a porta. Mas, se você tem muitas conexões de entrada com o servidor, essa é uma situação diferente e você definitivamente pode matá-las. Não está errado, mas não exatamente o que o OP estava perguntando.
Chubbsondubs
Você deve remover a parte "matar o processo", porque não é uma resposta para a pergunta. Você também pode parar o adaptador de rede para interromper o tráfego, mas ele ainda não mata o soquete!
7773 Sebastian
Resposta está correta apenas para IPv6, para ipv4 você pode chamar SetTcpEntry
jjxtra
5

Use CurrPorts (gratuito e sem instalação): http://www.nirsoft.net/utils/cports.html

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

Exemplos:

# 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

Ele também possui uma interface gráfica agradável com recursos de pesquisa e filtro.

Nota: Esta resposta é huntharo e a resposta e o comentário de JasonXA juntos e simplificados para facilitar para os leitores. Exemplos vêm da página da CurrPorts.

qwertzguy
fonte
3

Você não pode fechar soquetes no servidor sem possuir esses soquetes; portanto, não é possível fechar o soquete sem ter o código em execução no processo que possui o soquete do servidor.

No entanto, há outra opção que diz ao cliente para fechar seu soquete. Enviar um pacote RST TCP para a porta na qual o cliente está conectado fará com que o cliente interrompa sua conexão. Você pode fazer isso com a digitalização RST usando o nmap.

http://nmap.org/

chubbsondubs
fonte
Essa é uma resposta muito melhor que a sua resposta anterior! Obrigado!
7773 Sebastian
2

O wkillcx é uma ferramenta de linha de comando do Windows confiável para eliminar as conexões TCP da linha de comando que não foi mencionada. Às vezes, porém, há problemas com servidores com grande número de conexões. Às vezes eu uso o tcpview para mortes interativas, mas o wkillcx pode ser usado em scripts.

user3310805
fonte
1

Para fechar a porta, você pode identificar o processo que está escutando nessa porta e interromper esse processo.

Darin Dimitrov
fonte
2
@ Victor, eu vi, mas não há como fechar uma porta à força sem interromper o processo. Outra possibilidade é gravar o programa do servidor de forma que você tenha algum tipo de painel de controle quando puder monitorar e administrar clientes.
Darin Dimitrov
1
Além disso, se a interface na qual o soquete está ouvindo for desativada, o soquete será fechado.
Rustyx
Eu acredito que ele estava pedindo um exemplo.
EyoelD
1

você pode usar programas como o tcpview do sysinternal. Eu acho que isso pode ajudar muito no monitoramento e na conexão indesejada.

Mochan
fonte
1

CurrPorts não funcionou para nós e só pudemos acessar o servidor através do ssh, portanto, também não houve TCPView. Também não conseguimos matar o processo, para não deixar cair outras conexões. O que acabamos fazendo e ainda não foi sugerido foi bloquear a conexão no Firewall do Windows. Sim, isso bloqueará todas as conexões que se encaixam na regra, mas, no nosso caso, havia uma única conexão (aquela em que estávamos interessados):

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

Substitua o IP pelo que você precisa e adicione outras regras, se necessário.

afarah
fonte
0

resposta instantânea / viável / parcial : https://stackoverflow.com/a/20130959/2584794

ao contrário da resposta anterior onde netstat -a -o -n foi usado lista incrivelmente longa era para ser examinada sem o nome do aplicativo usando aqueles portos

Anup
fonte
5
Isso é quase a mesma coisa que a resposta de HaoQi Li. Isso mataria o processo do servidor, eliminando todas as conexões, e não apenas a indesejada. O desafio é abandonar apenas o indesejado e nada mais.
precisa saber é o seguinte
Eu concordo com Victor. Essa não é a resposta para a pergunta. Então, você também pode desativar a Rede-Adapter ...
Sebastian
-3

Sim, é possível fechar a porta TCP ou UDP, existe um comando no DOS

TASKKILL /f /pid 1234 

Espero que isso funcione para você

Bijay Budhathoki
fonte
Eu testei no Windows 10 e ele não mata a conexão TCP sozinha, mas todo o processo ou o segmento que a utiliza. Como Victor afirmou que não é seu objetivo.
7773 Sebastian
-3

Se você estiver executando no Windows 8, `Windows Server 2012 ou superior, com o PowerShell v4 acima instalado, poderá usar o script abaixo. Isso localiza os processos associados à porta e os encerra.

Código

#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 

Documentação:

JohnLBevan
fonte
Eu testei no Windows 10 e ele não mata a conexão TCP sozinha, mas todo o processo ou o segmento que a utiliza. Como Victor afirmou que não é seu objetivo.
7773 Sebastian