### Gold Tier
## Overview
Anubis is a Web AI Firewall Utility that [weighs the soul of your connection](https://en.wikipedia.org/wiki/Weighing_of_souls) using one or more challenges in order to protect upstream resources from scraper bots.
This program is designed to help protect the small internet from the endless storm of requests that flood in from AI companies. Anubis is as lightweight as possible to ensure that everyone can afford to protect the communities closest to them.
Anubis is a bit of a nuclear response. This will result in your website being blocked from smaller scrapers and may inhibit "good bots" like the Internet Archive. You can configure [bot policy definitions](./docs/docs/admin/policies.mdx) to explicitly allowlist them and we are working on a curated set of "known good" bots to allow for a compromise between discoverability and uptime.
In most cases, you should not need this and can probably get by using Cloudflare to protect a given origin. However, for circumstances where you can't or won't use Cloudflare, Anubis is there for you.
If you want to try this out, visit the Anubis documentation site at [anubis.techaro.lol](https://anubis.techaro.lol).
## Support
If you run into any issues running Anubis, please [open an issue](https://github.com/TecharoHQ/anubis/issues/new?template=Blank+issue). Please include all the information I would need to diagnose your issue.
For live chat, please join the [Patreon](https://patreon.com/cadey) and ask in the Patron discord in the channel `#anubis`.
## Star History
Last updated: June 2025
#In common with other websites, log files are stored on the web server saving details such as the visitor's IP address, browser type, referring page and time of visit.
#Cookies may be used to remember visitor preferences when interacting with the website.
#Where registration is required, the visitor's email and a username will be stored on the server.
# # Open Graph passthrough configuration, see here for more information: # https://anubis.techaro.lol/docs/admin/configuration/open-graph/ openGraph: # Enables Open Graph passthrough enabled: false # Enables the use of the HTTP host in the cache key, this enables # caching metadata for multiple http hosts at once. considerHost: false # How long cached OpenGraph metadata should last in memory ttl: 24h # # If set, return these opengraph values instead of looking them up with # # the target service. # # # # Correlates to properties in https://ogp.me/ # override: # # og:title is required, it is the title of the website # "og:title": "Techaro Anubis" # "og:description": >- # Anubis is a Web AI Firewall Utility that helps you fight the bots # away so that you can maintain uptime at work! # "description": >- # Anubis is a Web AI Firewall Utility that helps you fight the bots # away so that you can maintain uptime at work! # By default, send HTTP 200 back to clients that either get issued a challenge # or a denial. This seems weird, but this is load-bearing due to the fact that # the most aggressive scraper bots seem to really, really, want an HTTP 200 and # will stop sending requests once they get it. status_codes: CHALLENGE: 200 DENY: 200 # Anubis can store temporary data in one of a few backends. See the storage # backends section of the docs for more information: # # https://anubis.techaro.lol/docs/admin/policies#storage-backends store: backend: memory parameters: {} # The weight thresholds for when to trigger individual challenges. Any # CHALLENGE will take precedence over this. # # A threshold has four configuration options: # # - name: the name that is reported down the stack and used for metrics # - expression: A CEL expression with the request weight in the variable # weight # - action: the Anubis action to apply, similar to in a bot policy # - challenge: which challenge to send to the user, similar to in a bot policy # # See https://anubis.techaro.lol/docs/admin/configuration/thresholds for more # information. thresholds: # By default Anubis ships with the following thresholds: - name: minimal-suspicion # This client is likely fine, its soul is lighter than a feather expression: weight <= 0 # a feather weighs zero units action: ALLOW # Allow the traffic through # For clients that had some weight reduced through custom rules, give them a # lightweight challenge. - name: mild-suspicion expression: all: - weight > 0 - weight < 10 action: CHALLENGE challenge: # https://anubis.techaro.lol/docs/admin/configuration/challenges/metarefresh algorithm: metarefresh difficulty: 1 # For clients that are browser-like but have either gained points from custom rules or # report as a standard browser. - name: moderate-suspicion expression: all: - weight >= 10 - weight < 20 action: CHALLENGE challenge: # https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work algorithm: fast difficulty: 2 # two leading zeros, very fast for most clients - name: mild-proof-of-work expression: all: - weight >= 20 - weight < 30 action: CHALLENGE challenge: # https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work algorithm: fast difficulty: 4 # For clients that are browser like and have gained many points from custom rules - name: extreme-suspicion expression: weight >= 30 action: CHALLENGE challenge: # https://anubis.techaro.lol/docs/admin/configuration/challenges/proof-of-work algorithm: fast difficulty: 6 ================================================ FILE: data/bots/_deny-pathological.yaml ================================================ - import: (data)/bots/cloudflare-workers.yaml - import: (data)/bots/headless-browsers.yaml - import: (data)/bots/us-ai-scraper.yaml - import: (data)/bots/custom-async-http-client.yaml - import: (data)/crawlers/alibaba-cloud.yaml - import: (data)/crawlers/huawei-cloud.yaml ================================================ FILE: data/bots/aggressive-brazilian-scrapers.yaml ================================================ - name: deny-aggressive-brazilian-scrapers action: WEIGH weight: adjust: 20 expression: any: # Internet Explorer should be out of support - userAgent.contains("MSIE") # Trident is the Internet Explorer browser engine - userAgent.contains("Trident") # Opera is a fork of chrome now - userAgent.contains("Presto") # Windows CE is discontinued - userAgent.contains("Windows CE") # Windows 95 is discontinued - userAgent.contains("Windows 95") # Windows 98 is discontinued - userAgent.contains("Windows 98") # Windows 9.x is discontinued - userAgent.contains("Win 9x") # Amazon does not have an Alexa Toolbar. - userAgent.contains("Alexa Toolbar") # This is not released, even Windows 11 calls itself Windows 10 - userAgent.contains("Windows NT 11.0") # iPods are not in common use - userAgent.contains("iPod") ================================================ FILE: data/bots/ai-catchall.yaml ================================================ # Extensive list of AI-affiliated agents based on https://github.com/ai-robots-txt/ai.robots.txt # Add new/undocumented agents here. Where documentation exists, consider moving to dedicated policy files. # Notes on various agents: # - Amazonbot: Well documented, but they refuse to state which agent collects training data. # - anthropic-ai/Claude-Web: Undocumented by Anthropic. Possibly deprecated or hallucinations? # - Perplexity*: Well documented, but they refuse to state which agent collects training data. # Warning: May contain user agents that _must_ be blocked in robots.txt, or the opt-out will have no effect. - name: "ai-catchall" user_agent_regex: >- AI2Bot|Ai2Bot-Dolma|aiHitBot|Amazonbot|anthropic-ai|Brightbot 1.0|Bytespider|Claude-Web|cohere-ai|cohere-training-data-crawler|Cotoyogi|Crawlspace|Diffbot|DuckAssistBot|FacebookBot|Factset_spyderbot|FirecrawlAgent|FriendlyCrawler|Google-CloudVertexBot|GoogleOther|GoogleOther-Image|GoogleOther-Video|iaskspider/2.0|ICC-Crawler|ImagesiftBot|img2dataset|imgproxy|ISSCyberRiskCrawler|Kangaroo Bot|meta-externalagent|Meta-ExternalAgent|meta-externalfetcher|Meta-ExternalFetcher|NovaAct|omgili|omgilibot|Operator|PanguBot|Perplexity-User|PerplexityBot|PetalBot|QualifiedBot|Scrapy|SemrushBot-OCOB|SemrushBot-SWA|Sidetrade indexer bot|TikTokSpider|Timpibot|VelenPublicWebCrawler|Webzio-Extended|wpbot|YouBot action: DENY ================================================ FILE: data/bots/ai-robots-txt.yaml ================================================ # Warning: Contains user agents that _must_ be blocked in robots.txt, or the opt-out will have no effect. # Note: Blocks human-directed/non-training user agents # # CCBot is allowed because if Common Crawl is allowed, then scrapers don't need to scrape to get the data. - name: "ai-robots-txt" user_agent_regex: >- AddSearchBot|AI2Bot|Ai2Bot-Dolma|aiHitBot|Amazonbot|Andibot|anthropic-ai|Applebot|Applebot-Extended|Awario|bedrockbot|bigsur.ai|Brightbot 1.0|Bytespider|CCBot|ChatGPT Agent|ChatGPT-User|Claude-SearchBot|Claude-User|Claude-Web|ClaudeBot|CloudVertexBot|cohere-ai|cohere-training-data-crawler|Cotoyogi|Crawlspace|Datenbank Crawler|Devin|Diffbot|DuckAssistBot|Echobot Bot|EchoboxBot|FacebookBot|facebookexternalhit|Factset_spyderbot|FirecrawlAgent|FriendlyCrawler|Gemini-Deep-Research|Google-CloudVertexBot|Google-Extended|GoogleAgent-Mariner|GoogleOther|GoogleOther-Image|GoogleOther-Video|GPTBot|iaskspider/2.0|ICC-Crawler|ImagesiftBot|img2dataset|ISSCyberRiskCrawler|Kangaroo Bot|LinerBot|meta-externalagent|Meta-ExternalAgent|meta-externalfetcher|Meta-ExternalFetcher|MistralAI-User|MistralAI-User/1.0|MyCentralAIScraperBot|netEstate Imprint Crawler|NovaAct|OAI-SearchBot|omgili|omgilibot|OpenAI|Operator|PanguBot|Panscient|panscient.com|Perplexity-User|PerplexityBot|PetalBot|PhindBot|Poseidon Research Crawler|QualifiedBot|QuillBot|quillbot.com|SBIntuitionsBot|Scrapy|SemrushBot-OCOB|SemrushBot-SWA|Sidetrade indexer bot|Thinkbot|TikTokSpider|Timpibot|VelenPublicWebCrawler|WARDBot|Webzio-Extended|wpbot|YaK|YandexAdditional|YandexAdditionalBot|YouBot action: DENY ================================================ FILE: data/bots/cloudflare-workers.yaml ================================================ - name: cloudflare-workers headers_regex: CF-Worker: .* action: WEIGH weight: adjust: 15 ================================================ FILE: data/bots/custom-async-http-client.yaml ================================================ - name: "custom-async-http-client" user_agent_regex: "Custom-AsyncHttpClient" action: WEIGH weight: adjust: 10 ================================================ FILE: data/bots/headless-browsers.yaml ================================================ - name: lightpanda user_agent_regex: ^LightPanda/.*$ action: DENY - name: headless-chrome user_agent_regex: HeadlessChrome action: DENY - name: headless-chromium user_agent_regex: HeadlessChromium action: DENY ================================================ FILE: data/bots/irc-bots/archlinux-phrik.yaml ================================================ # phrik in the Arch Linux IRC channels - name: archlinux-phrik action: ALLOW expression: all: - remoteAddress == "159.69.213.214" || remoteAddress == "2a01:4f8:c2c:7bf4::1" - userAgent == "Mozilla/5.0 (compatible; utils.web Limnoria module)" - '"X-Http-Version" in headers' - headers["X-Http-Version"] == "HTTP/1.1" ================================================ FILE: data/bots/irc-bots/gentoo-chat.yaml ================================================ # chat in the gentoo IRC channels - name: gentoo-chat action: ALLOW expression: all: - remoteAddress == "45.76.166.57" - userAgent == "Mozilla/5.0 (Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0" - '"X-Http-Version" in headers' - headers["X-Http-Version"] == "HTTP/1.1" ================================================ FILE: data/bots/us-ai-scraper.yaml ================================================ - name: us-artificial-intelligence-scraper user_agent_regex: \+https\://github\.com/US-Artificial-Intelligence/scraper action: DENY ================================================ FILE: data/clients/ai.yaml ================================================ # User agents that act on behalf of humans in AI tools, e.g. searching the web. # Each entry should have a positive/ALLOW entry created as well, with further documentation. # Exceptions: # - Claude-User: No published IP allowlist - name: "ai-clients" user_agent_regex: >- ChatGPT-User|Claude-User|MistralAI-User|Perplexity-User action: DENY ================================================ FILE: data/clients/docker-client.yaml ================================================ - name: allow-docker-client action: ALLOW expression: all: - path.startsWith("/v2/") - userAgent.contains("docker/") - userAgent.contains("git-commit/") - '"Accept" in headers' - headers["Accept"].contains("vnd.docker.distribution") - '"Baggage" in headers' - headers["Baggage"].contains("trigger") - name: allow-crane-client action: ALLOW expression: all: - userAgent.contains("crane/") - userAgent.contains("go-containerregistry/") - name: allow-docker-distribution-api-client action: ALLOW expression: all: - '"Docker-Distribution-Api-Version" in headers' - '!(userAgent.contains("Mozilla"))' - name: allow-go-containerregistry-client action: ALLOW expression: all: - path.startsWith("/v2/") - userAgent.contains("go-containerregistry/") - name: allow-buildah action: ALLOW expression: all: - path.startsWith("/v2/") - userAgent.contains("Buildah/") - name: allow-podman action: ALLOW expression: all: - path.startsWith("/v2/") - userAgent.contains("containers/") - name: allow-containerd action: ALLOW expression: all: - path.startsWith("/v2/") - userAgent.contains("containerd/") - name: allow-renovate action: ALLOW expression: all: - path.startsWith("/v2/") - userAgent.contains("Renovate/") ================================================ FILE: data/clients/git.yaml ================================================ - name: allow-git-clients action: ALLOW expression: all: - > ( userAgent.startsWith("git/") || userAgent.contains("libgit") || userAgent.startsWith("go-git") || userAgent.startsWith("JGit/") || userAgent.startsWith("JGit-") ) - '"Accept" in headers' - headers["Accept"] == "*/*" - '"Cache-Control" in headers' - headers["Cache-Control"] == "no-cache" - '"Pragma" in headers' - headers["Pragma"] == "no-cache" - '"Accept-Encoding" in headers' - headers["Accept-Encoding"].contains("gzip") ================================================ FILE: data/clients/go-get.yaml ================================================ - name: go-get action: ALLOW expression: all: - userAgent.startsWith("Go-http-client/") - '"go-get" in query' - query["go-get"] == "1" ================================================ FILE: data/clients/mistral-mistralai-user.yaml ================================================ # Acts on behalf of user requests # https://docs.mistral.ai/robots/ - name: mistral-mistralai-user user_agent_regex: MistralAI-User/.+; \+https\://docs\.mistral\.ai/robots action: ALLOW # https://mistral.ai/mistralai-user-ips.json remote_addresses: ["20.240.160.161/32", "20.240.160.1/32"] ================================================ FILE: data/clients/openai-chatgpt-user.yaml ================================================ # Acts on behalf of user requests # https://platform.openai.com/docs/bots/overview-of-openai-crawlers - name: openai-chatgpt-user user_agent_regex: ChatGPT-User/.+; \+https\://openai\.com/bot action: ALLOW # https://openai.com/chatgpt-user.json # curl 'https://openai.com/chatgpt-user.json' | jq '.prefixes.[].ipv4Prefix' | sed 's/$/,/' remote_addresses: [ "13.65.138.112/28", "23.98.179.16/28", "13.65.138.96/28", "172.183.222.128/28", "20.102.212.144/28", "40.116.73.208/28", "172.183.143.224/28", "52.190.190.16/28", "13.83.237.176/28", "51.8.155.64/28", "74.249.86.176/28", "51.8.155.48/28", "20.55.229.144/28", "135.237.131.208/28", "135.237.133.48/28", "51.8.155.112/28", "135.237.133.112/28", "52.159.249.96/28", "52.190.137.16/28", "52.255.111.112/28", "40.84.181.32/28", "172.178.141.112/28", "52.190.142.64/28", "172.178.140.144/28", "52.190.137.144/28", "172.178.141.128/28", "57.154.187.32/28", "4.196.118.112/28", "20.193.50.32/28", "20.215.188.192/28", "20.215.214.16/28", "4.197.22.112/28", "4.197.115.112/28", "172.213.21.16/28", "172.213.11.144/28", "172.213.12.112/28", "172.213.21.144/28", "20.90.7.144/28", "57.154.175.0/28", "57.154.174.112/28", "52.236.94.144/28", "137.135.191.176/28", "23.98.186.192/28", "23.98.186.96/28", "23.98.186.176/28", "23.98.186.64/28", "68.221.67.192/28", "68.221.67.160/28", "13.83.167.128/28", "20.228.106.176/28", "52.159.227.32/28", "68.220.57.64/28", "172.213.21.112/28", "68.221.67.224/28", "68.221.75.16/28", "20.97.189.96/28", "52.252.113.240/28", "52.230.163.32/28", "172.212.159.64/28", "52.255.111.80/28", "52.255.111.0/28", "4.151.241.240/28", "52.255.111.32/28", "52.255.111.48/28", "52.255.111.16/28", "52.230.164.176/28", "52.176.139.176/28", "52.173.234.16/28", "4.151.71.176/28", "4.151.119.48/28", "52.255.109.112/28", "52.255.109.80/28", "20.161.75.208/28", "68.154.28.96/28", "52.255.109.128/28", "52.225.75.208/28", "52.190.139.48/28", "68.221.67.240/28", "52.156.77.144/28", "52.148.129.32/28", "40.84.221.208/28", "104.210.139.224/28", "40.84.221.224/28", "104.210.139.192/28", ] ================================================ FILE: data/clients/perplexity-user.yaml ================================================ # Acts on behalf of user requests # https://docs.perplexity.ai/guides/bots - name: perplexity-user user_agent_regex: Perplexity-User/.+; \+https\://perplexity\.ai/perplexity-user action: ALLOW # https://www.perplexity.com/perplexity-user.json remote_addresses: ["44.208.221.197/32", "34.193.163.52/32", "18.97.21.0/30", "18.97.43.80/29"] ================================================ FILE: data/clients/small-internet-browsers/_permissive.yaml ================================================ - import: (data)/clients/small-internet-browsers/netsurf.yaml - import: (data)/clients/small-internet-browsers/palemoon.yaml ================================================ FILE: data/clients/small-internet-browsers/netsurf.yaml ================================================ - name: "reduce-weight-netsurf" user_agent_regex: "NetSurf" action: WEIGH weight: adjust: -5 ================================================ FILE: data/clients/small-internet-browsers/palemoon.yaml ================================================ - name: "reduce-weight-palemoon" user_agent_regex: "PaleMoon" action: WEIGH weight: adjust: -5 ================================================ FILE: data/clients/telegram-preview.yaml ================================================ - name: telegrambot action: ALLOW expression: all: - userAgent.matches("TelegramBot") - verifyFCrDNS(remoteAddress, "ptr\\.telegram\\.org$") ================================================ FILE: data/clients/vk-preview.yaml ================================================ - name: vkbot action: ALLOW expression: all: - userAgent.matches("vkShare[^+]+\\+http\\://vk\\.com/dev/Share") - verifyFCrDNS(remoteAddress, "^snipster\\d+\\.go\\.mail\\.ru$") ================================================ FILE: data/clients/x-firefox-ai.yaml ================================================ # https://connect.mozilla.org/t5/firefox-labs/try-out-link-previews-in-firefox-labs-138-and-share-your/td-p/92012 - name: x-firefox-ai action: WEIGH expression: '"X-Firefox-Ai" in headers' weight: adjust: 5 ================================================ FILE: data/common/acts-like-browser.yaml ================================================ # Assert behaviour that only genuine browsers display. This ensures that modern Chrome # or Firefox versions will get through without a challenge. # # These rules have been known to be bypassed by some of the worst automated scrapers. # Use at your own risk. - name: realistic-browser-catchall expression: all: - '"User-Agent" in headers' - '( userAgent.contains("Firefox") ) || ( userAgent.contains("Chrome") ) || ( userAgent.contains("Safari") )' - '"Accept" in headers' - '"Sec-Fetch-Dest" in headers' - '"Sec-Fetch-Mode" in headers' - '"Sec-Fetch-Site" in headers' - '"Accept-Encoding" in headers' - '( headers["Accept-Encoding"].contains("zstd") || headers["Accept-Encoding"].contains("br") )' - '"Accept-Language" in headers' action: WEIGH weight: adjust: -10 # The Upgrade-Insecure-Requests header is typically sent by browsers, but not always - name: upgrade-insecure-requests expression: '"Upgrade-Insecure-Requests" in headers' action: WEIGH weight: adjust: -2 # Chrome should behave like Chrome - name: chrome-is-proper expression: all: - userAgent.contains("Chrome") - '"Sec-Ch-Ua" in headers' - 'headers["Sec-Ch-Ua"].contains("Chromium")' - '"Sec-Ch-Ua-Mobile" in headers' - '"Sec-Ch-Ua-Platform" in headers' action: WEIGH weight: adjust: -5 - name: should-have-accept expression: '!("Accept" in headers)' action: WEIGH weight: adjust: 5 # Generic catchall rule - name: generic-browser user_agent_regex: >- Mozilla|Opera action: WEIGH weight: adjust: 10 ================================================ FILE: data/common/allow-api-like.yaml ================================================ - name: allow-api-routes action: ALLOW expression: all: - '!(method == "HEAD" || method == "GET")' - path.startsWith("/api/") ================================================ FILE: data/common/allow-private-addresses.yaml ================================================ - name: ipv4-rfc-1918 action: ALLOW remote_addresses: - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16 - 100.64.0.0/10 - name: ipv6-ula action: ALLOW remote_addresses: - fc00::/7 - name: ipv6-link-local action: ALLOW remote_addresses: - fe80::/10 ================================================ FILE: data/common/json-api.yaml ================================================ - name: allow-api-requests action: ALLOW expression: all: - '"Accept" in headers' - 'headers["Accept"] == "application/json"' - 'path.startsWith("/api/")' ================================================ FILE: data/common/keep-internet-working.yaml ================================================ # Common "keeping the internet working" routes - name: well-known path_regex: ^/\.well-known/.*$ action: ALLOW - name: favicon path_regex: ^/favicon\.(?:ico|png|gif|jpg|jpeg|svg)$ action: ALLOW - name: robots-txt path_regex: ^/robots\.txt$ action: ALLOW - name: sitemap path_regex: ^/sitemap\.xml$ action: ALLOW ================================================ FILE: data/common/rfc-violations.yaml ================================================ - name: no-user-agent-string action: DENY expression: userAgent == "" ================================================ FILE: data/crawlers/_allow-good.yaml ================================================ - import: (data)/crawlers/googlebot.yaml - import: (data)/crawlers/applebot.yaml - import: (data)/crawlers/bingbot.yaml - import: (data)/crawlers/duckduckbot.yaml - import: (data)/crawlers/qwantbot.yaml - import: (data)/crawlers/internet-archive.yaml - import: (data)/crawlers/kagibot.yaml - import: (data)/crawlers/marginalia.yaml - import: (data)/crawlers/mojeekbot.yaml - import: (data)/crawlers/commoncrawl.yaml - import: (data)/crawlers/wikimedia-citoid.yaml - import: (data)/crawlers/yandexbot.yaml ================================================ FILE: data/crawlers/ai-search.yaml ================================================ # User agents that index exclusively for search in for AI systems. # Each entry should have a positive/ALLOW entry created as well, with further documentation. # Exceptions: # - Claude-SearchBot: No published IP allowlist - name: "ai-crawlers-search" user_agent_regex: >- OAI-SearchBot|Claude-SearchBot|PerplexityBot action: DENY ================================================ FILE: data/crawlers/ai-training.yaml ================================================ # User agents that crawl for training AI/LLM systems # Each entry should have a positive/ALLOW entry created as well, with further documentation. # Exceptions: # - ClaudeBot: No published IP allowlist - name: "ai-crawlers-training" user_agent_regex: >- GPTBot|ClaudeBot action: DENY ================================================ FILE: data/crawlers/alibaba-cloud.yaml ================================================ - name: alibaba-cloud action: DENY # Updated 2025-08-20 from IP addresses for AS45102 remote_addresses: - 103.81.186.0/23 - 110.76.21.0/24 - 110.76.23.0/24 - 116.251.64.0/18 - 139.95.0.0/23 - 139.95.10.0/23 - 139.95.12.0/23 - 139.95.14.0/23 - 139.95.16.0/23 - 139.95.18.0/23 - 139.95.2.0/23 - 139.95.4.0/23 - 139.95.6.0/23 - 139.95.64.0/24 - 139.95.8.0/23 - 14.1.112.0/22 - 14.1.115.0/24 - 140.205.1.0/24 - 140.205.122.0/24 - 147.139.0.0/17 - 147.139.0.0/18 - 147.139.128.0/17 - 147.139.128.0/18 - 147.139.155.0/24 - 147.139.192.0/18 - 147.139.64.0/18 - 149.129.0.0/20 - 149.129.0.0/21 - 149.129.16.0/23 - 149.129.192.0/18 - 149.129.192.0/19 - 149.129.224.0/19 - 149.129.32.0/19 - 149.129.64.0/18 - 149.129.64.0/19 - 149.129.8.0/21 - 149.129.96.0/19 - 156.227.20.0/24 - 156.236.12.0/24 - 156.236.17.0/24 - 156.240.76.0/23 - 156.245.1.0/24 - 161.117.0.0/16 - 161.117.0.0/17 - 161.117.126.0/24 - 161.117.127.0/24 - 161.117.128.0/17 - 161.117.128.0/24 - 161.117.129.0/24 - 161.117.138.0/24 - 161.117.143.0/24 - 170.33.104.0/24 - 170.33.105.0/24 - 170.33.106.0/24 - 170.33.107.0/24 - 170.33.136.0/24 - 170.33.137.0/24 - 170.33.138.0/24 - 170.33.20.0/24 - 170.33.21.0/24 - 170.33.22.0/24 - 170.33.23.0/24 - 170.33.24.0/24 - 170.33.29.0/24 - 170.33.30.0/24 - 170.33.31.0/24 - 170.33.32.0/24 - 170.33.33.0/24 - 170.33.34.0/24 - 170.33.35.0/24 - 170.33.64.0/24 - 170.33.65.0/24 - 170.33.66.0/24 - 170.33.68.0/24 - 170.33.69.0/24 - 170.33.72.0/24 - 170.33.73.0/24 - 170.33.76.0/24 - 170.33.77.0/24 - 170.33.78.0/24 - 170.33.79.0/24 - 170.33.80.0/24 - 170.33.81.0/24 - 170.33.82.0/24 - 170.33.83.0/24 - 170.33.84.0/24 - 170.33.85.0/24 - 170.33.86.0/24 - 170.33.88.0/24 - 170.33.90.0/24 - 170.33.92.0/24 - 170.33.93.0/24 - 185.78.106.0/23 - 198.11.128.0/18 - 198.11.137.0/24 - 198.11.184.0/21 - 202.144.199.0/24 - 203.107.64.0/24 - 203.107.65.0/24 - 203.107.66.0/24 - 203.107.67.0/24 - 203.107.68.0/24 - 205.204.102.0/23 - 205.204.111.0/24 - 205.204.117.0/24 - 205.204.125.0/24 - 205.204.96.0/19 - 223.5.5.0/24 - 223.6.6.0/24 - 2400:3200::/48 - 2400:3200:baba::/48 - 2400:b200:4100::/48 - 2400:b200:4101::/48 - 2400:b200:4102::/48 - 2400:b200:4103::/48 - 2401:8680:4100::/48 - 2401:b180:4100::/48 - 2404:2280:1000::/36 - 2404:2280:1000::/37 - 2404:2280:1800::/37 - 2404:2280:2000::/36 - 2404:2280:2000::/37 - 2404:2280:2800::/37 - 2404:2280:3000::/36 - 2404:2280:3000::/37 - 2404:2280:3800::/37 - 2404:2280:4000::/36 - 2404:2280:4000::/37 - 2404:2280:4800::/37 - 2408:4000:1000::/48 - 2408:4009:500::/48 - 240b:4000::/32 - 240b:4000::/33 - 240b:4000:8000::/33 - 240b:4000:fffe::/48 - 240b:4001::/32 - 240b:4001::/33 - 240b:4001:8000::/33 - 240b:4002::/32 - 240b:4002::/33 - 240b:4002:8000::/33 - 240b:4004::/32 - 240b:4004::/33 - 240b:4004:8000::/33 - 240b:4005::/32 - 240b:4005::/33 - 240b:4005:8000::/33 - 240b:4006::/48 - 240b:4006:1000::/44 - 240b:4006:1000::/45 - 240b:4006:1000::/47 - 240b:4006:1002::/47 - 240b:4006:1008::/45 - 240b:4006:1010::/44 - 240b:4006:1010::/45 - 240b:4006:1018::/45 - 240b:4006:1020::/44 - 240b:4006:1020::/45 - 240b:4006:1028::/45 - 240b:4007::/32 - 240b:4007::/33 - 240b:4007:8000::/33 - 240b:4009::/32 - 240b:4009::/33 - 240b:4009:8000::/33 - 240b:400b::/32 - 240b:400b::/33 - 240b:400b:8000::/33 - 240b:400c::/32 - 240b:400c::/33 - 240b:400c::/40 - 240b:400c::/41 - 240b:400c:100::/40 - 240b:400c:100::/41 - 240b:400c:180::/41 - 240b:400c:80::/41 - 240b:400c:8000::/33 - 240b:400c:f00::/48 - 240b:400c:f01::/48 - 240b:400c:ffff::/48 - 240b:400d::/32 - 240b:400d::/33 - 240b:400d:8000::/33 - 240b:400e::/32 - 240b:400e::/33 - 240b:400e:8000::/33 - 240b:400f::/32 - 240b:400f::/33 - 240b:400f:8000::/33 - 240b:4011::/32 - 240b:4011::/33 - 240b:4011:8000::/33 - 240b:4012::/48 - 240b:4013::/32 - 240b:4013::/33 - 240b:4013:8000::/33 - 240b:4014::/32 - 240b:4014::/33 - 240b:4014:8000::/33 - 43.100.0.0/15 - 43.100.0.0/16 - 43.101.0.0/16 - 43.102.0.0/20 - 43.102.112.0/20 - 43.102.16.0/20 - 43.102.32.0/20 - 43.102.48.0/20 - 43.102.64.0/20 - 43.102.80.0/20 - 43.102.96.0/20 - 43.103.0.0/17 - 43.103.0.0/18 - 43.103.64.0/18 - 43.104.0.0/15 - 43.104.0.0/16 - 43.105.0.0/16 - 43.108.0.0/17 - 43.108.0.0/18 - 43.108.64.0/18 - 43.91.0.0/16 - 43.91.0.0/17 - 43.91.128.0/17 - 43.96.10.0/24 - 43.96.100.0/24 - 43.96.101.0/24 - 43.96.102.0/24 - 43.96.104.0/24 - 43.96.11.0/24 - 43.96.20.0/24 - 43.96.21.0/24 - 43.96.23.0/24 - 43.96.24.0/24 - 43.96.25.0/24 - 43.96.3.0/24 - 43.96.32.0/24 - 43.96.33.0/24 - 43.96.34.0/24 - 43.96.35.0/24 - 43.96.4.0/24 - 43.96.40.0/24 - 43.96.5.0/24 - 43.96.52.0/24 - 43.96.6.0/24 - 43.96.66.0/24 - 43.96.67.0/24 - 43.96.68.0/24 - 43.96.69.0/24 - 43.96.7.0/24 - 43.96.70.0/24 - 43.96.71.0/24 - 43.96.72.0/24 - 43.96.73.0/24 - 43.96.74.0/24 - 43.96.75.0/24 - 43.96.8.0/24 - 43.96.80.0/24 - 43.96.81.0/24 - 43.96.84.0/24 - 43.96.85.0/24 - 43.96.86.0/24 - 43.96.88.0/24 - 43.96.9.0/24 - 43.96.96.0/24 - 43.98.0.0/16 - 43.98.0.0/17 - 43.98.128.0/17 - 43.99.0.0/16 - 43.99.0.0/17 - 43.99.128.0/17 - 45.199.179.0/24 - 47.235.0.0/22 - 47.235.0.0/23 - 47.235.1.0/24 - 47.235.10.0/23 - 47.235.10.0/24 - 47.235.11.0/24 - 47.235.12.0/23 - 47.235.12.0/24 - 47.235.13.0/24 - 47.235.16.0/23 - 47.235.16.0/24 - 47.235.18.0/23 - 47.235.18.0/24 - 47.235.19.0/24 - 47.235.2.0/23 - 47.235.20.0/24 - 47.235.21.0/24 - 47.235.22.0/24 - 47.235.23.0/24 - 47.235.24.0/22 - 47.235.24.0/23 - 47.235.26.0/23 - 47.235.28.0/23 - 47.235.28.0/24 - 47.235.29.0/24 - 47.235.30.0/24 - 47.235.31.0/24 - 47.235.4.0/24 - 47.235.5.0/24 - 47.235.6.0/23 - 47.235.6.0/24 - 47.235.7.0/24 - 47.235.8.0/24 - 47.235.9.0/24 - 47.236.0.0/15 - 47.236.0.0/16 - 47.237.0.0/16 - 47.237.32.0/20 - 47.237.34.0/24 - 47.238.0.0/15 - 47.238.0.0/16 - 47.239.0.0/16 - 47.240.0.0/16 - 47.240.0.0/17 - 47.240.128.0/17 - 47.241.0.0/16 - 47.241.0.0/17 - 47.241.128.0/17 - 47.242.0.0/15 - 47.242.0.0/16 - 47.243.0.0/16 - 47.244.0.0/16 - 47.244.0.0/17 - 47.244.128.0/17 - 47.244.73.0/24 - 47.245.0.0/18 - 47.245.0.0/19 - 47.245.128.0/17 - 47.245.128.0/18 - 47.245.192.0/18 - 47.245.32.0/19 - 47.245.64.0/18 - 47.245.64.0/19 - 47.245.96.0/19 - 47.246.100.0/22 - 47.246.104.0/21 - 47.246.104.0/22 - 47.246.108.0/22 - 47.246.120.0/24 - 47.246.122.0/24 - 47.246.123.0/24 - 47.246.124.0/24 - 47.246.125.0/24 - 47.246.128.0/22 - 47.246.128.0/23 - 47.246.130.0/23 - 47.246.132.0/22 - 47.246.132.0/23 - 47.246.134.0/23 - 47.246.136.0/21 - 47.246.136.0/22 - 47.246.140.0/22 - 47.246.144.0/23 - 47.246.144.0/24 - 47.246.145.0/24 - 47.246.146.0/23 - 47.246.146.0/24 - 47.246.147.0/24 - 47.246.150.0/23 - 47.246.150.0/24 - 47.246.151.0/24 - 47.246.152.0/23 - 47.246.152.0/24 - 47.246.153.0/24 - 47.246.154.0/24 - 47.246.155.0/24 - 47.246.156.0/22 - 47.246.156.0/23 - 47.246.158.0/23 - 47.246.160.0/20 - 47.246.160.0/21 - 47.246.168.0/21 - 47.246.176.0/20 - 47.246.176.0/21 - 47.246.184.0/21 - 47.246.192.0/22 - 47.246.192.0/23 - 47.246.194.0/23 - 47.246.196.0/22 - 47.246.196.0/23 - 47.246.198.0/23 - 47.246.32.0/22 - 47.246.66.0/24 - 47.246.67.0/24 - 47.246.68.0/23 - 47.246.68.0/24 - 47.246.69.0/24 - 47.246.72.0/21 - 47.246.72.0/22 - 47.246.76.0/22 - 47.246.80.0/24 - 47.246.82.0/23 - 47.246.82.0/24 - 47.246.83.0/24 - 47.246.84.0/22 - 47.246.84.0/23 - 47.246.86.0/23 - 47.246.88.0/22 - 47.246.88.0/23 - 47.246.90.0/23 - 47.246.92.0/23 - 47.246.92.0/24 - 47.246.93.0/24 - 47.246.96.0/21 - 47.246.96.0/22 - 47.250.0.0/17 - 47.250.0.0/18 - 47.250.128.0/17 - 47.250.128.0/18 - 47.250.192.0/18 - 47.250.64.0/18 - 47.250.99.0/24 - 47.251.0.0/16 - 47.251.0.0/17 - 47.251.128.0/17 - 47.251.224.0/22 - 47.252.0.0/17 - 47.252.0.0/18 - 47.252.128.0/17 - 47.252.128.0/18 - 47.252.192.0/18 - 47.252.64.0/18 - 47.252.67.0/24 - 47.253.0.0/16 - 47.253.0.0/17 - 47.253.128.0/17 - 47.254.0.0/17 - 47.254.0.0/18 - 47.254.113.0/24 - 47.254.128.0/18 - 47.254.128.0/19 - 47.254.160.0/19 - 47.254.192.0/18 - 47.254.192.0/19 - 47.254.224.0/19 - 47.254.64.0/18 - 47.52.0.0/16 - 47.52.0.0/17 - 47.52.128.0/17 - 47.56.0.0/15 - 47.56.0.0/16 - 47.57.0.0/16 - 47.74.0.0/18 - 47.74.0.0/19 - 47.74.0.0/21 - 47.74.128.0/17 - 47.74.128.0/18 - 47.74.192.0/18 - 47.74.32.0/19 - 47.74.64.0/18 - 47.74.64.0/19 - 47.74.96.0/19 - 47.75.0.0/16 - 47.75.0.0/17 - 47.75.128.0/17 - 47.76.0.0/16 - 47.76.0.0/17 - 47.76.128.0/17 - 47.77.0.0/22 - 47.77.0.0/23 - 47.77.104.0/21 - 47.77.12.0/22 - 47.77.128.0/17 - 47.77.128.0/18 - 47.77.128.0/21 - 47.77.136.0/21 - 47.77.144.0/21 - 47.77.152.0/21 - 47.77.16.0/21 - 47.77.16.0/22 - 47.77.192.0/18 - 47.77.2.0/23 - 47.77.20.0/22 - 47.77.24.0/22 - 47.77.24.0/23 - 47.77.26.0/23 - 47.77.32.0/19 - 47.77.32.0/20 - 47.77.4.0/22 - 47.77.4.0/23 - 47.77.48.0/20 - 47.77.6.0/23 - 47.77.64.0/19 - 47.77.64.0/20 - 47.77.8.0/21 - 47.77.8.0/22 - 47.77.80.0/20 - 47.77.96.0/20 - 47.77.96.0/21 - 47.78.0.0/17 - 47.78.128.0/17 - 47.79.0.0/20 - 47.79.0.0/21 - 47.79.104.0/21 - 47.79.112.0/20 - 47.79.128.0/19 - 47.79.128.0/20 - 47.79.144.0/20 - 47.79.16.0/20 - 47.79.16.0/21 - 47.79.192.0/18 - 47.79.192.0/19 - 47.79.224.0/19 - 47.79.24.0/21 - 47.79.32.0/20 - 47.79.32.0/21 - 47.79.40.0/21 - 47.79.48.0/20 - 47.79.48.0/21 - 47.79.52.0/23 - 47.79.54.0/23 - 47.79.56.0/21 - 47.79.56.0/23 - 47.79.58.0/23 - 47.79.60.0/23 - 47.79.62.0/23 - 47.79.64.0/20 - 47.79.64.0/21 - 47.79.72.0/21 - 47.79.8.0/21 - 47.79.80.0/20 - 47.79.80.0/21 - 47.79.83.0/24 - 47.79.88.0/21 - 47.79.96.0/19 - 47.79.96.0/20 - 47.80.0.0/18 - 47.80.0.0/19 - 47.80.128.0/17 - 47.80.128.0/18 - 47.80.192.0/18 - 47.80.32.0/19 - 47.80.64.0/18 - 47.80.64.0/19 - 47.80.96.0/19 - 47.81.0.0/18 - 47.81.0.0/19 - 47.81.128.0/17 - 47.81.128.0/18 - 47.81.192.0/18 - 47.81.32.0/19 - 47.81.64.0/18 - 47.81.64.0/19 - 47.81.96.0/19 - 47.82.0.0/18 - 47.82.0.0/19 - 47.82.10.0/23 - 47.82.12.0/23 - 47.82.128.0/17 - 47.82.128.0/18 - 47.82.14.0/23 - 47.82.192.0/18 - 47.82.32.0/19 - 47.82.32.0/21 - 47.82.40.0/21 - 47.82.48.0/21 - 47.82.56.0/21 - 47.82.64.0/18 - 47.82.64.0/19 - 47.82.8.0/23 - 47.82.96.0/19 - 47.83.0.0/16 - 47.83.0.0/17 - 47.83.128.0/17 - 47.83.32.0/21 - 47.83.40.0/21 - 47.83.48.0/21 - 47.83.56.0/21 - 47.84.0.0/16 - 47.84.0.0/17 - 47.84.128.0/17 - 47.84.144.0/21 - 47.84.152.0/21 - 47.84.160.0/21 - 47.84.168.0/21 - 47.85.0.0/16 - 47.85.0.0/17 - 47.85.112.0/22 - 47.85.112.0/23 - 47.85.114.0/23 - 47.85.128.0/17 - 47.86.0.0/16 - 47.86.0.0/17 - 47.86.128.0/17 - 47.87.0.0/18 - 47.87.0.0/19 - 47.87.128.0/18 - 47.87.128.0/19 - 47.87.160.0/19 - 47.87.192.0/22 - 47.87.192.0/23 - 47.87.194.0/23 - 47.87.196.0/22 - 47.87.196.0/23 - 47.87.198.0/23 - 47.87.200.0/22 - 47.87.200.0/23 - 47.87.202.0/23 - 47.87.204.0/22 - 47.87.204.0/23 - 47.87.206.0/23 - 47.87.208.0/22 - 47.87.208.0/23 - 47.87.210.0/23 - 47.87.212.0/22 - 47.87.212.0/23 - 47.87.214.0/23 - 47.87.216.0/22 - 47.87.216.0/23 - 47.87.218.0/23 - 47.87.220.0/22 - 47.87.220.0/23 - 47.87.222.0/23 - 47.87.224.0/22 - 47.87.224.0/23 - 47.87.226.0/23 - 47.87.228.0/22 - 47.87.228.0/23 - 47.87.230.0/23 - 47.87.232.0/22 - 47.87.232.0/23 - 47.87.234.0/23 - 47.87.236.0/22 - 47.87.236.0/23 - 47.87.238.0/23 - 47.87.240.0/22 - 47.87.240.0/23 - 47.87.242.0/23 - 47.87.32.0/19 - 47.87.64.0/18 - 47.87.64.0/19 - 47.87.96.0/19 - 47.88.0.0/17 - 47.88.0.0/18 - 47.88.109.0/24 - 47.88.128.0/17 - 47.88.128.0/18 - 47.88.135.0/24 - 47.88.192.0/18 - 47.88.41.0/24 - 47.88.42.0/24 - 47.88.43.0/24 - 47.88.64.0/18 - 47.89.0.0/18 - 47.89.0.0/19 - 47.89.100.0/24 - 47.89.101.0/24 - 47.89.102.0/24 - 47.89.103.0/24 - 47.89.104.0/21 - 47.89.104.0/22 - 47.89.108.0/22 - 47.89.122.0/24 - 47.89.123.0/24 - 47.89.124.0/23 - 47.89.124.0/24 - 47.89.125.0/24 - 47.89.128.0/18 - 47.89.128.0/19 - 47.89.160.0/19 - 47.89.192.0/18 - 47.89.192.0/19 - 47.89.221.0/24 - 47.89.224.0/19 - 47.89.32.0/19 - 47.89.72.0/22 - 47.89.72.0/23 - 47.89.74.0/23 - 47.89.76.0/22 - 47.89.76.0/23 - 47.89.78.0/23 - 47.89.80.0/23 - 47.89.82.0/23 - 47.89.84.0/24 - 47.89.88.0/22 - 47.89.88.0/23 - 47.89.90.0/23 - 47.89.92.0/22 - 47.89.92.0/23 - 47.89.94.0/23 - 47.89.96.0/24 - 47.89.97.0/24 - 47.89.98.0/23 - 47.89.99.0/24 - 47.90.0.0/17 - 47.90.0.0/18 - 47.90.128.0/17 - 47.90.128.0/18 - 47.90.172.0/24 - 47.90.173.0/24 - 47.90.174.0/24 - 47.90.175.0/24 - 47.90.192.0/18 - 47.90.64.0/18 - 47.91.0.0/19 - 47.91.0.0/20 - 47.91.112.0/20 - 47.91.128.0/17 - 47.91.128.0/18 - 47.91.16.0/20 - 47.91.192.0/18 - 47.91.32.0/19 - 47.91.32.0/20 - 47.91.48.0/20 - 47.91.64.0/19 - 47.91.64.0/20 - 47.91.80.0/20 - 47.91.96.0/19 - 47.91.96.0/20 - 5.181.224.0/23 - 59.82.136.0/23 - 8.208.0.0/16 - 8.208.0.0/17 - 8.208.0.0/18 - 8.208.0.0/19 - 8.208.128.0/17 - 8.208.141.0/24 - 8.208.32.0/19 - 8.209.0.0/19 - 8.209.0.0/20 - 8.209.128.0/18 - 8.209.128.0/19 - 8.209.16.0/20 - 8.209.160.0/19 - 8.209.192.0/18 - 8.209.192.0/19 - 8.209.224.0/19 - 8.209.36.0/23 - 8.209.36.0/24 - 8.209.37.0/24 - 8.209.38.0/23 - 8.209.38.0/24 - 8.209.39.0/24 - 8.209.40.0/22 - 8.209.40.0/23 - 8.209.42.0/23 - 8.209.44.0/22 - 8.209.44.0/23 - 8.209.46.0/23 - 8.209.48.0/20 - 8.209.48.0/21 - 8.209.56.0/21 - 8.209.64.0/18 - 8.209.64.0/19 - 8.209.96.0/19 - 8.210.0.0/16 - 8.210.0.0/17 - 8.210.128.0/17 - 8.210.240.0/24 - 8.211.0.0/17 - 8.211.0.0/18 - 8.211.104.0/21 - 8.211.128.0/18 - 8.211.128.0/19 - 8.211.160.0/19 - 8.211.192.0/18 - 8.211.192.0/19 - 8.211.224.0/19 - 8.211.226.0/24 - 8.211.64.0/18 - 8.211.80.0/21 - 8.211.88.0/21 - 8.211.96.0/21 - 8.212.0.0/17 - 8.212.0.0/18 - 8.212.128.0/18 - 8.212.128.0/19 - 8.212.160.0/19 - 8.212.192.0/18 - 8.212.192.0/19 - 8.212.224.0/19 - 8.212.64.0/18 - 8.213.0.0/17 - 8.213.0.0/18 - 8.213.128.0/19 - 8.213.128.0/20 - 8.213.144.0/20 - 8.213.160.0/21 - 8.213.160.0/22 - 8.213.164.0/22 - 8.213.176.0/20 - 8.213.176.0/21 - 8.213.184.0/21 - 8.213.192.0/18 - 8.213.192.0/19 - 8.213.224.0/19 - 8.213.251.0/24 - 8.213.252.0/24 - 8.213.253.0/24 - 8.213.64.0/18 - 8.214.0.0/16 - 8.214.0.0/17 - 8.214.128.0/17 - 8.215.0.0/16 - 8.215.0.0/17 - 8.215.128.0/17 - 8.215.160.0/24 - 8.215.162.0/23 - 8.215.168.0/24 - 8.215.169.0/24 - 8.216.0.0/17 - 8.216.0.0/18 - 8.216.128.0/17 - 8.216.128.0/18 - 8.216.148.0/24 - 8.216.192.0/18 - 8.216.64.0/18 - 8.216.69.0/24 - 8.216.74.0/24 - 8.217.0.0/16 - 8.217.0.0/17 - 8.217.128.0/17 - 8.218.0.0/16 - 8.218.0.0/17 - 8.218.128.0/17 - 8.219.0.0/16 - 8.219.0.0/17 - 8.219.128.0/17 - 8.219.40.0/21 - 8.220.116.0/24 - 8.220.128.0/18 - 8.220.128.0/19 - 8.220.147.0/24 - 8.220.160.0/19 - 8.220.192.0/18 - 8.220.192.0/19 - 8.220.224.0/19 - 8.220.229.0/24 - 8.220.64.0/18 - 8.220.64.0/19 - 8.220.96.0/19 - 8.221.0.0/17 - 8.221.0.0/18 - 8.221.0.0/21 - 8.221.128.0/17 - 8.221.128.0/18 - 8.221.184.0/22 - 8.221.188.0/22 - 8.221.192.0/18 - 8.221.192.0/21 - 8.221.200.0/21 - 8.221.208.0/21 - 8.221.216.0/21 - 8.221.48.0/21 - 8.221.56.0/21 - 8.221.64.0/18 - 8.221.8.0/21 - 8.222.0.0/20 - 8.222.0.0/21 - 8.222.112.0/20 - 8.222.128.0/17 - 8.222.128.0/18 - 8.222.16.0/20 - 8.222.16.0/21 - 8.222.192.0/18 - 8.222.24.0/21 - 8.222.32.0/20 - 8.222.32.0/21 - 8.222.40.0/21 - 8.222.48.0/20 - 8.222.48.0/21 - 8.222.56.0/21 - 8.222.64.0/20 - 8.222.64.0/21 - 8.222.72.0/21 - 8.222.8.0/21 - 8.222.80.0/20 - 8.222.80.0/21 - 8.222.88.0/21 - 8.222.96.0/19 - 8.222.96.0/20 - 8.223.0.0/17 - 8.223.0.0/18 - 8.223.128.0/17 - 8.223.128.0/18 - 8.223.192.0/18 - 8.223.64.0/18 ================================================ FILE: data/crawlers/applebot.yaml ================================================ # Indexing for search and Siri # https://support.apple.com/en-us/119829 - name: applebot user_agent_regex: Applebot action: ALLOW # https://search.developer.apple.com/applebot.json remote_addresses: [ "17.241.208.160/27", "17.241.193.160/27", "17.241.200.160/27", "17.22.237.0/24", "17.22.245.0/24", "17.22.253.0/24", "17.241.75.0/24", "17.241.219.0/24", "17.241.227.0/24", "17.246.15.0/24", "17.246.19.0/24", "17.246.23.0/24", ] ================================================ FILE: data/crawlers/bingbot.yaml ================================================ - name: bingbot user_agent_regex: \+http\://www\.bing\.com/bingbot\.htm action: ALLOW # https://www.bing.com/toolbox/bingbot.json remote_addresses: [ "157.55.39.0/24", "207.46.13.0/24", "40.77.167.0/24", "13.66.139.0/24", "13.66.144.0/24", "52.167.144.0/24", "13.67.10.16/28", "13.69.66.240/28", "13.71.172.224/28", "139.217.52.0/28", "191.233.204.224/28", "20.36.108.32/28", "20.43.120.16/28", "40.79.131.208/28", "40.79.186.176/28", "52.231.148.0/28", "20.79.107.240/28", "51.105.67.0/28", "20.125.163.80/28", "40.77.188.0/22", "65.55.210.0/24", "199.30.24.0/23", "40.77.202.0/24", "40.77.139.0/25", "20.74.197.0/28", "20.15.133.160/27", "40.77.177.0/24", "40.77.178.0/23", ] ================================================ FILE: data/crawlers/commoncrawl.yaml ================================================ - name: common-crawl user_agent_regex: CCBot action: ALLOW # https://index.commoncrawl.org/ccbot.json remote_addresses: [ "2600:1f28:365:80b0::/60", "18.97.9.168/29", "18.97.14.80/29", "18.97.14.88/30", "98.85.178.216/32", ] ================================================ FILE: data/crawlers/duckduckbot.yaml ================================================ - name: duckduckbot user_agent_regex: DuckDuckBot/1\.1; \(\+http\://duckduckgo\.com/duckduckbot\.html\) action: ALLOW # https://duckduckgo.com/duckduckgo-help-pages/results/duckduckbot remote_addresses: [ "57.152.72.128/32", "51.8.253.152/32", "40.80.242.63/32", "20.12.141.99/32", "20.49.136.28/32", "51.116.131.221/32", "51.107.40.209/32", "20.40.133.240/32", "20.50.168.91/32", "51.120.48.122/32", "20.193.45.113/32", "40.76.173.151/32", "40.76.163.7/32", "20.185.79.47/32", "52.142.26.175/32", "20.185.79.15/32", "52.142.24.149/32", "40.76.162.208/32", "40.76.163.23/32", "40.76.162.191/32", "40.76.162.247/32", "40.88.21.235/32", "20.191.45.212/32", "52.146.59.12/32", "52.146.59.156/32", "52.146.59.154/32", "52.146.58.236/32", "20.62.224.44/32", "51.104.180.53/32", "51.104.180.47/32", "51.104.180.26/32", "51.104.146.225/32", "51.104.146.235/32", "20.73.202.147/32", "20.73.132.240/32", "20.71.12.143/32", "20.56.197.58/32", "20.56.197.63/32", "20.43.150.93/32", "20.43.150.85/32", "20.44.222.1/32", "40.89.243.175/32", "13.89.106.77/32", "52.143.242.6/32", "52.143.241.111/32", "52.154.60.82/32", "20.197.209.11/32", "20.197.209.27/32", "20.226.133.105/32", "191.234.216.4/32", "191.234.216.178/32", "20.53.92.211/32", "20.53.91.2/32", "20.207.99.197/32", "20.207.97.190/32", "40.81.250.205/32", "40.64.106.11/32", "40.64.105.247/32", "20.72.242.93/32", "20.99.255.235/32", "20.113.3.121/32", "52.224.16.221/32", "52.224.21.53/32", "52.224.20.204/32", "52.224.21.19/32", "52.224.20.249/32", "52.224.20.203/32", "52.224.20.190/32", "52.224.16.229/32", "52.224.21.20/32", "52.146.63.80/32", "52.224.20.227/32", "52.224.20.193/32", "52.190.37.160/32", "52.224.21.23/32", "52.224.20.223/32", "52.224.20.181/32", "52.224.21.49/32", "52.224.21.55/32", "52.224.21.61/32", "52.224.19.152/32", "52.224.20.186/32", "52.224.21.27/32", "52.224.21.51/32", "52.224.20.174/32", "52.224.21.4/32", "51.104.164.109/32", "51.104.167.71/32", "51.104.160.177/32", "51.104.162.149/32", "51.104.167.95/32", "51.104.167.54/32", "51.104.166.111/32", "51.104.167.88/32", "51.104.161.32/32", "51.104.163.250/32", "51.104.164.189/32", "51.104.167.19/32", "51.104.160.167/32", "51.104.167.110/32", "20.191.44.119/32", "51.104.167.104/32", "20.191.44.234/32", "51.104.164.215/32", "51.104.167.52/32", "20.191.44.22/32", "51.104.167.87/32", "51.104.167.96/32", "20.191.44.16/32", "51.104.167.61/32", "51.104.164.147/32", "20.50.48.159/32", "40.114.182.172/32", "20.50.50.130/32", "20.50.50.163/32", "20.50.50.46/32", "40.114.182.153/32", "20.50.50.118/32", "20.50.49.55/32", "20.50.49.25/32", "40.114.183.251/32", "20.50.50.123/32", "20.50.49.237/32", "20.50.48.192/32", "20.50.50.134/32", "51.138.90.233/32", "40.114.183.196/32", "20.50.50.146/32", "40.114.183.88/32", "20.50.50.145/32", "20.50.50.121/32", "20.50.49.40/32", "51.138.90.206/32", "40.114.182.45/32", "51.138.90.161/32", "20.50.49.0/32", "40.119.232.215/32", "104.43.55.167/32", "40.119.232.251/32", "40.119.232.50/32", "40.119.232.146/32", "40.119.232.218/32", "104.43.54.127/32", "104.43.55.117/32", "104.43.55.116/32", "104.43.55.166/32", "52.154.169.50/32", "52.154.171.70/32", "52.154.170.229/32", "52.154.170.113/32", "52.154.171.44/32", "52.154.172.2/32", "52.143.244.81/32", "52.154.171.87/32", "52.154.171.250/32", "52.154.170.28/32", "52.154.170.122/32", "52.143.243.117/32", "52.143.247.235/32", "52.154.171.235/32", "52.154.171.196/32", "52.154.171.0/32", "52.154.170.243/32", "52.154.170.26/32", "52.154.169.200/32", "52.154.170.96/32", "52.154.170.88/32", "52.154.171.150/32", "52.154.171.205/32", "52.154.170.117/32", "52.154.170.209/32", "191.235.202.48/32", "191.233.3.202/32", "191.235.201.214/32", "191.233.3.197/32", "191.235.202.38/32", "20.53.78.144/32", "20.193.24.10/32", "20.53.78.236/32", "20.53.78.138/32", "20.53.78.123/32", "20.53.78.106/32", "20.193.27.215/32", "20.193.25.197/32", "20.193.12.126/32", "20.193.24.251/32", "20.204.242.101/32", "20.207.72.113/32", "20.204.242.19/32", "20.219.45.67/32", "20.207.72.11/32", "20.219.45.190/32", "20.204.243.55/32", "20.204.241.148/32", "20.207.72.110/32", "20.204.240.172/32", "20.207.72.21/32", "20.204.246.81/32", "20.207.107.181/32", "20.204.246.254/32", "20.219.43.246/32", "52.149.25.43/32", "52.149.61.51/32", "52.149.58.139/32", "52.149.60.38/32", "52.148.165.38/32", "52.143.95.162/32", "52.149.56.151/32", "52.149.30.45/32", "52.149.58.173/32", "52.143.95.204/32", "52.149.28.83/32", "52.149.58.69/32", "52.148.161.87/32", "52.149.58.27/32", "52.149.28.18/32", "20.79.226.26/32", "20.79.239.66/32", "20.79.238.198/32", "20.113.14.159/32", "20.75.144.152/32", "20.43.172.120/32", "20.53.134.160/32", "20.201.15.208/32", "20.93.28.24/32", "20.61.34.40/32", "52.242.224.168/32", "20.80.129.80/32", "20.195.108.47/32", "4.195.133.120/32", "4.228.76.163/32", "4.182.131.108/32", "4.209.224.56/32", "108.141.83.74/32", "4.213.46.14/32", "172.169.17.165/32", "51.8.71.117/32", "20.3.1.178/32", "52.149.56.151/32", "52.149.30.45/32", "52.149.58.173/32", "52.143.95.204/32", "52.149.28.83/32", "52.149.58.69/32", "52.148.161.87/32", "52.149.58.27/32", "52.149.28.18/32", "20.79.226.26/32", "20.79.239.66/32", "20.79.238.198/32", "20.113.14.159/32", "20.75.144.152/32", "20.43.172.120/32", "20.53.134.160/32", "20.201.15.208/32", "20.93.28.24/32", "20.61.34.40/32", "52.242.224.168/32", "20.80.129.80/32", "20.195.108.47/32", "4.195.133.120/32", "4.228.76.163/32", "4.182.131.108/32", "4.209.224.56/32", "108.141.83.74/32", "4.213.46.14/32", "172.169.17.165/32", "51.8.71.117/32", "20.3.1.178/32", ] ================================================ FILE: data/crawlers/googlebot.yaml ================================================ - name: googlebot user_agent_regex: \+http\://www\.google\.com/bot\.html action: ALLOW # https://developers.google.com/static/search/apis/ipranges/googlebot.json remote_addresses: [ "2001:4860:4801:10::/64", "2001:4860:4801:11::/64", "2001:4860:4801:12::/64", "2001:4860:4801:13::/64", "2001:4860:4801:14::/64", "2001:4860:4801:15::/64", "2001:4860:4801:16::/64", "2001:4860:4801:17::/64", "2001:4860:4801:18::/64", "2001:4860:4801:19::/64", "2001:4860:4801:1a::/64", "2001:4860:4801:1b::/64", "2001:4860:4801:1c::/64", "2001:4860:4801:1d::/64", "2001:4860:4801:1e::/64", "2001:4860:4801:1f::/64", "2001:4860:4801:20::/64", "2001:4860:4801:21::/64", "2001:4860:4801:22::/64", "2001:4860:4801:23::/64", "2001:4860:4801:24::/64", "2001:4860:4801:25::/64", "2001:4860:4801:26::/64", "2001:4860:4801:27::/64", "2001:4860:4801:28::/64", "2001:4860:4801:29::/64", "2001:4860:4801:2::/64", "2001:4860:4801:2a::/64", "2001:4860:4801:2b::/64", "2001:4860:4801:2c::/64", "2001:4860:4801:2d::/64", "2001:4860:4801:2e::/64", "2001:4860:4801:2f::/64", "2001:4860:4801:31::/64", "2001:4860:4801:32::/64", "2001:4860:4801:33::/64", "2001:4860:4801:34::/64", "2001:4860:4801:35::/64", "2001:4860:4801:36::/64", "2001:4860:4801:37::/64", "2001:4860:4801:38::/64", "2001:4860:4801:39::/64", "2001:4860:4801:3a::/64", "2001:4860:4801:3b::/64", "2001:4860:4801:3c::/64", "2001:4860:4801:3d::/64", "2001:4860:4801:3e::/64", "2001:4860:4801:40::/64", "2001:4860:4801:41::/64", "2001:4860:4801:42::/64", "2001:4860:4801:43::/64", "2001:4860:4801:44::/64", "2001:4860:4801:45::/64", "2001:4860:4801:46::/64", "2001:4860:4801:47::/64", "2001:4860:4801:48::/64", "2001:4860:4801:49::/64", "2001:4860:4801:4a::/64", "2001:4860:4801:4b::/64", "2001:4860:4801:4c::/64", "2001:4860:4801:50::/64", "2001:4860:4801:51::/64", "2001:4860:4801:52::/64", "2001:4860:4801:53::/64", "2001:4860:4801:54::/64", "2001:4860:4801:55::/64", "2001:4860:4801:56::/64", "2001:4860:4801:60::/64", "2001:4860:4801:61::/64", "2001:4860:4801:62::/64", "2001:4860:4801:63::/64", "2001:4860:4801:64::/64", "2001:4860:4801:65::/64", "2001:4860:4801:66::/64", "2001:4860:4801:67::/64", "2001:4860:4801:68::/64", "2001:4860:4801:69::/64", "2001:4860:4801:6a::/64", "2001:4860:4801:6b::/64", "2001:4860:4801:6c::/64", "2001:4860:4801:6d::/64", "2001:4860:4801:6e::/64", "2001:4860:4801:6f::/64", "2001:4860:4801:70::/64", "2001:4860:4801:71::/64", "2001:4860:4801:72::/64", "2001:4860:4801:73::/64", "2001:4860:4801:74::/64", "2001:4860:4801:75::/64", "2001:4860:4801:76::/64", "2001:4860:4801:77::/64", "2001:4860:4801:78::/64", "2001:4860:4801:79::/64", "2001:4860:4801:80::/64", "2001:4860:4801:81::/64", "2001:4860:4801:82::/64", "2001:4860:4801:83::/64", "2001:4860:4801:84::/64", "2001:4860:4801:85::/64", "2001:4860:4801:86::/64", "2001:4860:4801:87::/64", "2001:4860:4801:88::/64", "2001:4860:4801:90::/64", "2001:4860:4801:91::/64", "2001:4860:4801:92::/64", "2001:4860:4801:93::/64", "2001:4860:4801:94::/64", "2001:4860:4801:95::/64", "2001:4860:4801:96::/64", "2001:4860:4801:a0::/64", "2001:4860:4801:a1::/64", "2001:4860:4801:a2::/64", "2001:4860:4801:a3::/64", "2001:4860:4801:a4::/64", "2001:4860:4801:a5::/64", "2001:4860:4801:c::/64", "2001:4860:4801:f::/64", "192.178.5.0/27", "192.178.6.0/27", "192.178.6.128/27", "192.178.6.160/27", "192.178.6.192/27", "192.178.6.32/27", "192.178.6.64/27", "192.178.6.96/27", "34.100.182.96/28", "34.101.50.144/28", "34.118.254.0/28", "34.118.66.0/28", "34.126.178.96/28", "34.146.150.144/28", "34.147.110.144/28", "34.151.74.144/28", "34.152.50.64/28", "34.154.114.144/28", "34.155.98.32/28", "34.165.18.176/28", "34.175.160.64/28", "34.176.130.16/28", "34.22.85.0/27", "34.64.82.64/28", "34.65.242.112/28", "34.80.50.80/28", "34.88.194.0/28", "34.89.10.80/28", "34.89.198.80/28", "34.96.162.48/28", "35.247.243.240/28", "66.249.64.0/27", "66.249.64.128/27", "66.249.64.160/27", "66.249.64.224/27", "66.249.64.32/27", "66.249.64.64/27", "66.249.64.96/27", "66.249.65.0/27", "66.249.65.128/27", "66.249.65.160/27", "66.249.65.192/27", "66.249.65.224/27", "66.249.65.32/27", "66.249.65.64/27", "66.249.65.96/27", "66.249.66.0/27", "66.249.66.128/27", "66.249.66.160/27", "66.249.66.192/27", "66.249.66.224/27", "66.249.66.32/27", "66.249.66.64/27", "66.249.66.96/27", "66.249.68.0/27", "66.249.68.128/27", "66.249.68.32/27", "66.249.68.64/27", "66.249.68.96/27", "66.249.69.0/27", "66.249.69.128/27", "66.249.69.160/27", "66.249.69.192/27", "66.249.69.224/27", "66.249.69.32/27", "66.249.69.64/27", "66.249.69.96/27", "66.249.70.0/27", "66.249.70.128/27", "66.249.70.160/27", "66.249.70.192/27", "66.249.70.224/27", "66.249.70.32/27", "66.249.70.64/27", "66.249.70.96/27", "66.249.71.0/27", "66.249.71.128/27", "66.249.71.160/27", "66.249.71.192/27", "66.249.71.224/27", "66.249.71.32/27", "66.249.71.64/27", "66.249.71.96/27", "66.249.72.0/27", "66.249.72.128/27", "66.249.72.160/27", "66.249.72.192/27", "66.249.72.224/27", "66.249.72.32/27", "66.249.72.64/27", "66.249.72.96/27", "66.249.73.0/27", "66.249.73.128/27", "66.249.73.160/27", "66.249.73.192/27", "66.249.73.224/27", "66.249.73.32/27", "66.249.73.64/27", "66.249.73.96/27", "66.249.74.0/27", "66.249.74.128/27", "66.249.74.160/27", "66.249.74.192/27", "66.249.74.32/27", "66.249.74.64/27", "66.249.74.96/27", "66.249.75.0/27", "66.249.75.128/27", "66.249.75.160/27", "66.249.75.192/27", "66.249.75.224/27", "66.249.75.32/27", "66.249.75.64/27", "66.249.75.96/27", "66.249.76.0/27", "66.249.76.128/27", "66.249.76.160/27", "66.249.76.192/27", "66.249.76.224/27", "66.249.76.32/27", "66.249.76.64/27", "66.249.76.96/27", "66.249.77.0/27", "66.249.77.128/27", "66.249.77.160/27", "66.249.77.192/27", "66.249.77.224/27", "66.249.77.32/27", "66.249.77.64/27", "66.249.77.96/27", "66.249.78.0/27", "66.249.78.32/27", "66.249.79.0/27", "66.249.79.128/27", "66.249.79.160/27", "66.249.79.192/27", "66.249.79.224/27", "66.249.79.32/27", "66.249.79.64/27", "66.249.79.96/27", ] ================================================ FILE: data/crawlers/huawei-cloud.yaml ================================================ - name: huawei-cloud action: DENY # Updated 2025-08-20 from IP addresses for AS136907 remote_addresses: - 1.178.32.0/20 - 1.178.48.0/20 - 101.44.0.0/20 - 101.44.144.0/20 - 101.44.16.0/20 - 101.44.160.0/20 - 101.44.173.0/24 - 101.44.176.0/20 - 101.44.192.0/20 - 101.44.208.0/22 - 101.44.212.0/22 - 101.44.216.0/22 - 101.44.220.0/22 - 101.44.224.0/22 - 101.44.228.0/22 - 101.44.232.0/22 - 101.44.236.0/22 - 101.44.240.0/22 - 101.44.244.0/22 - 101.44.248.0/22 - 101.44.252.0/24 - 101.44.253.0/24 - 101.44.254.0/24 - 101.44.255.0/24 - 101.44.32.0/20 - 101.44.48.0/20 - 101.44.64.0/20 - 101.44.80.0/20 - 101.44.96.0/20 - 101.46.0.0/20 - 101.46.128.0/21 - 101.46.136.0/21 - 101.46.144.0/21 - 101.46.152.0/21 - 101.46.160.0/21 - 101.46.168.0/21 - 101.46.176.0/21 - 101.46.184.0/21 - 101.46.192.0/21 - 101.46.200.0/21 - 101.46.208.0/21 - 101.46.216.0/21 - 101.46.224.0/22 - 101.46.232.0/22 - 101.46.236.0/22 - 101.46.240.0/22 - 101.46.244.0/22 - 101.46.248.0/22 - 101.46.252.0/24 - 101.46.253.0/24 - 101.46.254.0/24 - 101.46.255.0/24 - 101.46.32.0/20 - 101.46.48.0/20 - 101.46.64.0/20 - 101.46.80.0/20 - 103.198.203.0/24 - 103.215.0.0/24 - 103.215.1.0/24 - 103.215.3.0/24 - 103.240.156.0/22 - 103.240.157.0/24 - 103.255.60.0/22 - 103.255.60.0/24 - 103.255.61.0/24 - 103.255.62.0/24 - 103.255.63.0/24 - 103.40.100.0/23 - 103.84.110.0/24 - 110.238.100.0/22 - 110.238.104.0/21 - 110.238.112.0/21 - 110.238.120.0/22 - 110.238.124.0/22 - 110.238.64.0/21 - 110.238.72.0/21 - 110.238.80.0/20 - 110.238.96.0/24 - 110.238.98.0/24 - 110.238.99.0/24 - 110.239.127.0/24 - 110.239.184.0/22 - 110.239.188.0/23 - 110.239.190.0/23 - 110.239.64.0/19 - 110.239.96.0/19 - 110.41.208.0/24 - 110.41.209.0/24 - 110.41.210.0/24 - 111.119.192.0/20 - 111.119.208.0/20 - 111.119.224.0/20 - 111.119.240.0/20 - 111.91.0.0/20 - 111.91.112.0/20 - 111.91.16.0/20 - 111.91.32.0/20 - 111.91.48.0/20 - 111.91.64.0/20 - 111.91.80.0/20 - 111.91.96.0/20 - 114.119.128.0/19 - 114.119.160.0/21 - 114.119.168.0/24 - 114.119.169.0/24 - 114.119.170.0/24 - 114.119.171.0/24 - 114.119.172.0/22 - 114.119.176.0/20 - 115.30.32.0/20 - 115.30.48.0/20 - 119.12.160.0/20 - 119.13.112.0/20 - 119.13.160.0/24 - 119.13.161.0/24 - 119.13.162.0/23 - 119.13.163.0/24 - 119.13.164.0/22 - 119.13.168.0/21 - 119.13.168.0/24 - 119.13.169.0/24 - 119.13.170.0/24 - 119.13.172.0/24 - 119.13.173.0/24 - 119.13.32.0/22 - 119.13.36.0/22 - 119.13.64.0/24 - 119.13.65.0/24 - 119.13.66.0/23 - 119.13.68.0/22 - 119.13.72.0/22 - 119.13.76.0/22 - 119.13.80.0/21 - 119.13.88.0/22 - 119.13.92.0/22 - 119.13.96.0/20 - 119.8.0.0/21 - 119.8.128.0/24 - 119.8.129.0/24 - 119.8.130.0/23 - 119.8.132.0/22 - 119.8.136.0/21 - 119.8.144.0/20 - 119.8.160.0/19 - 119.8.18.0/24 - 119.8.192.0/20 - 119.8.192.0/21 - 119.8.200.0/21 - 119.8.208.0/20 - 119.8.21.0/24 - 119.8.22.0/24 - 119.8.224.0/24 - 119.8.227.0/24 - 119.8.228.0/22 - 119.8.23.0/24 - 119.8.232.0/21 - 119.8.24.0/21 - 119.8.240.0/23 - 119.8.242.0/23 - 119.8.244.0/24 - 119.8.245.0/24 - 119.8.246.0/24 - 119.8.247.0/24 - 119.8.248.0/24 - 119.8.249.0/24 - 119.8.250.0/24 - 119.8.253.0/24 - 119.8.254.0/23 - 119.8.32.0/19 - 119.8.4.0/24 - 119.8.64.0/22 - 119.8.68.0/24 - 119.8.69.0/24 - 119.8.70.0/24 - 119.8.71.0/24 - 119.8.72.0/21 - 119.8.8.0/21 - 119.8.80.0/20 - 119.8.96.0/19 - 121.91.152.0/21 - 121.91.168.0/21 - 121.91.200.0/21 - 121.91.200.0/24 - 121.91.201.0/24 - 121.91.204.0/24 - 121.91.205.0/24 - 122.8.128.0/20 - 122.8.144.0/20 - 122.8.160.0/20 - 122.8.176.0/21 - 122.8.184.0/22 - 122.8.188.0/22 - 124.243.128.0/18 - 124.243.156.0/24 - 124.243.157.0/24 - 124.243.158.0/24 - 124.243.159.0/24 - 124.71.248.0/24 - 124.71.249.0/24 - 124.71.250.0/24 - 124.71.252.0/24 - 124.71.253.0/24 - 124.81.0.0/20 - 124.81.112.0/20 - 124.81.128.0/20 - 124.81.144.0/20 - 124.81.16.0/20 - 124.81.160.0/20 - 124.81.176.0/20 - 124.81.192.0/20 - 124.81.208.0/20 - 124.81.224.0/20 - 124.81.240.0/20 - 124.81.32.0/20 - 124.81.48.0/20 - 124.81.64.0/20 - 124.81.80.0/20 - 124.81.96.0/20 - 139.9.98.0/24 - 139.9.99.0/24 - 14.137.132.0/22 - 14.137.136.0/22 - 14.137.140.0/22 - 14.137.152.0/24 - 14.137.153.0/24 - 14.137.154.0/24 - 14.137.155.0/24 - 14.137.156.0/24 - 14.137.157.0/24 - 14.137.161.0/24 - 14.137.163.0/24 - 14.137.169.0/24 - 14.137.170.0/23 - 14.137.172.0/22 - 146.174.128.0/20 - 146.174.144.0/20 - 146.174.160.0/20 - 146.174.176.0/20 - 148.145.160.0/20 - 148.145.192.0/20 - 148.145.208.0/20 - 148.145.224.0/23 - 148.145.234.0/23 - 148.145.236.0/23 - 148.145.238.0/23 - 149.232.128.0/20 - 149.232.144.0/20 - 150.40.128.0/20 - 150.40.144.0/20 - 150.40.160.0/20 - 150.40.176.0/20 - 150.40.182.0/24 - 150.40.192.0/20 - 150.40.208.0/20 - 150.40.224.0/20 - 150.40.240.0/20 - 154.220.192.0/19 - 154.81.16.0/20 - 154.83.0.0/23 - 154.86.32.0/20 - 154.86.48.0/20 - 154.93.100.0/23 - 154.93.104.0/23 - 156.227.22.0/23 - 156.230.32.0/21 - 156.230.40.0/21 - 156.230.64.0/18 - 156.232.16.0/20 - 156.240.128.0/18 - 156.249.32.0/20 - 156.253.16.0/20 - 157.254.211.0/24 - 157.254.212.0/24 - 159.138.0.0/20 - 159.138.112.0/21 - 159.138.114.0/24 - 159.138.120.0/22 - 159.138.124.0/24 - 159.138.125.0/24 - 159.138.126.0/23 - 159.138.128.0/20 - 159.138.144.0/20 - 159.138.152.0/21 - 159.138.16.0/22 - 159.138.160.0/20 - 159.138.176.0/23 - 159.138.178.0/24 - 159.138.179.0/24 - 159.138.180.0/24 - 159.138.181.0/24 - 159.138.182.0/23 - 159.138.188.0/23 - 159.138.190.0/23 - 159.138.192.0/20 - 159.138.20.0/22 - 159.138.208.0/21 - 159.138.216.0/22 - 159.138.220.0/23 - 159.138.224.0/20 - 159.138.24.0/21 - 159.138.240.0/20 - 159.138.32.0/20 - 159.138.48.0/20 - 159.138.64.0/21 - 159.138.67.0/24 - 159.138.76.0/24 - 159.138.77.0/24 - 159.138.78.0/24 - 159.138.79.0/24 - 159.138.80.0/20 - 159.138.96.0/20 - 166.108.192.0/20 - 166.108.208.0/20 - 166.108.224.0/20 - 166.108.240.0/20 - 176.52.128.0/20 - 176.52.144.0/20 - 180.87.192.0/20 - 180.87.208.0/20 - 180.87.224.0/20 - 180.87.240.0/20 - 182.160.0.0/20 - 182.160.16.0/24 - 182.160.17.0/24 - 182.160.18.0/23 - 182.160.20.0/22 - 182.160.20.0/24 - 182.160.24.0/21 - 182.160.36.0/22 - 182.160.49.0/24 - 182.160.52.0/22 - 182.160.56.0/21 - 182.160.56.0/24 - 182.160.57.0/24 - 182.160.58.0/24 - 182.160.59.0/24 - 182.160.60.0/24 - 182.160.61.0/24 - 182.160.62.0/24 - 183.87.112.0/20 - 183.87.128.0/20 - 183.87.144.0/20 - 183.87.32.0/20 - 183.87.48.0/20 - 183.87.64.0/20 - 183.87.80.0/20 - 183.87.96.0/20 - 188.119.192.0/20 - 188.119.208.0/20 - 188.119.224.0/20 - 188.119.240.0/20 - 188.239.0.0/20 - 188.239.16.0/20 - 188.239.32.0/20 - 188.239.48.0/20 - 189.1.192.0/20 - 189.1.208.0/20 - 189.1.224.0/20 - 189.1.240.0/20 - 189.28.112.0/20 - 189.28.96.0/20 - 190.92.192.0/19 - 190.92.224.0/19 - 190.92.248.0/24 - 190.92.252.0/24 - 190.92.253.0/24 - 190.92.254.0/24 - 201.77.32.0/20 - 202.170.88.0/21 - 202.76.128.0/20 - 202.76.144.0/20 - 202.76.160.0/20 - 202.76.176.0/20 - 203.123.80.0/20 - 203.167.20.0/23 - 203.167.22.0/24 - 212.34.192.0/20 - 212.34.208.0/20 - 213.250.128.0/20 - 213.250.144.0/20 - 213.250.160.0/20 - 213.250.176.0/21 - 213.250.184.0/21 - 219.83.0.0/20 - 219.83.112.0/22 - 219.83.116.0/23 - 219.83.118.0/23 - 219.83.121.0/24 - 219.83.122.0/24 - 219.83.123.0/24 - 219.83.124.0/24 - 219.83.16.0/20 - 219.83.32.0/20 - 219.83.76.0/23 - 2404:a140:43::/48 - 2405:f080::/39 - 2405:f080:1::/48 - 2405:f080:1000::/39 - 2405:f080:1200::/39 - 2405:f080:1400::/48 - 2405:f080:1401::/48 - 2405:f080:1402::/48 - 2405:f080:1403::/48 - 2405:f080:1500::/40 - 2405:f080:1600::/48 - 2405:f080:1602::/48 - 2405:f080:1603::/48 - 2405:f080:1800::/39 - 2405:f080:1800::/44 - 2405:f080:1810::/48 - 2405:f080:1811::/48 - 2405:f080:1812::/48 - 2405:f080:1813::/48 - 2405:f080:1814::/48 - 2405:f080:1815::/48 - 2405:f080:1900::/40 - 2405:f080:1e02::/47 - 2405:f080:1e04::/47 - 2405:f080:1e06::/47 - 2405:f080:1e1e::/47 - 2405:f080:1e20::/47 - 2405:f080:200::/48 - 2405:f080:2000::/39 - 2405:f080:201::/48 - 2405:f080:202::/48 - 2405:f080:2040::/48 - 2405:f080:2200::/39 - 2405:f080:2280::/48 - 2405:f080:2281::/48 - 2405:f080:2282::/48 - 2405:f080:2283::/48 - 2405:f080:2284::/48 - 2405:f080:2285::/48 - 2405:f080:2286::/48 - 2405:f080:2287::/48 - 2405:f080:2288::/48 - 2405:f080:2289::/48 - 2405:f080:228a::/48 - 2405:f080:228b::/48 - 2405:f080:228c::/48 - 2405:f080:228d::/48 - 2405:f080:228e::/48 - 2405:f080:228f::/48 - 2405:f080:2400::/39 - 2405:f080:2600::/39 - 2405:f080:2800::/48 - 2405:f080:2a00::/48 - 2405:f080:2e00::/47 - 2405:f080:3000::/38 - 2405:f080:3000::/40 - 2405:f080:3100::/40 - 2405:f080:3200::/48 - 2405:f080:3201::/48 - 2405:f080:3202::/48 - 2405:f080:3203::/48 - 2405:f080:3204::/48 - 2405:f080:3205::/48 - 2405:f080:3400::/38 - 2405:f080:3400::/40 - 2405:f080:3500::/40 - 2405:f080:3600::/48 - 2405:f080:3601::/48 - 2405:f080:3602::/48 - 2405:f080:3603::/48 - 2405:f080:3604::/48 - 2405:f080:3605::/48 - 2405:f080:400::/39 - 2405:f080:4000::/40 - 2405:f080:4100::/48 - 2405:f080:4102::/48 - 2405:f080:4103::/48 - 2405:f080:4104::/48 - 2405:f080:4200::/40 - 2405:f080:4300::/40 - 2405:f080:600::/48 - 2405:f080:800::/40 - 2405:f080:810::/44 - 2405:f080:a00::/39 - 2405:f080:a11::/48 - 2405:f080:e02::/48 - 2405:f080:e03::/48 - 2405:f080:e04::/47 - 2405:f080:e05::/48 - 2405:f080:e06::/48 - 2405:f080:e07::/48 - 2405:f080:e0e::/47 - 2405:f080:e10::/47 - 2405:f080:edff::/48 - 27.106.0.0/20 - 27.106.112.0/20 - 27.106.16.0/20 - 27.106.32.0/20 - 27.106.48.0/20 - 27.106.64.0/20 - 27.106.80.0/20 - 27.106.96.0/20 - 27.255.0.0/23 - 27.255.10.0/23 - 27.255.12.0/23 - 27.255.14.0/23 - 27.255.16.0/23 - 27.255.18.0/23 - 27.255.2.0/23 - 27.255.20.0/23 - 27.255.22.0/23 - 27.255.26.0/23 - 27.255.28.0/23 - 27.255.30.0/23 - 27.255.32.0/23 - 27.255.34.0/23 - 27.255.36.0/23 - 27.255.38.0/23 - 27.255.4.0/23 - 27.255.40.0/23 - 27.255.42.0/23 - 27.255.44.0/23 - 27.255.46.0/23 - 27.255.48.0/23 - 27.255.50.0/23 - 27.255.52.0/23 - 27.255.54.0/23 - 27.255.58.0/23 - 27.255.6.0/23 - 27.255.60.0/23 - 27.255.62.0/23 - 27.255.8.0/23 - 42.201.128.0/20 - 42.201.144.0/20 - 42.201.160.0/20 - 42.201.176.0/20 - 42.201.192.0/20 - 42.201.208.0/20 - 42.201.224.0/20 - 42.201.240.0/20 - 43.225.140.0/22 - 43.255.104.0/22 - 45.194.104.0/21 - 45.199.144.0/22 - 45.202.128.0/19 - 45.202.160.0/20 - 45.202.176.0/21 - 45.202.184.0/21 - 45.203.40.0/21 - 46.250.160.0/20 - 46.250.176.0/20 - 49.0.192.0/21 - 49.0.200.0/21 - 49.0.224.0/22 - 49.0.228.0/22 - 49.0.232.0/21 - 49.0.240.0/20 - 62.245.0.0/20 - 62.245.16.0/20 - 80.238.128.0/22 - 80.238.132.0/22 - 80.238.136.0/22 - 80.238.140.0/22 - 80.238.144.0/22 - 80.238.148.0/22 - 80.238.152.0/22 - 80.238.156.0/22 - 80.238.164.0/22 - 80.238.164.0/24 - 80.238.165.0/24 - 80.238.168.0/22 - 80.238.168.0/24 - 80.238.169.0/24 - 80.238.170.0/24 - 80.238.171.0/24 - 80.238.172.0/22 - 80.238.176.0/22 - 80.238.180.0/24 - 80.238.181.0/24 - 80.238.183.0/24 - 80.238.184.0/24 - 80.238.185.0/24 - 80.238.186.0/24 - 80.238.190.0/24 - 80.238.192.0/20 - 80.238.208.0/20 - 80.238.224.0/20 - 80.238.240.0/20 - 83.101.0.0/21 - 83.101.104.0/21 - 83.101.16.0/21 - 83.101.24.0/21 - 83.101.32.0/21 - 83.101.48.0/21 - 83.101.56.0/23 - 83.101.58.0/23 - 83.101.64.0/21 - 83.101.72.0/21 - 83.101.8.0/23 - 83.101.80.0/21 - 83.101.88.0/24 - 83.101.89.0/24 - 83.101.96.0/21 - 87.119.12.0/24 - 89.150.192.0/20 - 89.150.208.0/20 - 94.244.128.0/20 - 94.244.144.0/20 - 94.244.160.0/20 - 94.244.176.0/20 - 94.45.160.0/19 - 94.45.160.0/24 - 94.45.161.0/24 - 94.45.163.0/24 - 94.74.112.0/21 - 94.74.120.0/21 - 94.74.64.0/20 - 94.74.80.0/20 - 94.74.96.0/20 ================================================ FILE: data/crawlers/internet-archive.yaml ================================================ - name: internet-archive action: ALLOW # https://ipinfo.io/AS7941 remote_addresses: ["207.241.224.0/20", "208.70.24.0/21", "2620:0:9c0::/48"] ================================================ FILE: data/crawlers/kagibot.yaml ================================================ - name: kagibot user_agent_regex: \+https\://kagi\.com/bot action: ALLOW # https://kagi.com/bot remote_addresses: [ "216.18.205.234/32", "35.212.27.76/32", "104.254.65.50/32", "209.151.156.194/32", ] ================================================ FILE: data/crawlers/marginalia.yaml ================================================ - name: marginalia user_agent_regex: search\.marginalia\.nu action: ALLOW # Received directly over email remote_addresses: [ "193.183.0.162/31", "193.183.0.164/30", "193.183.0.168/30", "193.183.0.172/31", "193.183.0.174/32", ] ================================================ FILE: data/crawlers/mojeekbot.yaml ================================================ - name: mojeekbot user_agent_regex: \+https\://www\.mojeek\.com/bot\.html action: ALLOW # https://www.mojeek.com/bot.html remote_addresses: ["5.102.173.71/32"] ================================================ FILE: data/crawlers/openai-gptbot.yaml ================================================ # Collects AI training data # https://platform.openai.com/docs/bots/overview-of-openai-crawlers - name: openai-gptbot user_agent_regex: GPTBot/1\.1; \+https\://openai\.com/gptbot action: ALLOW # https://openai.com/gptbot.json remote_addresses: [ "52.230.152.0/24", "20.171.206.0/24", "20.171.207.0/24", "4.227.36.0/25", "20.125.66.80/28", "172.182.204.0/24", "172.182.214.0/24", "172.182.215.0/24", ] ================================================ FILE: data/crawlers/openai-searchbot.yaml ================================================ # Indexing for search, does not collect training data # https://platform.openai.com/docs/bots/overview-of-openai-crawlers - name: openai-searchbot user_agent_regex: OAI-SearchBot/1\.0; \+https\://openai\.com/searchbot action: ALLOW # https://openai.com/searchbot.json remote_addresses: [ "20.42.10.176/28", "172.203.190.128/28", "104.210.140.128/28", "51.8.102.0/24", "135.234.64.0/24", ] ================================================ FILE: data/crawlers/perplexitybot.yaml ================================================ # Indexing for search, does not collect training data # https://docs.perplexity.ai/guides/bots - name: perplexitybot user_agent_regex: PerplexityBot/.+; \+https\://perplexity\.ai/perplexitybot action: ALLOW # https://www.perplexity.com/perplexitybot.json remote_addresses: [ "107.20.236.150/32", "3.224.62.45/32", "18.210.92.235/32", "3.222.232.239/32", "3.211.124.183/32", "3.231.139.107/32", "18.97.1.228/30", "18.97.9.96/29", ] ================================================ FILE: data/crawlers/qwantbot.yaml ================================================ - name: qwantbot user_agent_regex: \+https\://help\.qwant\.com/bot/ action: ALLOW # https://help.qwant.com/wp-content/uploads/sites/2/2025/01/qwantbot.json remote_addresses: ["91.242.162.0/24"] ================================================ FILE: data/crawlers/tencent-cloud.yaml ================================================ # Tencent Cloud crawler IP ranges - name: tencent-cloud action: DENY remote_addresses: - 101.32.0.0/17 - 101.32.176.0/20 - 101.32.192.0/18 - 101.33.116.0/22 - 101.33.120.0/21 - 101.33.16.0/20 - 101.33.2.0/23 - 101.33.32.0/19 - 101.33.4.0/22 - 101.33.64.0/19 - 101.33.8.0/21 - 101.33.96.0/20 - 119.28.28.0/24 - 119.29.29.0/24 - 124.156.0.0/16 - 129.226.0.0/18 - 129.226.128.0/18 - 129.226.224.0/19 - 129.226.96.0/19 - 150.109.0.0/18 - 150.109.128.0/20 - 150.109.160.0/19 - 150.109.192.0/18 - 150.109.64.0/20 - 150.109.80.0/21 - 150.109.88.0/22 - 150.109.96.0/19 - 162.14.60.0/22 - 162.62.0.0/18 - 162.62.128.0/20 - 162.62.144.0/21 - 162.62.152.0/22 - 162.62.172.0/22 - 162.62.176.0/20 - 162.62.192.0/19 - 162.62.255.0/24 - 162.62.80.0/20 - 162.62.96.0/19 - 170.106.0.0/16 - 43.128.0.0/14 - 43.132.0.0/22 - 43.132.12.0/22 - 43.132.128.0/17 - 43.132.16.0/22 - 43.132.28.0/22 - 43.132.32.0/22 - 43.132.40.0/22 - 43.132.52.0/22 - 43.132.60.0/24 - 43.132.64.0/22 - 43.132.69.0/24 - 43.132.70.0/23 - 43.132.72.0/21 - 43.132.80.0/21 - 43.132.88.0/22 - 43.132.92.0/23 - 43.132.96.0/19 - 43.133.0.0/16 - 43.134.0.0/16 - 43.135.0.0/17 - 43.135.128.0/18 - 43.135.192.0/19 - 43.152.0.0/21 - 43.152.11.0/24 - 43.152.12.0/22 - 43.152.128.0/22 - 43.152.133.0/24 - 43.152.134.0/23 - 43.152.136.0/21 - 43.152.144.0/20 - 43.152.160.0/22 - 43.152.16.0/21 - 43.152.164.0/23 - 43.152.166.0/24 - 43.152.168.0/21 - 43.152.178.0/23 - 43.152.180.0/22 - 43.152.184.0/21 - 43.152.192.0/18 - 43.152.24.0/22 - 43.152.31.0/24 - 43.152.32.0/23 - 43.152.35.0/24 - 43.152.36.0/22 - 43.152.40.0/21 - 43.152.48.0/20 - 43.152.74.0/23 - 43.152.76.0/22 - 43.152.80.0/22 - 43.152.8.0/23 - 43.152.92.0/23 - 43.153.0.0/16 - 43.154.0.0/15 - 43.156.0.0/15 - 43.158.0.0/16 - 43.159.0.0/20 - 43.159.128.0/17 - 43.159.64.0/23 - 43.159.70.0/23 - 43.159.72.0/21 - 43.159.81.0/24 - 43.159.82.0/23 - 43.159.85.0/24 - 43.159.86.0/23 - 43.159.88.0/21 - 43.159.96.0/19 - 43.160.0.0/15 - 43.162.0.0/16 - 43.163.0.0/17 - 43.163.128.0/18 - 43.163.192.255/32 - 43.163.193.0/24 - 43.163.194.0/23 - 43.163.196.0/22 - 43.163.200.0/21 - 43.163.208.0/20 - 43.163.224.0/19 - 43.164.0.0/18 - 43.164.128.0/17 - 43.165.0.0/16 - 43.166.128.0/18 - 43.166.224.0/19 - 43.168.0.0/20 - 43.168.16.0/21 - 43.168.24.0/22 - 43.168.255.0/24 - 43.168.32.0/19 - 43.168.64.0/20 - 43.168.80.0/22 - 43.169.0.0/16 - 43.170.0.0/16 - 43.174.0.0/18 - 43.174.128.0/17 - 43.174.64.0/22 - 43.174.68.0/23 - 43.174.71.0/24 - 43.174.74.0/23 - 43.174.76.0/22 - 43.174.80.0/20 - 43.174.96.0/19 - 43.175.0.0/20 - 43.175.113.0/24 - 43.175.114.0/23 - 43.175.116.0/22 - 43.175.120.0/21 - 43.175.128.0/18 - 43.175.16.0/22 - 43.175.192.0/20 - 43.175.20.0/23 - 43.175.208.0/21 - 43.175.216.0/22 - 43.175.220.0/23 - 43.175.22.0/24 - 43.175.222.0/24 - 43.175.224.0/20 - 43.175.25.0/24 - 43.175.26.0/23 - 43.175.28.0/22 - 43.175.32.0/19 - 43.175.64.0/19 - 43.175.96.0/20 ================================================ FILE: data/crawlers/wikimedia-citoid.yaml ================================================ # Wikimedia Foundation citation services # https://www.mediawiki.org/wiki/Citoid - name: wikimedia-citoid user_agent_regex: "Citoid/WMF" action: ALLOW remote_addresses: [ "208.80.152.0/22", "2620:0:860::/46", ] - name: wikimedia-zotero-translation-server user_agent_regex: "ZoteroTranslationServer/WMF" action: ALLOW remote_addresses: [ "208.80.152.0/22", "2620:0:860::/46", ] ================================================ FILE: data/crawlers/yandexbot.yaml ================================================ - name: yandexbot action: ALLOW expression: all: - userAgent.matches("\\+http\\://yandex\\.com/bots") - verifyFCrDNS(remoteAddress, "^.*\\.yandex\\.(ru|com|net)$") ================================================ FILE: data/embed.go ================================================ package data import "embed" var ( //go:embed botPolicies.yaml all:apps all:bots all:clients all:common all:crawlers all:meta all:services BotPolicies embed.FS ) ================================================ FILE: data/embed_test.go ================================================ package data import ( "path/filepath" "strings" "testing" ) // TestBotPoliciesEmbed ensures all YAML files in the directory tree // are accessible in the embedded BotPolicies filesystem. func TestBotPoliciesEmbed(t *testing.T) { yamlFiles, err := filepath.Glob("./**/*.yaml") if err != nil { t.Fatalf("Failed to glob YAML files: %v", err) } if len(yamlFiles) == 0 { t.Fatal("No YAML files found in directory tree") } t.Logf("Found %d YAML files to verify", len(yamlFiles)) for _, filePath := range yamlFiles { embeddedPath := strings.TrimPrefix(filePath, "./") t.Run(embeddedPath, func(t *testing.T) { content, err := BotPolicies.ReadFile(embeddedPath) if err != nil { t.Errorf("Failed to read %s from embedded filesystem: %v", embeddedPath, err) return } if len(content) == 0 { t.Errorf("File %s exists in embedded filesystem but is empty", embeddedPath) } }) } } ================================================ FILE: data/meta/README.md ================================================ # meta policies Contains policies that exclusively reference policies in _multiple_ other data folders. Akin to "stances" that the administrator can take, with reference to various topics, such as AI/LLM systems. ================================================ FILE: data/meta/ai-block-aggressive.yaml ================================================ # Blocks all AI/LLM associated user agents, regardless of purpose or human agency # Warning: To completely block some AI/LLM training, such as with Google, you _must_ place flags in robots.txt. - import: (data)/bots/ai-catchall.yaml - import: (data)/clients/ai.yaml - import: (data)/crawlers/ai-search.yaml - import: (data)/crawlers/ai-training.yaml ================================================ FILE: data/meta/ai-block-moderate.yaml ================================================ # Blocks all AI/LLM bots used for training or unknown/undocumented purposes. # Permits user agents with explicitly documented non-training use, and published IP allowlists. - import: (data)/bots/ai-catchall.yaml - import: (data)/crawlers/ai-training.yaml - import: (data)/crawlers/openai-searchbot.yaml - import: (data)/crawlers/perplexitybot.yaml - import: (data)/clients/openai-chatgpt-user.yaml - import: (data)/clients/mistral-mistralai-user.yaml - import: (data)/clients/perplexity-user.yaml ================================================ FILE: data/meta/ai-block-permissive.yaml ================================================ # Permits all well documented AI/LLM user agents with published IP allowlists. - import: (data)/bots/ai-catchall.yaml - import: (data)/crawlers/openai-searchbot.yaml - import: (data)/crawlers/openai-gptbot.yaml - import: (data)/crawlers/perplexitybot.yaml - import: (data)/clients/openai-chatgpt-user.yaml - import: (data)/clients/mistral-mistralai-user.yaml - import: (data)/clients/perplexity-user.yaml ================================================ FILE: data/meta/default-config.yaml ================================================ - # Pathological bots to deny # This correlates to data/bots/_deny-pathological.yaml in the source tree # https://github.com/TecharoHQ/anubis/blob/main/data/bots/_deny-pathological.yaml import: (data)/bots/_deny-pathological.yaml - import: (data)/bots/aggressive-brazilian-scrapers.yaml # Aggressively block AI/LLM related bots/agents by default - import: (data)/meta/ai-block-aggressive.yaml # Consider replacing the aggressive AI policy with more selective policies: # - import: (data)/meta/ai-block-moderate.yaml # - import: (data)/meta/ai-block-permissive.yaml # Search engine crawlers to allow, defaults to: # - Google (so they don't try to bypass Anubis) # - Apple # - Bing # - DuckDuckGo # - Qwant # - The Internet Archive # - Kagi # - Marginalia # - Mojeek - import: (data)/crawlers/_allow-good.yaml # Challenge Firefox AI previews - import: (data)/clients/x-firefox-ai.yaml # Allow common "keeping the internet working" routes (well-known, favicon, robots.txt) - import: (data)/common/keep-internet-working.yaml # # Punish any bot with "bot" in the user-agent string # # This is known to have a high false-positive rate, use at your own risk # - name: generic-bot-catchall # user_agent_regex: (?i:bot|crawler) # action: CHALLENGE # challenge: # difficulty: 16 # impossible # algorithm: slow # intentionally waste CPU cycles and time # Requires a subscription to Thoth to use, see # https://anubis.techaro.lol/docs/admin/thoth#geoip-based-filtering - name: countries-with-aggressive-scrapers action: WEIGH geoip: countries: - BR - CN weight: adjust: 10 # Requires a subscription to Thoth to use, see # https://anubis.techaro.lol/docs/admin/thoth#asn-based-filtering - name: aggressive-asns-without-functional-abuse-contact action: WEIGH asns: match: - 13335 # Cloudflare - 136907 # Huawei Cloud - 45102 # Alibaba Cloud weight: adjust: 10 # ## System load based checks. # # If the system is under high load, add weight. # - name: high-load-average # action: WEIGH # expression: load_1m >= 10.0 # make sure to end the load comparison in a .0 # weight: # adjust: 20 ## If your backend service is running on the same operating system as Anubis, ## you can uncomment this rule to make the challenge easier when the system is ## under low load. ## ## If it is not, remove weight. # - name: low-load-average # action: WEIGH # expression: load_15m <= 4.0 # make sure to end the load comparison in a .0 # weight: # adjust: -10 # Generic catchall rule - name: generic-browser user_agent_regex: >- Mozilla|Opera action: WEIGH weight: adjust: 10 ================================================ FILE: data/meta/messengers-preview.yaml ================================================ - import: (data)/clients/telegram-preview.yaml - import: (data)/clients/vk-preview.yaml ================================================ FILE: data/services/updown.yaml ================================================ # https://updown.io/about - name: updown user_agent_regex: updown.io action: ALLOW remote_addresses: [ "45.32.74.41/32", "104.238.136.194/32", "192.99.37.47/32", "91.121.222.175/32", "104.238.159.87/32", "102.212.60.78/32", "135.181.102.135/32", "45.32.107.181/32", "45.76.104.117/32", "45.63.29.207/32", "2001:19f0:6001:2c6::1/128", "2001:19f0:9002:11a::1/128", "2607:5300:60:4c2f::1/128", "2001:41d0:2:85af::1/128", "2001:19f0:6c01:145::1/128", "2c0f:c40:4003:4::2/128", "2a01:4f9:c010:d5f9::1/128", "2001:19f0:4400:402e::1/128", "2001:19f0:7001:45a::1/128", "2001:19f0:5801:1d8::1/128" ] ================================================ FILE: data/services/uptime-robot.yaml ================================================ - name: uptime-robot user_agent_regex: UptimeRobot action: ALLOW # https://api.uptimerobot.com/meta/ips remote_addresses: [ "3.12.251.153/32", "3.20.63.178/32", "3.77.67.4/32", "3.79.134.69/32", "3.105.133.239/32", "3.105.190.221/32", "3.133.226.214/32", "3.149.57.90/32", "3.212.128.62/32", "5.161.61.238/32", "5.161.73.160/32", "5.161.75.7/32", "5.161.113.195/32", "5.161.117.52/32", "5.161.177.47/32", "5.161.194.92/32", "5.161.215.244/32", "5.223.43.32/32", "5.223.53.147/32", "5.223.57.22/32", "18.116.205.62/32", "18.180.208.214/32", "18.192.166.72/32", "18.193.252.127/32", "24.144.78.39/32", "24.144.78.185/32", "34.198.201.66/32", "45.55.123.175/32", "45.55.127.146/32", "49.13.24.81/32", "49.13.130.29/32", "49.13.134.145/32", "49.13.164.148/32", "49.13.167.123/32", "52.15.147.27/32", "52.22.236.30/32", "52.28.162.93/32", "52.59.43.236/32", "52.87.72.16/32", "54.64.67.106/32", "54.79.28.129/32", "54.87.112.51/32", "54.167.223.174/32", "54.249.170.27/32", "63.178.84.147/32", "64.225.81.248/32", "64.225.82.147/32", "69.162.124.227/32", "69.162.124.235/32", "69.162.124.238/32", "78.46.190.63/32", "78.46.215.1/32", "78.47.98.55/32", "78.47.173.76/32", "88.99.80.227/32", "91.99.101.207/32", "128.140.41.193/32", "128.140.106.114/32", "129.212.132.140/32", "134.199.240.137/32", "138.197.53.117/32", "138.197.53.138/32", "138.197.54.143/32", "138.197.54.247/32", "138.197.63.92/32", "139.59.50.44/32", "142.132.180.39/32", "143.198.249.237/32", "143.198.250.89/32", "143.244.196.21/32", "143.244.196.211/32", "143.244.221.177/32", "144.126.251.21/32", "146.190.9.187/32", "152.42.149.135/32", "157.90.155.240/32", "157.90.156.63/32", "159.69.158.189/32", "159.223.243.219/32", "161.35.247.201/32", "167.99.18.52/32", "167.235.143.113/32", "168.119.53.160/32", "168.119.96.239/32", "168.119.123.75/32", "170.64.250.64/32", "170.64.250.132/32", "170.64.250.235/32", "178.156.181.172/32", "178.156.184.20/32", "178.156.185.127/32", "178.156.185.231/32", "178.156.187.238/32", "178.156.189.113/32", "178.156.189.249/32", "188.166.201.79/32", "206.189.241.133/32", "209.38.49.1/32", "209.38.49.206/32", "209.38.49.226/32", "209.38.51.43/32", "209.38.53.7/32", "209.38.124.252/32", "216.144.248.18/31", "216.144.248.21/32", "216.144.248.22/31", "216.144.248.24/30", "216.144.248.28/31", "216.144.248.30/32", "216.245.221.83/32", "2400:6180:10:200::56a0:b000/128", "2400:6180:10:200::56a0:c000/128", "2400:6180:10:200::56a0:e000/128", "2400:6180:100:d0::94b6:4001/128", "2400:6180:100:d0::94b6:5001/128", "2400:6180:100:d0::94b6:7001/128", "2406:da14:94d:8601:9d0d:7754:bedf:e4f5/128", "2406:da14:94d:8601:b325:ff58:2bba:7934/128", "2406:da14:94d:8601:db4b:c5ac:2cbe:9a79/128", "2406:da1c:9c8:dc02:7ae1:f2ea:ab91:2fde/128", "2406:da1c:9c8:dc02:7db9:f38b:7b9f:402e/128", "2406:da1c:9c8:dc02:82b2:f0fd:ee96:579/128", "2600:1f16:775:3a00:ac3:c5eb:7081:942e/128", "2600:1f16:775:3a00:37bf:6026:e54a:f03a/128", "2600:1f16:775:3a00:3f24:5bb0:95d7:5a6b/128", "2600:1f16:775:3a00:8c2c:2ba6:778f:5be5/128", "2600:1f16:775:3a00:91ac:3120:ff38:92b5/128", "2600:1f16:775:3a00:dbbe:36b0:3c45:da32/128", "2600:1f18:179:f900:71:af9a:ade7:d772/128", "2600:1f18:179:f900:2406:9399:4ae6:c5d3/128", "2600:1f18:179:f900:4696:7729:7bb3:f52f/128", "2600:1f18:179:f900:4b7d:d1cc:2d10:211/128", "2600:1f18:179:f900:5c68:91b6:5d75:5d7/128", "2600:1f18:179:f900:e8dd:eed1:a6c:183b/128", "2604:a880:800:14:0:1:68ba:d000/128", "2604:a880:800:14:0:1:68ba:e000/128", "2604:a880:800:14:0:1:68bb:0/128", "2604:a880:800:14:0:1:68bb:1000/128", "2604:a880:800:14:0:1:68bb:3000/128", "2604:a880:800:14:0:1:68bb:4000/128", "2604:a880:800:14:0:1:68bb:5000/128", "2604:a880:800:14:0:1:68bb:6000/128", "2604:a880:800:14:0:1:68bb:7000/128", "2604:a880:800:14:0:1:68bb:a000/128", "2604:a880:800:14:0:1:68bb:b000/128", "2604:a880:800:14:0:1:68bb:c000/128", "2604:a880:800:14:0:1:68bb:d000/128", "2604:a880:800:14:0:1:68bb:e000/128", "2604:a880:800:14:0:1:68bb:f000/128", "2607:ff68:107::4/128", "2607:ff68:107::14/128", "2607:ff68:107::33/128", "2607:ff68:107::48/127", "2607:ff68:107::50/125", "2607:ff68:107::58/127", "2607:ff68:107::60/128", "2a01:4f8:c0c:83fa::1/128", "2a01:4f8:c17:42e4::1/128", "2a01:4f8:c2c:9fc6::1/128", "2a01:4f8:c2c:beae::1/128", "2a01:4f8:1c1a:3d53::1/128", "2a01:4f8:1c1b:4ef4::1/128", "2a01:4f8:1c1b:5b5a::1/128", "2a01:4f8:1c1b:7ecc::1/128", "2a01:4f8:1c1c:11aa::1/128", "2a01:4f8:1c1c:5353::1/128", "2a01:4f8:1c1c:7240::1/128", "2a01:4f8:1c1c:a98a::1/128", "2a01:4f8:c012:c60e::1/128", "2a01:4f8:c013:c18::1/128", "2a01:4f8:c013:34c0::1/128", "2a01:4f8:c013:3b0f::1/128", "2a01:4f8:c013:3c52::1/128", "2a01:4f8:c013:3c53::1/128", "2a01:4f8:c013:3c54::1/128", "2a01:4f8:c013:3c55::1/128", "2a01:4f8:c013:3c56::1/128", "2a01:4ff:f0:bfd::1/128", "2a01:4ff:f0:2219::1/128", "2a01:4ff:f0:3e03::1/128", "2a01:4ff:f0:5f80::1/128", "2a01:4ff:f0:7fad::1/128", "2a01:4ff:f0:9c5f::1/128", "2a01:4ff:f0:b2f2::1/128", "2a01:4ff:f0:b6f1::1/128", "2a01:4ff:f0:d283::1/128", "2a01:4ff:f0:d3cd::1/128", "2a01:4ff:f0:e516::1/128", "2a01:4ff:f0:e9cf::1/128", "2a01:4ff:f0:eccb::1/128", "2a01:4ff:f0:efd1::1/128", "2a01:4ff:f0:fdc7::1/128", "2a01:4ff:2f0:193c::1/128", "2a01:4ff:2f0:27de::1/128", "2a01:4ff:2f0:3b3a::1/128", "2a03:b0c0:2:f0::bd91:f001/128", "2a03:b0c0:2:f0::bd92:1/128", "2a03:b0c0:2:f0::bd92:1001/128", "2a03:b0c0:2:f0::bd92:2001/128", "2a03:b0c0:2:f0::bd92:4001/128", "2a03:b0c0:2:f0::bd92:5001/128", "2a03:b0c0:2:f0::bd92:6001/128", "2a03:b0c0:2:f0::bd92:7001/128", "2a03:b0c0:2:f0::bd92:8001/128", "2a03:b0c0:2:f0::bd92:9001/128", "2a03:b0c0:2:f0::bd92:a001/128", "2a03:b0c0:2:f0::bd92:b001/128", "2a03:b0c0:2:f0::bd92:c001/128", "2a03:b0c0:2:f0::bd92:e001/128", "2a03:b0c0:2:f0::bd92:f001/128", "2a05:d014:1815:3400:6d:9235:c1c0:96ad/128", "2a05:d014:1815:3400:654f:bd37:724c:212b/128", "2a05:d014:1815:3400:90b4:4ef9:5631:b170/128", "2a05:d014:1815:3400:9779:d8e9:100a:9642/128", "2a05:d014:1815:3400:af29:e95e:64ff:df81/128", "2a05:d014:1815:3400:c7d6:f7f3:6cc1:30d1/128", "2a05:d014:1815:3400:d784:e5dd:8e0:67cb/128", ] ================================================ FILE: decaymap/decaymap.go ================================================ package decaymap import ( "sync" "time" ) func Zilch[T any]() T { var zero T return zero } // Impl is a lazy key->value map. It's a wrapper around a map and a mutex. If values exceed their time-to-live, they are pruned at Get time. type Impl[K comparable, V any] struct { data map[K]decayMapEntry[V] // deleteCh receives decay-deletion requests from readers. deleteCh chan deleteReq[K] // stopCh stops the background cleanup worker. stopCh chan struct{} wg sync.WaitGroup lock sync.RWMutex } type decayMapEntry[V any] struct { Value V expiry time.Time } // deleteReq is a request to remove a key if its expiry timestamp still matches // the observed one. This prevents racing with concurrent Set updates. type deleteReq[K comparable] struct { key K expiry time.Time } // New creates a new DecayMap of key type K and value type V. // // Key types must be comparable to work with maps. func New[K comparable, V any]() *Impl[K, V] { m := &Impl[K, V]{ data: make(map[K]decayMapEntry[V]), deleteCh: make(chan deleteReq[K], 1024), stopCh: make(chan struct{}), } m.wg.Add(1) go m.cleanupWorker() return m } // expire forcibly expires a key by setting its time-to-live one second in the past. func (m *Impl[K, V]) expire(key K) bool { // Use a single write lock to avoid RUnlock->Lock convoy. m.lock.Lock() defer m.lock.Unlock() val, ok := m.data[key] if !ok { return false } val.expiry = time.Now().Add(-1 * time.Second) m.data[key] = val return true } // Delete a value from the DecayMap by key. // // If the value does not exist, return false. Return true after // deletion. func (m *Impl[K, V]) Delete(key K) bool { // Use a single write lock to avoid RUnlock->Lock convoy. m.lock.Lock() defer m.lock.Unlock() _, ok := m.data[key] if ok { delete(m.data, key) } return ok } // Get gets a value from the DecayMap by key. // // If a value has expired, forcibly delete it if it was not updated. func (m *Impl[K, V]) Get(key K) (V, bool) { m.lock.RLock() value, ok := m.data[key] m.lock.RUnlock() if !ok { return Zilch[V](), false } if time.Now().After(value.expiry) { // Defer decay deletion to the background worker to avoid convoy. select { case m.deleteCh <- deleteReq[K]{key: key, expiry: value.expiry}: default: // Channel full: drop request; a future Cleanup() or Get will retry. } return Zilch[V](), false } return value.Value, true } // Set sets a key value pair in the map. func (m *Impl[K, V]) Set(key K, value V, ttl time.Duration) { m.lock.Lock() defer m.lock.Unlock() m.data[key] = decayMapEntry[V]{ Value: value, expiry: time.Now().Add(ttl), } } // Cleanup removes all expired entries from the DecayMap. func (m *Impl[K, V]) Cleanup() { m.lock.Lock() defer m.lock.Unlock() now := time.Now() for key, entry := range m.data { if now.After(entry.expiry) { delete(m.data, key) } } } // Len returns the number of entries in the DecayMap. func (m *Impl[K, V]) Len() int { m.lock.RLock() defer m.lock.RUnlock() return len(m.data) } // Close stops the background cleanup worker. It's optional to call; maps live // for the process lifetime in many cases. Call in tests or when you know you no // longer need the map to avoid goroutine leaks. func (m *Impl[K, V]) Close() { close(m.stopCh) m.wg.Wait() } // cleanupWorker batches decay deletions to minimize lock contention. func (m *Impl[K, V]) cleanupWorker() { defer m.wg.Done() batch := make([]deleteReq[K], 0, 64) ticker := time.NewTicker(500 * time.Millisecond) defer ticker.Stop() flush := func() { if len(batch) == 0 { return } m.applyDeletes(batch) // reset batch without reallocating batch = batch[:0] } for { select { case req := <-m.deleteCh: batch = append(batch, req) case <-ticker.C: flush() case <-m.stopCh: // Drain any remaining requests then exit for { select { case req := <-m.deleteCh: batch = append(batch, req) default: flush() return } } } } } func (m *Impl[K, V]) applyDeletes(batch []deleteReq[K]) { now := time.Now() m.lock.Lock() for _, req := range batch { entry, ok := m.data[req.key] if !ok { continue } // Only delete if the expiry is unchanged and already past. if entry.expiry.Equal(req.expiry) && now.After(entry.expiry) { delete(m.data, req.key) } } m.lock.Unlock() } ================================================ FILE: decaymap/decaymap_test.go ================================================ package decaymap import ( "testing" "time" ) func TestImpl(t *testing.T) { dm := New[string, string]() t.Cleanup(dm.Close) dm.Set("test", "hi", 5*time.Minute) val, ok := dm.Get("test") if !ok { t.Error("somehow the test key was not set") } if val != "hi" { t.Errorf("wanted value %q, got: %q", "hi", val) } ok = dm.expire("test") if !ok { t.Error("somehow could not force-expire the test key") } _, ok = dm.Get("test") if ok { t.Error("got value even though it was supposed to be expired") } // Deletion of expired entries after Get is deferred to a background worker. // Assert it eventually disappears from the map. deadline := time.Now().Add(700 * time.Millisecond) for time.Now().Before(deadline) { if dm.Len() == 0 { break } time.Sleep(5 * time.Millisecond) } if dm.Len() != 0 { t.Fatalf("expected background cleanup to remove expired key; len=%d", dm.Len()) } } func TestCleanup(t *testing.T) { dm := New[string, string]() t.Cleanup(dm.Close) dm.Set("test1", "hi1", 1*time.Second) dm.Set("test2", "hi2", 2*time.Second) dm.Set("test3", "hi3", 3*time.Second) dm.expire("test1") // Force expire test1 dm.expire("test2") // Force expire test2 dm.Cleanup() finalLen := dm.Len() // Get the length after cleanup if finalLen != 1 { // "test3" should be the only one left t.Errorf("Cleanup failed to remove expired entries. Expected length 1, got %d", finalLen) } if _, ok := dm.Get("test1"); ok { // Verify Get still behaves correctly after Cleanup t.Error("test1 should not be found after cleanup") } if _, ok := dm.Get("test2"); ok { t.Error("test2 should not be found after cleanup") } if val, ok := dm.Get("test3"); !ok || val != "hi3" { t.Error("test3 should still be found after cleanup") } } ================================================ FILE: docs/.dockerignore ================================================ # Dependencies /node_modules # Production /build # Generated files .docusaurus .cache-loader # Misc .DS_Store .env.local .env.development.local .env.test.local .env.production.local npm-debug.log* yarn-debug.log* yarn-error.log* ================================================ FILE: docs/.gitignore ================================================ # Dependencies /node_modules # Production /build # Generated files .docusaurus .cache-loader # Misc .DS_Store .env.local .env.development.local .env.test.local .env.production.local npm-debug.log* yarn-debug.log* yarn-error.log* ================================================ FILE: docs/Dockerfile ================================================ FROM docker.io/library/node:lts AS build WORKDIR /app COPY . . RUN npm ci && npm run build FROM ghcr.io/xe/nginx-micro COPY --from=build /app/build /www COPY ./manifest/cfg/nginx/nginx.conf /conf LABEL org.opencontainers.image.source="https://github.com/TecharoHQ/anubis" ================================================ FILE: docs/README.md ================================================ # Website This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. ### Installation ``` $ yarn ``` ### Local Development ``` $ yarn start ``` This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. ### Build ``` $ yarn build ``` This command generates static content into the `build` directory and can be served using any static contents hosting service. ### Deployment Using SSH: ``` $ USE_SSH=true yarn deploy ``` Not using SSH: ``` $ GIT_USER=Last updated: June 2025
In common with other websites, log files are stored on the web server saving details such as the visitor's IP address, browser type, referring page and time of visit.
Cookies may be used to remember visitor preferences when interacting with the website.
Where registration is required, the visitor's email and a username will be stored on the server.
``` If this is insufficient, please [file an issue](https://github.com/TecharoHQ/anubis/issues/new) with a link to the relevant legislation for your country so that this feature can be amended and improved. ### No-JS Challenge One of the first issues in Anubis before it was moved to the [TecharoHQ org](https://github.com/TecharoHQ) was a request [to support challenging browsers without using JavaScript](https://github.com/Xe/x/issues/651). This is a pretty challenging thing to do without rethinking how Anubis works from a fundamentally low level, and with v1.20.0, [Anubis finally has support for running without client-side JavaScript](https://github.com/TecharoHQ/anubis/issues/95) thanks to the [Meta Refresh](/docs/admin/configuration/challenges/metarefresh) challenge. When Anubis decides it needs to send a challenge to your browser, it sends a challenge page. Historically, this challenge page is [an HTML template](https://github.com/TecharoHQ/anubis/blob/main/web/index.templ) that kicks off some JavaScript, reads the challenge information out of the page body, and then solves it as fast as possible in order to let users see the website they want to visit. In v1.20.0, Anubis has a challenge registry to hold [different client challenge implementations](/docs/admin/configuration/challenges/). This allows us to implement anything we want as long as it can render a page to show a challenge and then check if the result is correct. This is going to be used to implement a WebAssembly-based proof of work option (one that will be way more efficient than the existing browser JS version), but as a proof of concept I implemented a simple challenge using [HTML ``](https://en.wikipedia.org/wiki/Meta_refresh). In my testing, this has worked with every browser I have thrown it at (including CLI browsers, the browser embedded in emacs, etc.). The default configuration of Anubis does use the [meta refresh challenge](/docs/admin/configuration/challenges/metarefresh) for [clients with a very low suspicion](/docs/admin/configuration/thresholds), but by default clients will be sent an [easy proof of work challenge](/docs/admin/configuration/challenges/proof-of-work). If the false positive rate of this challenge turns out to not be very high in practice, the meta refresh challenge will be enabled by default for browsers in future versions of Anubis. ### `robots2policy` Anubis was created because crawler bots don't respect [`robots.txt` files](https://www.robotstxt.org/). Administrators have been working on refining and crafting their `robots.txt` files for years, and one common comment is that people don't know where to start crafting their own rules. Anubis now ships with a [`robots2policy` tool](/docs/admin/robots2policy) that lets you convert your `robots.txt` file to an Anubis policy. ```text robots2policy -input https://github.com/robots.txt ``` :::note If you installed Anubis from [an OS package](/docs/admin/native-install), you may need to run `anubis-robots2policy` instead of `robots2policy`. ::: We hope that this will help you get started with Anubis faster. We are working on a version of this that will run in the documentation via WebAssembly. ### Open Graph configuration is being moved to the policy file Anubis supports reading [Open Graph tags](/docs/admin/configuration/open-graph) from target services and returning them in challenge pages. This makes the right metadata show up when linking services protected by Anubis in chat applications or on social media. In order to test the migration of all of the configuration to the policy file, Open Graph configuration has been moved to the policy file. For more information, please read [the Open Graph configuration options](/docs/admin/configuration/open-graph#configuration-options). You can also set default Open Graph tags: ```yaml openGraph: enabled: true ttl: 24h # If set, return these opengraph values instead of looking them up with # the target service. # # Correlates to properties in https://ogp.me/ override: # og:title is required, it is the title of the website "og:title": "Techaro Anubis" "og:description": >- Anubis is a Web AI Firewall Utility that helps you fight the bots away so that you can maintain uptime at work! "description": >- Anubis is a Web AI Firewall Utility that helps you fight the bots away so that you can maintain uptime at work! ``` ## Improvements and optimizations One of the biggest improvements we've made in v1.20.0 is replacing [SHA-256 with xxhash](https://github.com/TecharoHQ/anubis/pull/676). Anubis uses hashes all over the place to help with identifying clients, matching against rules when allowing traffic through, in error messages sent to users, and more. Historically these have been done with [SHA-256](https://en.wikipedia.org/wiki/SHA-2), however this has been having a mild performance impact in real-world use. As a result, we now use [xxhash](https://xxhash.com/) when possible. This makes policy matching 3x faster in some scenarios and reduces memory usage across the board. Anubis now uses [bart](https://pkg.go.dev/github.com/gaissmai/bart) for doing IP address matching when you specify addresses in a `remote_address` check configuration or when you are matching against [advanced checks](/docs/admin/thoth). This uses the same kind of IP address routing configuration that your OS kernel does, making it very fast to query information about IP addresses. This makes IP address range matches anywhere from 3-14 times faster depending on the number of addresses it needs to match against. For more information and benchmarks, check out [@JasonLovesDoggo](https://github.com/JasonLovesDoggo)'s PR: [perf: replace cidranger with bart for significant performance improvements #675](https://github.com/TecharoHQ/anubis/pull/675). ## What's up next? v1.21.0 is already shaping up to be a massive improvement as Anubis adds [internationalization](https://en.wikipedia.org/wiki/Internationalization) support, allowing your users to see its messages in the language they're most comfortable with. So far Anubis supports the following languages: - English (Simplified and Traditional) - French - Portuguese (Brazil) - Spanish If you want to contribute translations, please [file an issue](https://github.com/TecharoHQ/anubis/issues/new) with your language of choice or submit a pull request to [the `lib/localization/locales` folder](https://github.com/TecharoHQ/anubis/tree/main/lib/localization/locales). We are about to introduce features to the translation stack, so you may want to hold off a hot minute, but we welcome any and all contributions to making Anubis useful to a global audience. Other things we plan to do: - Move configuration to the policy file - Support reloading the policy file at runtime without having to restart Anubis - Detecting if a client is "brand new" - A [Valkey](https://valkey.io/)-backed store for sharing information between instances of Anubis - Augmenting No-JS support in the paid product - TLS fingerprinting - Automated testing improvements in CI (FreeBSD CI support, better automated integration/functional testing, etc.) ## Conclusion I hope that these features let you get the same Anubis power you've come to know and love and increases the things you can do with it! I've been really excited to ship [thresholds](/docs/admin/configuration/thresholds) and the cloud-based services for Anubis. If you run into any problems, please [file an issue](https://github.com/TecharoHQ/anubis/issues/new). Otherwise, have a good day and get back to making your communities great. ================================================ FILE: docs/blog/2025-07-09-incident-report/index.mdx ================================================ --- slug: incident/TI-20250709-0001 title: "TI-20250709-0001: IPv4 traffic failures for Techaro services" authors: [xe] tags: [incident] image: ./window-portal.jpg ---  Techaro services were down for IPv4 traffic on July 9th, 2025. This blogpost is a report of what happened, what actions were taken to resolve the situation, and what actions are being done in the near future to prevent this problem. Enjoy this incident report! {/* truncate */} :::note In other companies, this kind of documentation would be kept internal. At Techaro, we believe that you deserve radical candor and the truth. As such, we are proving our lofty words with actions by publishing details about how things go wrong publicly. Everything past this point follows my standard incident root cause meeting template. ::: This incident report will focus on the services affected, timeline of what happened at which stage of the incident, where we got lucky, the root cause analysis, and what action items are being planned or taken to prevent this from happening in the future. ## Timeline All events take place on July 9th, 2025. | Time (UTC) | Description | | :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 12:32 | Uptime Kuma reports that another unrelated website on the same cluster was timing out. | | 12:33 | Uptime Kuma reports that Thoth's production endpoint is failing gRPC health checks. | | 12:35 | Investigation begins, [announcement made on Xe's Bluesky](https://bsky.app/profile/xeiaso.net/post/3ltjtdczpwc2x) due to the impact including their personal blog. | | 12:39 | `nginx-ingress` logs on the production cluster show IPv6 traffic but an abrupt cutoff in IPv4 traffic around 12:32 UTC. Ticket is opened with the hosting provider. | | 12:41 | IPv4 traffic resumes long enough for Uptime Kuma to report uptime, but then immediately fails again. | | 12:46 | IPv4 traffic resumes long enough for Uptime Kuma to report uptime, but then immediately fails again. (repeat instances of this have been scrubbed, but it happened about every 5-10 minutes) | | 12:48 | First reply from the hosting provider. | | 12:57 | Reply to hosting provider, ask to reboot the load balancer. | | 13:00 | Incident responder because busy due to a meeting under the belief that the downtime was out of their control and that uptime monitoring software would let them know if it came back up. | | 13:20 | Incident responder ended meeting and went back to monitoring downtime and preparing this document. | | 13:34 | IPv4 traffic starts to show up in the `ingress-nginx` logs. | | 13:35 | All services start to report healthy. Incident status changes to monitoring. | | 13:48 | Incident closed. | | 14:07 | Incident re-opened. Issues seem to be manifesting as BGP issues in the upstream provider. | | 14:10 | IPv4 traffic resumes and then stops. | | 14:18 | IPv4 traffic resumes again. Incident status changes to monitoring. | | 14:40 | Incident closed. | ## Services affected | Service name | User impact | | :-------------------------------------------------- | :----------------- | | [Anubis Docs](https://anubis.techaro.lol) (IPv4) | Connection timeout | | [Anubis Docs](https://anubis.techaro.lol) (IPv6) | None | | [Thoth](/docs/admin/thoth/) (IPv4) | Connection timeout | | [Thoth](/docs/admin/thoth/) (IPv6) | None | | Other websites colocated on the same cluster (IPv4) | Connection timeout | | Other websites colocated on the same cluster (IPv6) | None | ## Root cause analysis In simplify server management, Techaro runs a [Kubernetes](https://kubernetes.io/) cluster on [Vultr VKE](https://www.vultr.com/kubernetes/) (Vultr Kubernetes Engine). When you do this, Vultr needs to provision a [load balancer](https://docs.vultr.com/how-to-use-a-vultr-load-balancer-with-vke) to bridge the gap between the outside world and the Kubernetes world, kinda like this: ```mermaid --- title: Overall architecture --- flowchart LR UT(User Traffic) subgraph Provider Infrastructure LB[Load Balancer] end subgraph Kubernetes IN(ingress-nginx) TH(Thoth) AN(Anubis Docs) OS(Other sites) IN --> TH IN --> AN IN --> OS end UT --> LB --> IN ``` Techaro controls everything inside the Kubernetes side of that diagram. Anything else is out of our control. That load balancer is routed to the public internet via [Border Gateway Protocol (BGP)](https://en.wikipedia.org/wiki/Border_Gateway_Protocol). If there is an interruption with the BGP sessions in the upstream provider, this can manifest as things either not working or inconsistently working. This is made more difficult by the fact that the IPv4 and IPv6 internets are technically separate networks. With this in mind, it's very possible to have IPv4 traffic fail but not IPv6 traffic. The root cause is that the hosting provider we use for production services had flapping IPv4 BGP sessions in its Toronto region. When this happens all we can do is open a ticket and wait for it to come back up. ## Where we got lucky The Uptime Kuma instance that caught this incident runs on an IPv4-only network. If it was dual stack, this would not have been caught as quickly. The `ingress-nginx` logs print IP addresses of remote clients to the log feed. If this was not the case, it would be much more difficult to find this error. ## Action items - A single instance of downtime like this is not enough reason to move providers. Moving providers because of this is thus out of scope. - Techaro needs a status page hosted on a different cloud provider than is used for the production cluster (`TecharoHQ/TODO#6`). - Health checks for IPv4 and IPv6 traffic need to be created (`TecharoHQ/TODO#7`). - Remove the requirement for [Anubis to pass Thoth health checks before it can start if Thoth is enabled](https://github.com/TecharoHQ/anubis/pull/794). ================================================ FILE: docs/blog/2025-07-22-release-1.21.1/index.mdx ================================================ --- slug: release/v1.21.1 title: Anubis v1.21.1 is now available! authors: [xe] tags: [release] image: anubis-i18n.webp ---  Hey all! Recently we released [Anubis v1.21.1: Minfilia Warde (Echo 1)](https://github.com/TecharoHQ/anubis/releases/tag/v1.21.1). This is a fairly meaty release and like [last time](../2025-06-27-release-1.20.0/index.mdx) this blogpost will tell you what you need to know before you update. Kick back, get some popcorn and let's dig into this! {/* truncate */} In this release, Anubis becomes internationalized, gains the ability to use system load as input to issuing challenges, finally fixes the "invalid response" after "success" bug, and more! Please read these notes before upgrading as the changes are big enough that administrators should take action to ensure that the upgrade goes smoothly. This release is brought to you by [FreeCAD](https://www.freecad.org/), an open-source computer aided design tool that lets you design things for the real world. ## What's in this release? The biggest change is that the ["invalid response" after "success" bug](https://github.com/TecharoHQ/anubis/issues/564) is now finally fixed for good by totally rewriting how [Anubis' challenge issuance flow works](#challenge-flow-v2). This release gives Anubis the following features: - [Internationalization support](#internationalization), allowing Anubis to render its messages in the human language you speak. - Anubis now supports the [`missingHeader`](#missingHeader-function) function to assert the absence of headers in requests. - Anubis now has the ability to [store data persistently on the server](#persistent-data-storage). - Anubis can use [the system load average](#load-average-checks) as a factor to determine if it needs to filter traffic or not. - Add `COOKIE_SECURE` option to set the cookie [Secure flag](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Cookies#block_access_to_your_cookies) - Sets cookie defaults to use [SameSite: None](https://web.dev/articles/samesite-cookies-explained) - Allow [Common Crawl](https://commoncrawl.org/) by default so scrapers have less incentive to scrape - Add `/healthz` metrics route for use in platform-based health checks. - Start exposing JA4H fingerprints for later use in CEL expressions. And this release also fixes the following bugs: - [Challenge issuance has been totally rewritten](#challenge-flow-v2) to finally squash the infamous ["invalid response" after "success" bug](https://github.com/TecharoHQ/anubis/issues/564) for good. - In order to reduce confusion, the "Success" interstitial that shows up when you pass a proof of work challenge has been removed. - Don't block Anubis starting up if [Thoth](/docs/admin/thoth/) health checks fail. - The "Try again" button on the error page has been fixed. Previously it meant "try the solution again" instead of "try the challenge again". - In certain cases, a user could be stuck with a test cookie that is invalid, locking them out of the service for up to half an hour. This has been fixed with better validation of this case and clearing the cookie. - "Proof of work" has been removed from the branding due to some users having extremely negative connotations with it. We try to avoid introducing breaking changes as much as possible, but these are the changes that may be relevant for you as an administrator: - The [challenge format](#challenge-format-change) has been changed in order to account for [the new challenge issuance flow](#challenge-flow-v2). - The [systemd service `RuntimeDirectory` has been changed](#breaking-change-systemd-runtimedirectory-change). ### Sponsoring the project If you rely on Anubis to keep your website safe, please consider sponsoring the project on [GitHub Sponsors](https://github.com/sponsors/Xe) or [Patreon](https://patreon.com/cadey). Funding helps pay hosting bills and offset the time spent on making this project the best it can be. Every little bit helps and when enough money is raised, [I can make Anubis my full-time job](https://github.com/TecharoHQ/anubis/discussions/278). Once this pie chart is at 100%, I can start to reduce my hours at my day job as most of my needs will be met (pre-tax): ```mermaid pie title Funding update "GitHub Sponsors" : 29 "Patreon" : 14 "Remaining" : 56 ``` I am waiting to hear back from NLNet on if Anubis was selected for funding or not. Let's hope it is! ## New features ### Internationalization Anubis now supports localized responses. Locales can be added in [lib/localization/locales/](https://github.com/TecharoHQ/anubis/tree/main/lib/localization/locales). This release includes support for the following languages: - [Brazilian Portuguese](https://github.com/TecharoHQ/anubis/pull/726) - [Chinese (Simplified)](https://github.com/TecharoHQ/anubis/pull/774) - [Chinese (Traditional)](https://github.com/TecharoHQ/anubis/pull/759) - [Czech](https://github.com/TecharoHQ/anubis/pull/849) - English - [Estonian](https://github.com/TecharoHQ/anubis/pull/783) - [Filipino](https://github.com/TecharoHQ/anubis/pull/775) - [Finnish](https://github.com/TecharoHQ/anubis/pull/863) - [French](https://github.com/TecharoHQ/anubis/pull/716) - [German](https://github.com/TecharoHQ/anubis/pull/741) - [Japanese](https://github.com/TecharoHQ/anubis/pull/772) - [Icelandic](https://github.com/TecharoHQ/anubis/pull/780) - [Italian](https://github.com/TecharoHQ/anubis/pull/778) - [Norwegian](https://github.com/TecharoHQ/anubis/pull/855) - [Russian](https://github.com/TecharoHQ/anubis/pull/882) - [Spanish](https://github.com/TecharoHQ/anubis/pull/716) - [Turkish](https://github.com/TecharoHQ/anubis/pull/751) If facts or local regulations demand, you can set Anubis default language with the `FORCED_LANGUAGE` environment variable or the `--forced-language` command line argument: ```sh FORCED_LANGUAGE=de ``` ## Big ticket bug fixes These issues affect every user of Anubis. Administrators should upgrade Anubis as soon as possible to mitigate them. ### Fix event loop thrashing when solving a proof of work challenge Anubis has a progress bar so that users can have something moving while it works. This gives users more confidence that something is happening and that the website is not being malicious with CPU usage. However, the way it was implemented way back in [#87](https://github.com/TecharoHQ/anubis/pull/87) had a subtle bug: ```js if ( (nonce > oldNonce) | 1023 && // we've wrapped past 1024 (nonce >> 10) % threads === threadId // and it's our turn ) { postMessage(nonce); } ``` The logic here looks fine but is subtly wrong as was reported in [#877](https://github.com/TecharoHQ/anubis/issues/877) by the main Pale Moon developer. For context, `nonce` is a counter that increments by the worker count every loop. This is intended to spread the load between CPU cores as such: | Iteration | Worker ID | Nonce | | :-------- | :-------- | :---- | | 1 | 0 | 0 | | 1 | 1 | 1 | | 2 | 0 | 2 | | 2 | 1 | 3 | And so on. This makes the proof of work challenge as fast as it can possibly be so that Anubis quickly goes away and you can enjoy the service it is protecting. The incorrect part of this is the boolean logic, specifically the part with the bitwise or `|`. I think the intent was to use a logical or (`||`), but this had the effect of making the `postMessage` handler fire on every iteration. The intent of this snippet (as the comment clearly indicates) is to make sure that the main event loop is only updated with the worker status every 1024 iterations per worker. This had the opposite effect, causing a lot of messages to be sent from workers to the parent JavaScript context. This is bad for the event loop. Instead, I have ripped out that statement and replaced it with a much simpler increment only counter that fires every 1024 iterations. Additionally, only the first thread communicates back to the parent process. This does mean that in theory the other workers could be ahead of the first thread (posting a message out of a worker has a nonzero cost), but in practice I don't think this will be as much of an issue as the current behaviour is. The root cause of the stack exhaustion is likely the pressure caused by all of the postMessage futures piling up. Maybe the larger stack size in 64 bit environments is causing this to be fine there, maybe it's some combination of newer hardware in 64 bit systems making this not be as much of a problem due to it being able to handle events fast enough to keep up with the pressure. Either way, thanks much to [@wolfbeast](https://github.com/wolfbeast) and the Pale Moon community for finding this. This will make Anubis faster for everyone! ### Fix potential memory leak when discovering a solution In some cases, the parallel solution finder in Anubis could cause all of the worker promises to leak due to the fact the promises were being improperly terminated. A recursion bomb happens in the following scenario: 1. A worker sends a message indicating it found a solution to the proof of work challenge. 2. The `onmessage` handler for that worker calls `terminate()` 3. Inside `terminate()`, the parent process loops through all other workers and calls `w.terminate()` on them. 4. It's possible that terminating a worker could lead to the `onerror` event handler. 5. This would create a recursive loop of `onmessage` -> `terminate` -> `onerror` -> `terminate` -> `onerror` and so on. This infinite recursion quickly consumes all available stack space, but this has never been noticed in development because all of my computers have at least 64Gi of ram provisioned to them under the axiom paying for more ram is cheaper than paying in my time spent having to work around not having enough ram. Additionally, ia32 has a smaller base stack size, which means that they will run into this issue much sooner than users on other CPU architectures will. The fix adds a boolean `settled` flag to prevent termination from running more than once. ## Expressions features Anubis v1.21.1 adds additional [expressions](/docs/admin/configuration/expressions) features so that you can make your request matching even more granular. ### `missingHeader` function Anubis [expressions](/docs/admin/configuration/expressions) have [a few functions exposed](/docs/admin/configuration/expressions/#functions-exposed-to-anubis-expressions). Anubis v1.21.1 adds the `missingHeader` function, allowing you to assert the _absence_ of a header in requests. Let's say you're getting a lot of requests from clients that are pretending to be Google Chrome. Google Chrome sends a few signals to web servers, the main one of them is the [`Sec-Ch-Ua`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Sec-CH-UA). Sec-CH-UA is part of Google's [User Agent Client Hints](https://wicg.github.io/ua-client-hints/#sec-ch-ua) proposal, but it being present is a sign that the client is more likely Google Chrome than not. With the `missingHeader` function, you can write a rule to [add weight](/docs/admin/policies/#request-weight) to requests without `Sec-Ch-Ua` that claim to be Google Chrome. ```yaml # Adds weight clients that claim to be Google Chrome without setting Sec-Ch-Ua - name: old-chrome action: WEIGH weight: adjust: 10 expression: all: - userAgent.matches("Chrome/[1-9][0-9]?\\.0\\.0\\.0") - missingHeader(headers, "Sec-Ch-Ua") ``` When combined with [weight thresholds](/docs/admin/configuration/thresholds), this allows you to make requests that don't match the signature of Google Chrome more suspicious, which will make them have a more difficult challenge. ### Load average checks Anubis can dynamically take action [based on the system load average](/docs/admin/configuration/expressions/#using-the-system-load-average), allowing you to write rules like this: ```yaml ## System load based checks. # If the system is under high load for the last minute, add weight. - name: high-load-average action: WEIGH expression: load_1m >= 10.0 # make sure to end the load comparison in a .0 weight: adjust: 20 # If it is not for the last 15 minutes, remove weight. - name: low-load-average action: WEIGH expression: load_15m <= 4.0 # make sure to end the load comparison in a .0 weight: adjust: -10 ``` Something to keep in mind about system load average is that it is not aware of the number of cores the system has. If you have a 16 core system that has 16 processes running but none of them is hogging the CPU, then you will get a load average below 16. If you are in doubt, make your "high load" metric at least two times the number of CPU cores and your "low load" metric at least half of the number of CPU cores. For example: | Kind | Core count | Load threshold | | --------: | :--------- | :------------- | | high load | 4 | `8.0` | | low load | 4 | `2.0` | | high load | 16 | `32.0` | | low load | 16 | `8` | Also keep in mind that this does not account for other kinds of latency like I/O latency or downstream API response latency. A system can have its web applications unresponsive due to high latency from a MySQL server but still have that web application server report a load near or at zero. :::note This does not work if you are using Kubernetes. ::: When combined with [weight thresholds](/docs/admin/configuration/thresholds), this allows you to make incoming sessions "back off" while the server is under high load. ## Challenge flow v2 The main goal of Anubis is to weigh the risks of incoming requests in order to protect upstream resources against abusive clients like badly written scrapers. In order to separate "good" clients (like users wanting to learn from a website's content) from "bad" clients, Anubis issues [challenges](/docs/admin/configuration/challenges/). Previously the Anubis challenge flow looked like this: ```mermaid --- title: Old Anubis challenge flow --- flowchart LR user(User Browser) subgraph Anubis mIC{Challenge?} ic(Issue Challenge) rp(Proxy to service) mIC -->|User needs a challenge| ic mIC -->|User does not need a challenge| rp end target(Target Service) rp --> target user --> mIC ic -->|Pass a challenge| user target -->|Site data| users ``` In order to issue a challenge, Anubis generated a challenge string based on request metadata that we assumed wouldn't drastically change between requests, including but not limited to: - The client's User-Agent string. - The client [`Accept-Language` header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Accept-Language) value. - The client's IP address. Anubis also didn't store any information about challenges so that it can remain lightweight and handle the onslaught of requests from scrapers. The assumption was that the challenge string function was idempotent per client across time. What actually ended up happening was something like this: ```mermaid --- title: Anubis challenge string idempotency --- sequenceDiagram User->>+Anubis: GET /wiki/some-page Anubis->>+Make Challenge: Generate a challenge string Make Challenge->>-Anubis: Challenge string: taco salad Anubis->>-User: HTTP 401 solve a challenge User->>+Anubis: GET internal-api/pass-challenge Anubis->>+Make Challenge: Generate a challenge string Make Challenge->>-Anubis: Challenge string: burrito bar Anubis->>+User: Error: invalid response ``` Various attempts were made to fix this. All of these ended up failing. Many difficulties were discovered including but not limited to: - Removing `Accept-Language` from consideration because [Chrome randomizes the contents of `Accept-Language` to reduce fingerprinting](https://github.com/explainers-by-googlers/reduce-accept-language), a behaviour which [causes a lot of confusion](https://www.reddit.com/r/chrome/comments/nhpnez/google_chrome_is_randomly_switching_languages_on/) for users with multiple system languages selected. - [IPv6 privacy extensions](https://www.internetsociety.org/resources/deploy360/2014/privacy-extensions-for-ipv6-slaac/) mean that each request could be coming from a different IP address (at least one legitimate user in the wild has been observed to have a different IP address per TCP session across an entire `/48`). - Some [US mobile phone carriers make it too easy for your IP address to drastically change](https://news.ycombinator.com/item?id=32038215) without user input. - [Happy eyeballs](https://en.wikipedia.org/wiki/Happy_Eyeballs) means that some requests can come in over IPv4 and some requests can come in over IPv6. - To make things worse, you can't even assert that users are from the same [BGP autonomous system]({challenge}
{combinedData}
{renderHash()}