Nftables가 미터로 차단할 것으로 예상대로 작동하지 않습니다.

Nftables가 미터로 차단할 것으로 예상대로 작동하지 않습니다.

목표: 속도 소스 IP 및 대상 포트가 초당 200개 패킷을 초과하는 초과 패킷을 고려합니다. 예:

1s ~ 2s: 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보다 작으므로 두 번째 카운터는 비어 있어야 합니다.

IPv4가 차단 목록에 부당하게 추가되었다는 사실은 말할 것도 없습니다.

관련 정보