Problema NFTABLE: IPv6 não se comporta como IPv4 com configuração de espelho

Problema NFTABLE: IPv6 não se comporta como IPv4 com configuração de espelho

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.

informação relacionada