Desejo fechar uma porta aberta que esteja no modo de escuta entre meu aplicativo cliente e servidor.
Existe alguma opção de linha de comando manual no Linux para fechar uma porta?
NOTA: Soube que "somente o aplicativo que possui o soquete conectado deve fechá-lo, o que acontecerá quando o aplicativo terminar".
Não entendo por que isso só é possível pelo aplicativo que o abre ... Mas ainda estou ansioso para saber se existe outra maneira de fazer isso.
Respostas:
Eu tive o mesmo problema, o processo deve permanecer vivo, mas o soquete deve fechar. Fechar um soquete em um processo em execução não é impossível, mas difícil:
localize o processo:
Você pega um
source/destination ip:port portstate pid/processname
mapalocalize o descritor de arquivo do soquete no processo
Você obtém uma lista: nome do processo, pid, usuário, fileDescriptor, ... uma cadeia de conexão.
Localize o número fileDescriptor correspondente para a conexão. Será algo como "97u", que significa "97".
Agora conecte o processo:
Agora feche o soquete:
exemplo:
Em seguida, desanexe o gdb:
E a tomada está fechada.
fonte
sudo lsof -np $pid
dá-me cerca de 200 linhas e estou confuso sobre como encontrar o FD desejado. No meu processo caso é um separador Chrome e eu estou tentando fechar websockets abertos ...shutdown
:call shutdown($fileDescriptor, 0)
.Você está fazendo a pergunta errada aqui. Não é realmente possível simplesmente "fechar uma porta" de fora do aplicativo que abriu o soquete. A única maneira de fazer isso é matar completamente o processo que possui a porta. Então, em cerca de um minuto ou dois, a porta ficará disponível novamente para uso. Aqui está o que está acontecendo (se você não se importa, pule para o final, onde eu mostro como eliminar o processo que possui uma porta específica):
Portas são recursos alocados pelo sistema operacional para diferentes processos. Isso é semelhante a pedir ao sistema operacional um ponteiro de arquivo. No entanto, diferentemente dos ponteiros de arquivo, apenas UM processo de cada vez pode possuir uma porta. Por meio da interface do soquete BSD, os processos podem solicitar uma escuta em uma porta, que o sistema operacional concederá. O sistema operacional também garantirá que nenhum outro processo obtenha a mesma porta. A qualquer momento, o processo pode liberar a porta fechando o soquete. O sistema operacional recuperará a porta. Como alternativa, se o processo terminar sem liberar a porta, o sistema operacional acabará por recuperá-la (embora isso não aconteça imediatamente: levará alguns minutos).
Agora, o que você deseja fazer (basta fechar a porta na linha de comando) não é possível por dois motivos. Primeiro, se fosse possível, isso significaria que um processo poderia simplesmente roubar o recurso de outro processo (a porta). Isso seria uma política ruim, a menos que restrito a processos privilegiados. A segunda razão é que não está claro o que aconteceria com o processo que possuía a porta se a deixássemos continuar em execução. O código do processo é escrito assumindo que ele possui esse recurso. Se simplesmente o retirássemos, ele acabaria travando por conta própria, para que os sistemas operacionais não o deixem fazer isso, mesmo que você seja um processo privilegiado. Em vez disso, você deve simplesmente matá-los.
De qualquer forma, veja como matar um processo que possui uma porta específica:
Isso produzirá a linha correspondente à porta de retenção do processo, por exemplo:
Nesse caso, procHoldingPort é o nome do processo que abriu a porta, 4683 é seu pid e 8000 (observe que é TCP) é o número da porta que possui.
Então, olhe na última coluna, você verá /. Em seguida, execute o seguinte:
Se isso não funcionar (você pode verificar executando novamente o comando netstat). Fazem isto:
Em geral, é melhor evitar o envio de SIGKILL, se puder. É por isso que eu digo para você tentar
kill
anteskill -9
. Apenas usarkill
envia o SIGTERM mais suave.Como eu disse, ainda levará alguns minutos para a porta reabrir se você fizer isso. Não sei como acelerar isso. Se alguém o fizer, eu adoraria ouvir.
fonte
unix.tools.port.close(<my port number>)
eu usariainit 6
.O fusor também pode ser usado
Aqui, o protocolo é tcp / udp e portno é o número que você deseja fechar. Por exemplo
Mais informações na página de manual do fusor
fonte
fuser
execução?fuser
localiza o processo usando a porta e a mata, mas não resolve o fato de que o soquete não está fechado. 60 segundos e o kernel faz isso por mim.Você também pode usar o iptables:
Basicamente, realiza o que você deseja. Isso descartará todo o tráfego TCP para a porta 80.
fonte
-j REJECT
para retornar o sinalizador de redefinição de TCP, que seria visto como meu processo de propriedade (mas apenas quando o outro lado tentar para enviar algo).Deve informar, se você estiver executando o apache, "httpd" (este é apenas um exemplo, use a porta que seu aplicativo está usando, em vez de 80)
ou
fonte
Você provavelmente poderia descobrir qual processo abriu o soquete ao qual a porta está associada e eliminar esse processo.
Mas, você teria que perceber que, a menos que esse processo tenha um manipulador que des-inicialize todas as coisas que estava usando (arquivos abertos, soquetes, garfos, coisas que podem permanecer a menos que seja fechado corretamente após a rescisão), você teria criado isso arraste no desempenho do sistema. Além disso, o soquete permanecerá aberto até que o kernel perceba que o processo foi encerrado. Isso geralmente leva apenas um minuto.
Suponho que a melhor pergunta seria: Qual porta (pertencente a qual processo) você deseja parar?
Se você está tentando acabar com um backdoor ou vírus que encontrou, pelo menos deve saber quais dados estão indo e voltando antes de finalizá-los. (o wireshark é bom para isso) (e o nome do executável do processo para que você possa excluí-lo e impedir que ele volte à reinicialização) ou, se for algo que você instalou (como HTTPD ou FTPD ou algo assim), então você já deve ter acesso a o próprio processo.
Normalmente ele terá um programa de controle (HTTPD stop | start ou algo assim). Ou, se for uma coisa do sistema, você provavelmente não deve mexer com isso. Enfim, eu pensei que, já que todo mundo está lhe dando o ângulo "como fazer", eu deveria lhe dar as advertências.
fonte
Procurei primeiro os processos mongo e node e, em seguida, fiz o seguinte:
Uma vez identificado, basta matar os processos com o comando kill.
Por fim, digite
meteor
e deve estar funcionando novamente.fonte
Você pode escrever um script que modifique as tabelas de ip e as reinicie. Um script para adicionar uma regra descartando todos os pacotes na porta, outro script para remover a referida regra.
As outras respostas mostraram como matar o processo vinculado à porta - isso pode não ser o que você deseja. Se você deseja que o servidor continue em execução, mas para impedir conexões de clientes, deseja bloquear a porta, não pare o processo.
fonte
Mais uma questão: em algum momento o kernel possui portas próprias. Eu sei que o roteamento NAT mantém algumas portas abertas para uso do NAT. Você não pode matar um processo para isso, este é um kernel e é necessária uma reconfiguração e uma reinicialização.
fonte
Se você deseja que sua porta seja lançada mais cedo, defina o seguinte valor:
para configurá-lo de 60 segundos (padrão) para 1 segundo
fonte
Você pode usar o comando killcx, fechando uma conexão sem que nenhum processo seja morto.
fonte
Estou ciente de que esta resposta não responde à pergunta propriamente dita, mas estritamente a leitura pode ser uma informação relevante:
O comportamento padrão de vincular um soquete a uma porta (e endereço) é que, quando o soquete é fechado por um encerramento abrupto do processo, o soquete permanece no TIME_WAIT por um tempo. Isso significa que você não pode se reconectar imediatamente a este endereço / porta. Se você estiver desenvolvendo o próprio sistema por meio da interface de soquete BSD padrão, poderá (pelo menos até certo ponto) controlar esse comportamento com a opção de soquete SO_REUSEADDR. Basicamente, isso permitirá que você ligue novamente ao mesmo endereço / porta se o soquete estiver no status TIME_WAIT. Ainda um soquete por porta!
No entanto, essas informações devem ser usadas apenas como ajuda ao desenvolvimento, pois há uma razão para que TIME_WAIT exista em primeiro lugar, já explicado nas outras respostas.
fonte
Se você não deseja tráfego no soquete, mas deseja manter vivo o processo: tcpkill .
Inicia um daemon sniffing que intercepta e destrói todo o tráfego nessa porta. Muito útil para testar seus aplicativos quanto a divisões de rede.
fonte
Você pode fechar um soquete de escuta usando ss :
Onde 1234 é o seu número da porta.
ss faz parte do pacote iproute2, portanto há uma mudança forte que já está instalada em um Linux moderno.
Aprendi sobre isso com uma resposta a uma pergunta relacionada .
fonte