![Nftables 無法如預期般使用儀表進行阻止](https://rvso.com/image/789276/Nftables%20%E7%84%A1%E6%B3%95%E5%A6%82%E9%A0%90%E6%9C%9F%E8%88%AC%E4%BD%BF%E7%94%A8%E5%84%80%E8%A1%A8%E9%80%B2%E8%A1%8C%E9%98%BB%E6%AD%A2.png)
目標:計算來源 IP 和目標連接埠速率大於每秒 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)accept計數器顯示總共有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
現在讓我頭痛的是,怎麼可能有 100 個封包從我的來源 IP 發送到伺服器上的連接埠 80,同時還有 73 個多餘的封包?由於 100 小於 200,因此第二個計數器應該為空
更不用說 IPv4 已被不適當地添加到黑名單中。