NFTABLE の問題: IPv6 はミラー構成では IPv4 のように動作しない

NFTABLE の問題: IPv6 はミラー構成では IPv4 のように動作しない

私のサーバーでは IPv6 に問題があります。 IPv4 と IPv6 からポート 443 をリッスンするように nginx を設定しました。そして、それはうまく機能しています。私の Web サイトは、TLS が有効になっているインターネットから利用できます。

nftables を有効にすると、状況は複雑になります。IPv4 から Web サイトにアクセスすると動作しますが、IPv6 からアクセスすると接続がタイムアウトします :(

出力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;
        }
}

出力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

注: ポート 22 の ssh ではこの問題は発生しません。私はnftables v0.9.8 (E.D.S.)Debian 11 で実行しています。

解決策を探すのにほぼ1日かかりました。どんな助けでも大歓迎です!ありがとう

答え1

IPv6 上のプロトコルである ICMPv6 は、マルチキャストとユニキャストを使用してリンク層の解決を実装します。ICMPv6 をドロップすると、解決が利用できなくなります。つまり、ノードは同じ LAN 内の他のノードを見つけることができません。これには、ICMPv6 がドロップされると IPv6 を使用して Linux システムと通信できない上流の IPv6 ルーターが含まれます。

対照的に、IPv4は異なるプロトコル、ARP(ブロードキャストとユニキャストを使用)に依存しており、これはIPv4上では機能しません。そのため、ARPは影響を受けないため、ICMPをすべてドロップしてもLAN接続の問題は発生しません(ただし、PMTU ブラックホール特にトンネルを使用している場合、ICMP をすべてドロップすると、その他の同様の問題が発生します。

まずICMPv6をすべて有効にし、IPv6が再び機能していることを確認したら、すべてを有効にしたくない場合は、選択的に受け入れるものをチェックします。近隣探索プロトコル(非ルーティング ノードの場合、少なくともタイプ 134、135、136、および 137 が必要になります)。

nft add rule inet filter INPUT 'icmpv6 type { 134, 135, 136, 137 } accept'

答え2

これは私にとってはうまくいきました:

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
    }
}

あなたがキャプチャしたパケットは、私のものと同じ ECN パケットであることに注意してください (ただし、私のパケットはリンク ローカル fe80::/10 saddr からの ip6 hoplimit 1 を持ち、あなたのパケットは ip6 hoplimit 45 を持っています)。私の ISP (Spectrum Broadband) によって IPv6 ブロックが割り当てられるには、このパケットを受け入れる必要があるようです。おそらくあなたも、これらの ECN パケットに関連して同様の問題を抱えているのでしょう。

関連情報