Nftables はメーターでブロックすると期待通りに動作しない

Nftables はメーターでブロックすると期待通りに動作しない

目標: 送信元 IP と宛先ポートのレートが 1 秒あたり 200 パケットを超える超過パケットを考慮します。例:

1 秒から 2 秒: IP 1.1.1.1 から MyServer:80
[これは 1 秒目に 201 回発生します]

table netdev filter {
    set whitelist {
        type ipv4_addr
        elements = { 186.248.79.100 }
    }

    set blocklist {
        type ipv4_addr
        size 65535
        flags dynamic,timeout
        timeout 30s
    }

    chain ingress {
        type filter hook ingress device "eth0" priority -450; policy accept;
        ip saddr @whitelist accept
        ip daddr 10.0.0.192 jump input
        ip daddr != 10.0.0.192 jump forward
    }

    chain http {
        ip saddr 191.185.17.156 counter
        meter http size 65535 { ip saddr . tcp dport limit rate over 200/second } add @blocklist { ip saddr } counter
    }

    chain forward { }

    chain input {
        tcp dport vmap { 8000 : jump portainer, 9443 : jump portainer }
        tcp dport vmap { 80 : jump http }
    }
}

問題は http チェーン内にあります。つまり、サーバーに 20 個の http 要求を送信しました (パブリック ソース IP は 191.185.17.156)。受け入れカウンターには、合計 200 個のパケット (TCP ツリー ウェイ ハンドシェイク、ack などを含む) があることが示されています。それまでは正常です。次を参照してください。

ip saddr 191.185.17.156 counter packets 100 bytes 4920

meter http size 65535 { ip saddr . tcp dport limit rate over 200/second } add @blocklist { ip saddr } counter packets 73 bytes 3576

さて、何が頭を悩ませているのでしょうか。ソース IP からサーバーのポート 80 に 100 個のパケットが送信され、同時に 73 個の超過パケットが存在するのはなぜでしょうか。100 は 200 より小さいので、2 番目のカウンターは空であるはずです。

言うまでもなく、IPv4 は不当にブロックリストに追加されています。

関連情報