If it helps, on my site this was the state of play with Linux browsers.
Linux Chrome 156 - solved challenges
Linux Chrome 146 (mainly digital ocean) - solved challenges.
Other Linux browsers couldn't solve challenges but all carried a fake referer.
So my honeypot stops Linux Chrome after they solve the challenges, if you're interested. It has an html page - the bots get there and stop. A real user, using linux and not a logged in member, just gets a button saying "click to continue". So they just go straight to whatever page they were requesting. But also real guests aren't likely to go direct to the pathways unless they've bookmarked the page - and I think they're unlikely to bookmark things like goto (but they might bookmark whats new).
This is my honeypot rule if it helps. So it blocks the solvers but not the real people (although does add a step "click to continue" for some real people).
The first line is the bit that works with the html page. In snippets there is already a prepopulated html page but you can add your own to say whatever you want. The bots get there and just stop. Nowhere else to go.
The top part contains a referer so real guests and users bypass it - because those browsers could solve challenges but didn't carry referers.
The bottom part doesn't carry a referer because less Linux users and Linux bots do sometimes carry a referer (if they had a referer they would bypass the first part of the rule).
Top line makes it work with the html and "click to continue" button name so that's what the zn is.
It's a SNIPPET rule not a custom rule btw. It only works with the snippet html
starts_with(http.request.uri.path, "/zn/")
or (
http.request.method eq "GET"
and (starts_with(http.request.uri.path, "/threads/")
or starts_with(http.request.uri.path, "/posts/")
or starts_with(http.request.uri.path, "/goto/")
or starts_with(http.request.uri.path, "/ams/")
or starts_with(http.request.uri.path, "/whats-new"))
and (http.user_agent contains "Windows NT"
or http.user_agent contains "Macintosh"
or http.user_agent contains "X11"
or (http.user_agent contains "Linux" and not http.user_agent contains "Android"))
and not cf.client.bot
and not http.cookie contains "xf_user"
and http.referer eq ""
)
or (
http.request.method eq "GET"
and (starts_with(http.request.uri.path, "/threads/")
or starts_with(http.request.uri.path, "/posts/")
or starts_with(http.request.uri.path, "/goto/")
or starts_with(http.request.uri.path, "/attachments/")
or starts_with(http.request.uri.path, "/ams/")
or starts_with(http.request.uri.path, "/whats-new"))
and http.user_agent contains "Linux"
and not http.user_agent contains "Android"
and not cf.client.bot
and not http.cookie contains "xf_user"
)
The snippet html is on a previous page on here, which can be changed to whatever - but it creates the "click to continue" button, and contains a trap for any bots who selected any buttons - but the bots have just ignored all three coded buttons and just stopped there.
The snippet rule fires after the custom rules.