nft будет постоянно увеличивать потребление оперативки. Теоретически лечь не должен.
Если fail2ban добавляет отдельные правила (drop ip saddr x.x.x.x) — это плохо, так как каждое правило — отдельный объект, и при сотнях тысяч их ядро может начать тормозить. Если используется динамическое множество (set) , например: add set inet filter blocked_ips { type ipv4_addr; flags interval; } и затем просто: add element inet filter blocked_ips { x.x.x.x } то это гораздо эффективнее.
nft поддерживает TTL (время жизни) для элементов множеств - это позволит автоматически очищать старые записи. Но с TTL придётся поиграться)
WAF + Cloudflare не советую по понятным причинам (если конечно подверженный ресурс не в зоне атаки РКН))