![Nftables はメーターでブロックすると期待通りに動作しない](https://rvso.com/image/789276/Nftables%20%E3%81%AF%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A7%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E3%81%A8%E6%9C%9F%E5%BE%85%E9%80%9A%E3%82%8A%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84.png)
目標: 送信元 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 は不当にブロックリストに追加されています。