O que são portas e como serviços Linux escutam
Entenda como portas encaminham tráfego para serviços no Linux e use ss para ver o que está escutando, distinguindo portas locais de portas públicas.
O que é realmente uma porta
Uma porta é um número que permite que um servidor execute vários serviços ao mesmo tempo sem misturar o tráfego entre eles. O seu VPS tem um único endereço IP, mas pode executar simultaneamente um servidor web, um servidor SSH e uma base de dados. Quando um pacote chega, o sistema operativo precisa de saber a qual desses serviços se destina. O número da porta fornece essa informação. O tráfego web utiliza a porta 443 e o SSH utiliza a porta 22. O endereço IP entrega o pacote ao servidor; a porta entrega-o ao programa correto nesse servidor.
Uma porta é um número de 16 bits: 16 bits permitem valores de 0 a 65535, e o valor 0 é reservado. Na prática, as portas vão de 1 a 65535. As portas abaixo de 1024 são as portas "well-known" e requerem root para serem abertas. É por isso que os serviços padrão utilizam essas portas: 22 para SSH, 80 para HTTP, 443 para HTTPS e 53 para DNS. Qualquer porta acima de 1024 pode ser utilizada por programas comuns.
Existem dois tipos: TCP e UDP. Um número de porta em um deles é independente do mesmo número no outro. TCP é o protocolo orientado a ligações utilizado pela maioria dos serviços, como SSH, HTTP e bases de dados. UDP não estabelece ligações e é utilizado em serviços como DNS e algumas VPNs. Ao abrir uma porta na firewall, normalmente indica qual dos dois protocolos deve ser utilizado, por exemplo 22/tcp.
Escutar significa que um programa está à espera numa porta
Um programa que quer receber ligações pede ao kernel para "escutar" numa porta. A partir desse momento, a porta fica aberta na máquina e o programa responde a tudo o que chega nessa porta, de acordo com a firewall. Uma porta sem nenhum processo a escutar simplesmente recusa as ligações. Por isso, a primeira pergunta em qualquer verificação de segurança é: o que está a escutar e onde.
O comando para responder a essa pergunta é ss:
sudo ss -tlnpAs opções indicam TCP (t), apenas sockets em estado de escuta (l), portas numéricas (n, para ver 22 em vez de ssh) e o processo proprietário (p). Um resultado típico:
State Recv-Q Local Address:Port Process
LISTEN 0 0.0.0.0:22 sshd
LISTEN 0 127.0.0.1:5432 postgres
LISTEN 0 [::]:80 nginxA coluna Process indica qual programa é proprietário de cada porta. É assim que identifica algo que não pretendia deixar em execução.
A coluna Local Address é a parte relevante
Leia atentamente o endereço apresentado antes de cada porta, porque ele determina quem pode aceder ao serviço. Há três casos que verá constantemente.
0.0.0.0:22 significa "escutar em todos os endereços IPv4 que esta máquina possui", incluindo o endereço público. O serviço fica acessível a partir da Internet por IPv4, desde que a firewall o permita.
[::]:80 significa o mesmo para IPv6: escutar em todos os endereços IPv6, incluindo os públicos. Muitos programas fazem bind aqui por predefinição e, no Linux, um socket :: também aceita frequentemente IPv4.
127.0.0.1:5432 significa "escutar apenas no loopback". 127.0.0.1 é o endereço que uma máquina usa para comunicar consigo própria e não é encaminhável a partir de nenhum outro local. Um serviço associado a este endereço só pode ser acedido pelo mesmo servidor, nunca pela Internet, independentemente da configuração da firewall. A linha do Postgres apresentada acima é segura por construção.
A regra prática resulta diretamente daqui: uma base de dados, uma cache ou um painel de administração usados apenas pelas suas próprias aplicações devem fazer bind a 127.0.0.1, e não a 0.0.0.0. Se nunca escutarem num endereço público, não há nada que um atacante possa alcançar.
Escutar não é o mesmo que estar acessível
Há ainda uma distinção que evita muita confusão. Uma porta estar aberta na máquina, ou seja, haver um programa a escutar, é diferente de essa porta estar acessível a partir do exterior, ou seja, de a firewall permitir o acesso. As duas condições têm de ser verdadeiras para que um cliente remoto se consiga ligar. As duas falhas também se manifestam de forma diferente no lado do cliente: uma ligação recusada significa que não havia nada a escutar, enquanto uma ligação que fica bloqueada e acaba por atingir o tempo limite normalmente significa que uma firewall descartou o pacote, que é exatamente o que esses dois erros de SSH estão a indicar.
Existem, portanto, duas camadas de controlo. Decide o que fica a escutar configurando o endereço de bind de cada serviço. E decide aquilo a que o exterior pode aceder através de uma firewall. Um servidor bem administrado usa ambos: os serviços fazem bind apenas nos endereços de que necessitam, e a firewall nega tudo o que não tiver sido permitido explicitamente. Consultar o que está a escutar com ss é o primeiro passo; decidir o que a firewall permite é o segundo, conforme explicado em introdução às firewalls com UFW.
Há aqui uma particularidade que causa problemas. IPv4 e IPv6 são separados, e uma firewall que cubra apenas IPv4 deixa os serviços [::] acessíveis em IPv6. Esta armadilha específica tem um artigo próprio: a armadilha da firewall IPv6.
FAQ
Como vejo quais portas estão abertas no meu servidor Linux?
Execute sudo ss -tlnp para TCP ou sudo ss -ulnp para UDP. O comando lista todos os sockets em escuta, a porta, o endereço local ao qual estão associados e o processo que os possui. Consulte a coluna Local Address: 0.0.0.0 ou [::] significa que o serviço está exposto à rede, enquanto 127.0.0.1 significa que escuta apenas na própria máquina.
Qual é a diferença entre 0.0.0.0 e 127.0.0.1?
0.0.0.0 significa "escutar em todos os endereços IPv4", incluindo o endereço público, para que o serviço possa ser acedido pela rede. 127.0.0.1 é o loopback, o endereço que a máquina usa para comunicar consigo própria, e não é encaminhável a partir de outro local. Por isso, um serviço associado a esse endereço só pode ser acedido localmente. Associe os serviços internos a 127.0.0.1 para que nunca fiquem expostos.
Preciso de abrir uma porta na firewall para um serviço funcionar?
Apenas para serviços que tenham de ser acedidos a partir de outras máquinas. Um serviço associado a 127.0.0.1 não precisa de uma regra de firewall, porque nenhum acesso externo o pode alcançar. Um serviço em 0.0.0.0 ou [::] precisa de uma regra de firewall que permita o tráfego e deve ser bloqueado por predefinição até adicionar essa regra.
Qual é a diferença entre uma porta TCP e uma porta UDP?
TCP é baseado em ligações e é usado pela maioria dos serviços, como SSH, servidores Web e bases de dados. UDP não usa ligações e é usado por DNS e algumas VPNs. O mesmo número em TCP e UDP corresponde a portas distintas. Por isso, 53/tcp e 53/udp são diferentes. Ao escrever regras de firewall, indique o protocolo, por exemplo 22/tcp.