
Tenho um problema com IPv6 no meu servidor. Tenho o nginx configurado para escutar na porta 443 de IPv4 e IPv6. E funciona muito bem: meu site está disponível na Internet com TLS habilitado.
As coisas ficam complicadas quando eu ativo o nftables:quando estou acessando meu site pelo IPv4 ele funciona, mas quando acesso pelo IPv6 as conexões atingem o tempo limite :(
Saída de sudo nft list ruleset
:
table inet filter {
chain INPUT {
type filter hook input priority filter; policy drop;
meta nftrace set 1
ct state established,related accept comment "allow established connections"
iif "lo" accept comment "allow all from localhost"
iif != "lo" ip daddr 127.0.0.0/8 counter packets 0 bytes 0 drop comment "drop connections to loopback not coming from loopback"
iif != "lo" ip6 daddr ::1 counter packets 0 bytes 0 drop comment "drop connections to loopback not coming from loopback"
iifname "tunnel0" accept comment "allow all from VPN"
udp dport 12345 accept comment "allow VPN on port 12345"
tcp dport { 22, 80, 443 } accept comment "allow HTTP, HTTPS and SSH on classic ports"
}
chain OUTPUT {
type filter hook output priority filter; policy accept;
}
chain FORWARD {
type filter hook forward priority filter; policy drop;
}
}
Saída de sudo nft monitor trace | grep 443
:
trace id 76d7cb1a inet filter INPUT packet: iif "eth0" ether saddr AA:AA:AA:AA:AA:AA ether daddr BB:BB:BB:BB:BB:BB ip6 saddr 2a01:cb09:804b:cd61:CCCC:CCCC:CCCC:CCCC ip6 daddr 2001:CCCC:CCCC:CCCC::CCCC ip6 dscp cs0 ip6 ecn not-ect ip6 hoplimit 45 ip6 flowlabel 0 ip6 nexthdr tcp ip6 length 40 tcp sport 53184 tcp dport 443 tcp flags == syn tcp window 22240
Observe que não tenho esse problema com ssh na porta 22. Estou executando nftables v0.9.8 (E.D.S.)
no Debian 11.
Quase passei um dia procurando a solução. Qualquer ajuda é bem-vinda! Agradecer
Responder1
ICMPv6, que é um protocolo IPv6, implementa a resolução da camada de enlace usando multicast e unicast. Eliminar o ICMPv6 significa que não há mais resolução disponível: os nós não conseguem encontrar outros nós na mesma LAN. Isso inclui o roteador IPv6 upstream que não pode se comunicar com o sistema Linux usando IPv6 se o ICMPv6 for descartado.
Por outro lado, o IPv4 depende de um protocolo diferente: ARP (usando broadcast e unicast), que não funciona sobre IPv4. Portanto, é possível descartar todo o ICMP e não sofrer nenhum problema de conectividade LAN, já que o ARP não é afetado (mas ainda é possível sofrerBuraco negro PMTUe outros problemas semelhantes ao eliminar todo o ICMP, especialmente ao usar túneis).
Então comece habilitando todo o ICMPv6 e depois, em uma segunda vez, depois de validar que o IPv6 está funcionando novamente, se você não quiser habilitar tudo, verifique o que aceitar seletivamente noProtocolo de descoberta de vizinho(para um nó sem roteamento eu diria pelo menos os tipos 134, 135, 136 e 137):
nft add rule inet filter INPUT 'icmpv6 type { 134, 135, 136, 137 } accept'
Responder2
Isso funcionou para mim:
table inet filter {
chain INPUT {
type filter hook input priority 0; policy drop;
meta l4proto ipv6-icmp accept
ip6 ecn not-ect accept
# Although I used the slightly more restrictive:
# ip6 ecn not-ect ip6 hoplimit 1 accept
}
}
Observe que o pacote que você capturou é um pacote ECN, assim como o meu (exceto que o meu tem ip6 hoplimit 1 de um link-local fe80::/10 saddr, enquanto o seu tem ip6 hoplimit 45). Parece que este pacote deve ser aceito para que meu ISP (Spectrum Broadband) atribua um bloco IPv6, e talvez você esteja tendo dificuldades semelhantes relacionadas a esses pacotes ECN.