Como fechar portas no Linux?

38

Eu tenho alguma dúvida no fechamento do porto, acho que tenho algumas coisas estranhas.

Quando eu uso execute

nmap --top-ports 10 192.168.1.1

mostra que a porta 23 / TCP está aberta.

Mas quando eu executo

nmap --top-ports 10 localhost

mostra que a porta 23 / tcp está fechada.

Qual deles é verdadeiro? Quero fechar esta porta em todo o meu sistema, como posso fazer isso?

user74080
fonte
10
ambos são verdadeiros. As portas TCP não estão associadas aos hosts. eles estão associados a interfaces de rede. a diferença é sutil, mas importante. As interfaces geralmente são iguais aos hosts, mas nem sempre. neste caso (como indicado nas respostas) localhostestá acessando a lointerface (loopback). o endereço IP está acessando sua interface real, provavelmente eth0ou algo assim wlan0.
strugee
3
A aparente ingenuidade dessa pergunta levou a algumas respostas fantásticas. Obrigado pela pergunta!
dotancohen

Respostas:

47

O Nmap é um excelente scanner de portas, mas às vezes você quer algo mais autoritário. Você pode perguntar ao kernel quais processos possuem quais portas abrem usando o netstatutilitário:

me @ myhost: ~ $ sudo netstat -tlnp
Conexões de Internet ativas (apenas servidores)
Proto Recv-Q Send-Q Endereço Local Estado Estrangeiro Estado Nome do PID / Programa
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 1004 / dnsmasq    
tcp 0 0 0.0.0.0:22 0.0.0.0:* ESCUTE 380 / sshd        
tcp 0 0 127.0.0.1:631 0.0.0.0:* ESCUTE 822 / cupsd       
tcp6 0 0 ::: 22 ::: * LISTEN 380 / sshd        
tcp6 0 0 :: 1: 631 ::: * ESCUTE 822 / cupsd       

As opções que eu dei são:

  • -t Apenas TCP
  • -l Apenas portas de escuta
  • -n Não procure nomes de serviço e host, apenas exiba números
  • -p Mostrar informações do processo (requer privilégio root)

Nesse caso, podemos ver que sshdestá escutando em qualquer 0.0.0.0porta de interface ( ) 22 e cupsdestá escutando na 127.0.0.1porta 631 de loopback ( ). Sua saída pode mostrar que telnetdpossui um endereço local de 192.168.1.1:23, o que significa que não responderá às conexões no adaptador de loopback (por exemplo, você não pode telnet 127.0.0.1).

Existem outras ferramentas que mostrarão informações semelhantes (por exemplo, lsofou /proc), mas o netstat é o mais amplamente disponível. Até funciona no Windows ( netstat -anb). O BSD netstat é um pouco diferente: você terá que usar o sockstat (1) para obter as informações do processo.

Depois de ter o ID do processo e o nome do programa, você poderá encontrar o processo e eliminá-lo se desejar fechar a porta. Para um controle mais refinado, você pode usar um firewall (iptables no Linux) para limitar o acesso a apenas determinados endereços. Pode ser necessário desativar uma inicialização do serviço. Se o PID é "-" no Linux, provavelmente é um processo do kernel (isso é comum no NFS, por exemplo), então boa sorte é descobrir o que é.

Nota: Eu disse "autoritário" porque você não está sendo prejudicado pelas condições da rede e pelos firewalls. Se você confia no seu computador, isso é ótimo. No entanto, se você suspeitar que foi invadido, talvez não consiga confiar nas ferramentas do seu computador. Substituir utilitários padrão (e às vezes até chamadas de sistema) por outros que ocultam determinados processos ou portas (também conhecido como rootkits) é uma prática padrão entre os invasores. Sua melhor aposta neste momento é fazer uma cópia forense do seu disco e restaurar do backup; em seguida, use a cópia para determinar como eles entraram e fechá-la.

bonsaiviking
fonte
14

Um sistema Linux possui uma interface de loopback, que é para comunicação interna. O nome do host é localhoste o endereço IP é 127.0.0.1.

