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

Fechar manualmente uma porta a partir da linha de comandos

Quero fechar uma porta aberta que está em modo de escuta entre a minha aplicação cliente e a do servidor.

Existe alguma opção de linha de comandos manual no Linux para fechar uma porta?

NOTE: Vim saber que “apenas a aplicação que possui a tomada ligada deve fechá-la, o que acontecerá quando a aplicação terminar”

Não percebo porque é que só é possível pela aplicação que a abre… Mas ainda estou ansioso por saber se existe outra forma de o fazer.

Respostas (13)

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

Eu tinha o mesmo problema, o processo tem de se manter vivo, mas a tomada tem de fechar. Fechar uma tomada num processo em execução não é impossível mas difícil:

  1. localizar o processo :

  2. localizar o descritor de ficheiros da tomada no processo

  3. Agora ligue o processo:

    1. Feche agora a tomada:
20
20
20
2012-02-13 08:44:54 +0000

Fuser também pode ser usado

fuser -k -n *protocol portno*

Aqui o protocolo é tcp/udp e portno é o número que deseja fechar. Por exemplo,

fuser -k -n tcp 37

Mais informações em fuser man page

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

Em alternativa, pode utilizar os iptables:

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

. Isto irá fazer descer todo o tráfego TCP para a porta 80.

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

Deve dizer-lhe, se estiver a executar apache, “httpd” (isto é apenas um exemplo, utilize a porta que a sua aplicação está a utilizar em vez de 80)

pkill -9 httpd

ou

killall -9 httpd
2
2
2
2015-05-27 03:46:19 +0000

Primeiro procurei os processos de mongo e nó, depois fiz o seguinte:

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

Uma vez identificados, basta matar os processos com o comando kill.

kill -9 10418
kill -9 10490

Finalmente, digite meteor e deverá estar a funcionar novamente.

2
2
2
2012-04-22 05:02:17 +0000

Você provavelmente poderia apenas descobrir a que processo abriu a tomada à qual a porta está associada, e matar esse processo.

Mas, você teria que perceber que, a menos que esse processo tenha um manipulador que desinicialize todo o material que estava usando (arquivos abertos, tomadas, garfos, material que pode permanecer a menos que seja fechado corretamente ao terminar), então você teria criado esse arrastamento no desempenho do sistema. Além disso, a tomada permanecerá aberta até que o kernel perceba que o processo foi morto. Isso normalmente leva apenas cerca de um minuto.

Suponho que a melhor pergunta seria: Que porta (pertencente a que processo) quer parar?

Se está a tentar pôr fim a uma porta traseira ou a um vírus que encontrou, então deve pelo menos saber que dados estão a ir e vir antes de o terminar. (a partilha de fios é boa para isto) (E o nome do executável do processo para que o possa apagar e evitar que volte a ser reiniciado) ou, se for algo que tenha instalado (como HTTPD ou FTPD ou algo do género) então já deve ter acesso ao processo em si.

Normalmente terá um programa de controlo (HTTPD stop|start ou algo do género). Ou, se é uma coisa do sistema, provavelmente não deve mexer com ele. De qualquer forma, pensei que como toda a gente lhe está a dar o ângulo “como fazer”, eu devia dar-lhe as advertências.

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

Se quiser que a sua porta seja libertada mais cedo, tem de definir o seguinte valor:

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

para a definir de 60 segundos (por defeito) para 1 segundo

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

Você poderia escrever um script que modificasse os iptables e os reiniciasse. Um script para adicionar uma regra para largar todos os pacotes na porta, outro script para remover essa regra.

As outras respostas mostraram-lhe como matar o processo vinculado à porta - isto pode não ser o que você quer. Se quer que o servidor continue a funcionar, mas para evitar ligações de clientes, então quer bloquear a porta, e não parar o processo.

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

Pode usar o comando chamado killcx, fechando uma ligação sem qualquer processo a ser morto.

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

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

Estou ciente de que esta resposta não responde à pergunta propriamente dita, em sentido estrito, mas lendo nela esta pode ser uma informação relevante:

O comportamento por defeito de ligar uma tomada a uma porta (e endereço) é que, quando a tomada é fechada por uma interrupção abrupta do processo, a tomada permanecerá em TIME_WAIT durante algum tempo. Isto significa que não poderá voltar a ligar imediatamente a este endereço/porta. Se estiver a desenvolver o próprio sistema através da interface padrão de socket BSD, pode (pelo menos até certo ponto) controlar este comportamento com a opção socket SO_REUSEADDR. Isto irá permitir-lhe basicamente ligar-se novamente ao mesmo endereço/porta se o socket estiver no estado TIME_WAIT. No entanto, ainda uma tomada por porta!

No entanto, esta informação só deve ser utilizada como ajuda ao desenvolvimento, uma vez que existe uma razão para que a TIME_WAIT exista em primeiro lugar, já explicada nas outras respostas.

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

Mais uma questão: em algum momento o núcleo é proprietário dos próprios portos. Eu sei que o NAT routing mantém algumas portas abertas para utilização NAT. Não se pode matar um processo por isso, isto é um kernel, e é necessária uma reconfiguração e uma reinicialização.

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

Se não quer tráfego na tomada, mas quer manter vivo o processo: (http://linux.die.net/man/8/tcpkill).

tcpkill -i eth0 host xxx.xxx.xxx.xxx and port yyyy

Iniciará um daemon farejador que intercepta e destrói todo o tráfego naquela porta. Muito útil para testar as suas aplicações para divisões de rede.

0
0
0
2019-08-07 15:17:33 +0000

Pode fechar uma tomada de escuta usando ss :

sudo ss --kill state listening src :1234

Onde 1234 é o seu número de porta.

ss faz parte do pacote iproute2, por isso há uma forte alteração que já está instalado num Linux moderno.

Aprendi isto com uma resposta a uma pergunta relacionada .