You don't need to block countries or ASN's or IP's. You cannot beat residential proxies that way, because if you have US open, then that is 150 million homes with potential IP's for use to hit you.
Cover your Search, that is load bearing.
Code:
(starts_with(http.request.uri.path, "/whats-new") or starts_with(http.request.uri.path, "/search"))
and not cf.client.bot
and not http.cookie contains "xf_user="
The next one is covering fake browsers, this is many residential proxies and bad bots.
Code:
(((http.user_agent contains "Chrome/1" and not any(lower(http.request.headers.names[*])[*] == "sec-ch-ua"))) or (((http.user_agent contains "Mozilla/5.0" and (http.user_agent contains "Chrome/1" or http.user_agent contains "Firefox/1")) and not any(lower(http.request.headers.names[*])[*] == "sec-fetch-mode"))) or (((http.user_agent contains "Mozilla/5.0" and (http.user_agent contains "Chrome/1" or http.user_agent contains "Firefox/1")) and not any(lower(http.request.headers.names[*])[*] == "accept-language")))) and (not cf.client.bot) and (not http.cookie contains "xf_user")
This is the real heart of residential proxies...
Code:
(http.user_agent contains "Chrome/120." or http.user_agent contains "Chrome/133." or http.user_agent contains "Chrome/146." or http.user_agent contains "Chrome/145." or http.user_agent contains "Firefox/135." or http.user_agent contains "Firefox/133." or http.user_agent contains "Chrome/131." or http.user_agent contains "Chrome/116." or http.user_agent contains "Chrome/124." or http.user_agent contains "Chrome/107." or http.user_agent contains "Chrome/104." or http.user_agent contains "Chrome/110." or http.user_agent contains "Chrome/136." or http.user_agent contains "Chrome/99." or http.user_agent contains "Chrome/119." or http.user_agent contains "Chrome/123." or http.user_agent contains "Chrome/100." or http.user_agent contains "Chrome/101." or http.user_agent contains "Chrome/142." or http.user_agent contains "Chrome/65." or http.user_agent contains "Firefox/147." or http.user_agent contains "Firefox/144." or http.user_agent contains "Chrome/108." or http.user_agent contains "Chrome/112." or http.user_agent contains "Chrome/109." or http.user_agent contains "Chrome/117." or http.user_agent contains "Chrome/103." or http.user_agent contains "Chrome/106.") and http.referer eq "" and (not cf.client.bot) and (not http.cookie contains "xf_user")
Set all of them to non-interactive challenge. You DO NOT need to block when these are going to block the automatic and allow the human from all countries. Notice how each one allows cf known bots and xf users logged in.
I would basically place them in reverse order to how I have listed them, search last, that way anything automated gets caught in the first two. Not a country blocked, ASN, IP, na da. You don't need to if you are trying to block the bad stuff but allow everything else.
If you want to then block a known good bot, you now have two rules remaining where you can do that if you wish, as some known bots are aggressive and not so good. Meta is at the top of that list.
I only run two of those, I have the browser impersonators first, search second. Between the two, for me, that takes out the majority of the nasties, BUT, I have a server that can handle the other noise.