Quando você executa , nmapna localhostverdade você executa o portscan na interface de loopback virtual . 192.168.1.1é o endereço IP da sua interface física (provavelmente eth0).

Então você rodou nmapem duas interfaces de rede diferentes, é por isso que há uma diferença nas portas abertas. Ambos são verdadeiros.

Se você tiver a porta TCP 23 aberta, é provável que você tenha um telnetservidor em execução (o que não é bom devido à falta de criptografia) ou que você tenha algum tipo de cavalo de Troia em sua máquina.

psimon
fonte
1
então como posso fechá-lo?
user74080
4
@ user74080 Você pode adicionar uma iptablesregra, como sugere uma resposta próxima, mas manterá o serviço sem uso, o que consome recursos. Portanto, se você estiver telnetdexecutando, desligue-o.
Psimon
12

Para "fechar" a porta, você pode usar iptables

sudo iptables -A INPUT -p tcp --dport 23 -m state --state NEW,ESTABLISHED -j DROP
Angra
fonte
1
Nesta resposta, "fechar a porta" significa "ignorar qualquer tráfego nela". A porta ainda está aberta, mas não pode mais ser acessada. Observe também que DROP, como diz, ele vê o pacote e depois o ignora. Normalmente (sem o iptables ativado), o kernel envia um pacote inacessível da porta ICMP de volta (que pode ser simulado com o REJECTdestino em vez de DROP).
Lekensteyn
3
A porta ICMP @Lekensteyn inacessível é para UDP. O pacote adequado para responder é um pacote TCP RST, que também pode ser gerado usando o REJECTdestino por escrito -j REJECT --reject-with tcp-reset.
Kasperd
Apesar de sua pontuação mais baixa, esta é a primeira resposta para realmente responder à pergunta. Quem puder adicionar mais pontuações aqui, faça-o.
EnzoR
2

Se você o fizer nmap localhost, ele informará sobre uma situação diferente: alguns programas no linux funcionam como servidor, embora sejam usados ​​apenas localmente. Isso ocorre porque outros programas os usam como um servidor ao qual eles se conectam. Portanto, as duas respostas são verdadeiras, pois você pergunta algo diferente.

A porta 23 é usada para telnet. Normalmente não é mais usado. Tente fazer nmap -sV 192.168.1.1para descobrir qual programa abre a porta.

(192 ... é um IP de rede local, portanto, o resultado de nmap <your outside world IP>também fornecerá um resultado diferente, devido a possíveis configurações de firewall etc.)

PythoNic
fonte
1

Se você tem um serviço em execução e escuta na porta 23, é mais fácil parar o processo que escuta a porta 23 (provavelmente telnet) do que mantê-lo em execução e fechar ou bloquear a porta 23 iptables.

Quando não há processo escutando uma porta, mesmo na ausência de um bloco de firewall, qualquer tentativa de conexão com ela deve resultar em uma "conexão recusada" imediata ( ECONNREFUSEDpara connect(2))

Uma maneira de encontrar o processo (e seu pid) que escuta na porta 23, se houver, é:

sudo lsof -i -P | grep ':23 '

Nas -ilistas acima, abra portas da Internet (UDP e TCP) e -P inibe a conversão de portas em nomes de serviço (via /etc/services)

Depois de encontrar o processo em execução escutando na porta 23, você pode descobrir como ele começou olhando a árvore de processos (por exemplo, pstree). Se o pai dela for init(muito provável), você poderá procurar recursivamente o nome do processo em /etc. por exemplo:

sudo grep -r telnet /etc

Isso deve levar você à melhor maneira de impedir que ele seja executado em primeiro lugar.

arielf
fonte
Não há necessidade de usar grep (e, se houver, não há necessidade de aspas). Você pode usar sudo lsof -Pi :23.
Théophile
As aspas estão lá por um bom motivo. Para garantir que apenas a porta telnet ( 23) seja correspondida. Se você não incluir um espaço depois :23que ele corresponder :234, :2345etc.
arielf 17/09
Ah entendo. Isso faz sentido para grep. Aliás, parece que o comando sem grep ( lsof -Pi :23) procura uma correspondência exata.
Théophile