Por que a porta UDP 443 não aceita conexões quando as regras do iptables estão definidas?
Ambiente
- Sistema operacional: Linux 6.8.0-47-generic #47-Ubuntu, aarch64
- VM na nuvem: Sim (Hetzner)
Configuração atual
Estou tentando configurar a comunicação UDP na porta 443, mas estou tendo problemas apesar de ter configurado as regras de firewall.
Passos dados
Adicionadas regras de firewall:
sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT sudo netfilter-persistent save
Regras atuais do iptables:
# IPv4 rules iptables -L -v -n | grep 443 35318 4093K f2b-nginx-limit-req 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 210K 25M f2b-nginx-php-accessrules 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 209K 25M f2b-wordpress 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 209K 25M f2b-nginx-bad-request 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 302 88281 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:443 # IPv6 rules ip6tables -L -v -n | grep 443 61618 9650K f2b-wordpress 6 -- * * ::/0 ::/0 multiport dports 80,443 61600 9649K f2b-nginx-bad-request 6 -- * * ::/0 ::/0 multiport dports 80,443 61600 9649K f2b-nginx-php-accessrules 6 -- * * ::/0 ::/0 multiport dports 80,443 1467 316K ACCEPT 17 -- * * ::/0 ::/0 udp dpt:443
Resultados da verificação de portas:
sudo nmap -sU -p 443 <server-ip> Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-26 20:14 CEST Nmap scan report for <server-ip> Host is up (0.0027s latency). PORT STATE SERVICE 443/udp open|filtered https Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds
Tentativa de teste netcat:
- Lado do servidor:
sudo nc -lu 443
- Lado do cliente:
echo 'test' | nc -u <server-ip> 443
- Lado do servidor:
Emitir
Nenhum tráfego está chegando ao processo netcat de escuta, apesar da porta aparecer como "aberta|filtrada" na varredura nmap.
Questões
- Por que a porta pode ser exibida como "aberta|filtrada" em vez de definitivamente "aberta"?
- Quais configurações adicionais posso precisar para que o tráfego UDP flua pela porta 443?
- Há alguma etapa de diagnóstico que devo seguir para identificar onde o tráfego está sendo bloqueado?
O que eu já verifiquei
- As regras de firewall estão em vigor e salvas para IPv4 e IPv6
- A porta não está bloqueada de acordo com o nmap
- Existe conectividade básica entre cliente e servidor
- O firewall de nuvem Hetzner está configurado para permitir a porta 443 UDP
- fail2ban tem várias regras para as portas 80.443, mas estas parecem ser para TCP (relacionado ao nginx)
Informações adicionais
Se alguém precisar de mais detalhes sobre minha configuração ou informações adicionais sobre depuração, por favor me avise.
1. Por que a porta pode ser exibida como "aberta|filtrada" em vez de definitivamente "aberta"?
Diferentemente do TCP, não há resposta garantida de uma porta UDP aberta. Tudo depende do protocolo de nível de aplicação sobre o UDP.
Se o lado do cliente enviar um pacote UDP e receber uma mensagem de porta ICMP inacessível , isso é uma indicação positiva de que a porta UDP de destino está fechada: ou não há nenhum aplicativo recebendo pacotes nessa porta, ou um firewall emula uma porta fechada.
Mas se o cliente não obtiver nenhuma resposta, o pacote pode ser recebido por um aplicativo do lado do servidor e ignorado porque não correspondeu ao formato esperado e o aplicativo não foi projetado para enviar pacotes de mensagem de erro de volta; ou pode ser porque um firewall descartou o pacote. Daí a
open|filtered
indicação.2. Quais configurações adicionais posso precisar para que o tráfego UDP flua pela porta 443?
Você precisa configurar o software do seu servidor web para aceitar formatos baseados em UDP do protocolo HTTP (ou seja, QUIC e HTTP/3).
Os nomes das regras do Fail2ban
f2b-nginx-limit-req
sugerem que o software do seu servidor web é , portantof2b-nginx-php-accessrules
, consulte a página de documentação do nginx sobre como habilitar o QUIC e o HTTP/3 .f2b-nginx-bad-request
nginx
Especificamente, você precisará pelo menos da
listen 443 quic reuseport;
diretiva para ativar o suporte QUIC / HTTP/3 e deste snippet para anunciar aos clientes HTTP sobre TCP que o HTTP/3 está disponível na porta (UDP) 443:Uma vez que o
listen 443 quic reuseport;
estiver em vigor, seu servidor nginx deve estar escutando conexões UDP de entrada. Você pode verificar isso com, por exemplo,sudo lsof -i udp:443
no sistema do servidor.Conforme observado por Artem S. Tashkinov, você só nos mostrou as regras do iptables que mencionam explicitamente o número da porta 443. Poderia facilmente haver regras que, por exemplo, bloqueiem todo o tráfego UDP sem levar em conta os números das portas: elas não serão visíveis com
ip(6?)tables -L -v -n | grep 443
. Se tal regra existir antes da regra que aceita tráfego UDP para a porta 443, a regra de aceitação nunca será alcançada porque a primeira regra correspondente (com umACCEPT
,DROP
ou outra ação similarmente "irrevogável") vence.Por outro lado, os contadores de pacotes/dados para as
ip(6?)tables -A INPUT -p udp --dport 443 -j ACCEPT
regras indicam que tanto a versão IPv4 quanto a versão IPv6 da regra corresponderam a pelo menos alguns pacotes. Se os contadores continuarem aumentando conforme você continua testando, isso sugeriria que aiptables
configuração provavelmente está permitindo UDP/443.3. Há alguma etapa de diagnóstico que devo seguir para identificar onde o tráfego está sendo bloqueado?
Conforme mencionado acima, você deve executar
no sistema do servidor para verificar se o seu servidor web está realmente escutando o tráfego UDP (e não apenas TCP) na porta 443.