Skip to content
GDPR compliant. Hosted in DE.
14-day free trial →
FirewallWAFMonitoring
Monitoring 11 min read 17 Apr 2026

Firewall Whitelist for Monitoring: Correctly Configure Fail2Ban, ModSecurity & WAFs

How to prevent Fail2Ban, ModSecurity or Cloudflare from misinterpreting your monitoring checks as attacks and producing silent outages.

X

XICTRAQ Team

XICTRAQ

FirewallFail2BanModSecurityWAFMonitoringSecurity
99.938%
WAF accuracy
28%
Traffic loss Dec 2025
5min
Auto-sync whitelist
WAF whitelist for monitoring nodes Request log (last 60 sec.) Source-IP UA / Target Action Rule 213.133.103.229xictraq-monitorALLOWwhitelist 89.167.106.0xictraq-monitorALLOWwhitelist 193.32.x.xcurl/7.88 — /wp-loginBLOCK949110 45.155.x.xscanner (ZGrab)BLOCK913100 2a01:4f8::2xictraq-monitorALLOWwhitelist 185.220.x.xTor-ExitBLOCKiprep 213.133.103.229xictraq-monitorALLOWwhitelist 141.98.x.xSSH brute-forceBLOCKfail2ban 89.167.106.0xictraq-monitorALLOWwhitelist 48 Requests · 36 Allow · 12 Block Auto-Whitelist (Live) xictraq-nodes node-de-1 node-fi 2a01:4f8:a0:935d::2 2a01:4f9:c012:730b::1 Source: /api/public/nodes Auto-sync: every 5 min Ø Response time <50ms False-Block-Rate 0% Without whitelist: monitoring outages, false alarms, silent outages · OWASP CRS 949110 (inbound-anomaly) blocks legit scanners · Fail2Ban rule "http-get-dos" catches fast polls as DDoS · Cloudflare rate limit: 1 req/sec default is too low · Spamhaus IP reputation can wrongly flag cloud IPs
Your website is up. Alerts stay silent. Then a customer reports the site has been down for hours. In the background your firewall wasn't fending off attackers — it was blocking your own uptime monitoring. This scenario is more common than many operators think: an OWASP CRS rule classifies the monitoring scanner as a bot, Fail2Ban bans the IP after three queries per second, Cloudflare activates a challenge the daemon can't solve. The result: silent outages without alerts, false positives on well-functioning sites, and an ops team spending hours chasing ghosts because the monitoring itself is the problem. This guide shows the most common sources of false blocking — Fail2Ban, ModSecurity with OWASP CRS, Cloudflare WAF and iptables — and how to configure your firewall so legitimate monitoring gets through without waving in real attacks.

Why firewalls block monitoring traffic

Modern Web Application Firewalls work with signature-based and behavior-based rules. A typical uptime check sends one HTTP request per minute from the same IP, with a non-browser User-Agent, no cookie and no referrer. To a WAF ruleset these are exactly the hallmarks of an automated scanner. The Cloudflare WAF achieved 99.938% accuracy on legitimate traffic detection in 2024 (openappsec WAF benchmark, 2024) — but the flip side is: one in roughly 1,600 legitimate requests gets blocked. With a 30-second monitoring interval from a single node that's statistically about 54 false blocks per day.

The consequences go beyond sporadic false alarms. On 5 December 2025, a misconfigured Cloudflare WAF rule caused a 25-minute, 28% outage of global HTTP traffic (Cloudflare Blog, December 2025). Zoom, LinkedIn and others were affected — along with the monitoring dashboards of Cloudflare customers that were supposed to flag the outage. A well-known monitoring service's EU monitoring region collapsed in August 2025 by 45% of its capacity, triggering cascades of false alarms for thousands of users (industry incident report, August 2025). The lesson: monitoring infrastructure must be explicitly whitelisted in firewall rules, otherwise it becomes a single-point-of-failure itself.

Typical symptoms of blocked monitoring

· Sudden uptime drop to 95–97% without any server-side incident · HTTP 403 or 429 errors in monitoring history while the browser loads fine · Response-time spikes landing on exactly 3,000 or 10,000 milliseconds (= challenge-page timeout) · Contradictory reports: customer support says 'up', monitor says 'down'

Fail2Ban: the most common misconfigurations

Fail2Ban reads web server logs and bans IPs that trigger certain patterns in a short time. The default apache-botsearch filter or the nginx-http-auth jail kicks in on failed authentication — but also on the typical monitoring workflow with 401 responses on protected paths. Custom http-get-dos filters that ban any IP with more than X requests per minute are especially problematic. A monitoring setup with 30-second interval hits 2,880 requests per day — well above typical thresholds.

The clean fix: add monitoring IPs to ignoreip in the Fail2Ban main config. This entry applies globally to all jails and fully exempts the monitoring nodes from surveillance.

# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 \
           213.133.103.229 \
           89.167.106.0 \
           2a01:4f8:a0:935d::2 \
           2a01:4f9:c012:730b::1
# After changes: systemctl restart fail2ban

Important: the IPs change when new monitoring nodes are added or removed. A statically stored list will inevitably drift. XICTRAQ publishes the current list as a JSON endpoint that can be polled automatically.

ModSecurity and OWASP Core Rule Set 4.x

ModSecurity with OWASP CRS is the standard WAF on many Apache and nginx installations. The Core Rule Set in 4.x was fundamentally overhauled after eight years and leans more toward blocking over alerting — the trade-off: higher security quality, lower detection quality (Linux Compatible, 2024). Translated: more legitimate traffic gets blocked along with threats. For monitoring tools three rules are particularly critical:

Rule IDPurposeRisk for monitoring
913100Scanner detectionClassifies every non-browser UA as a scanner
920350Host header missing/invalidMay fire on direct IP access
949110Inbound anomaly score exceededCatch-all: cumulative score > threshold → block

Instead of disabling individual rules — which reduces protection against real attackers — monitoring IPs should be selectively removed from the rule engine via IP match. The following exception rule runs in phase 1 and disables the entire rule-engine mode for the listed IPs:

# /etc/modsecurity/crs-setup.conf or conf.d/xictraq-whitelist.conf
SecRule REMOTE_ADDR \
    "@ipMatch 213.133.103.229,89.167.106.0,2a01:4f8:a0:935d::2,2a01:4f9:c012:730b::1" \
    "id:1000,phase:1,pass,nolog,ctl:ruleEngine=Off"

Rule ID 1000 is a free slot (OWASP CRS uses 900000–999999). For ISPConfig, Plesk or Cloudpanel setups there is typically a UI input for custom ModSecurity rules where this block can be stored without editing files.

Cloudflare WAF and rate limiting

Cloudflare sits between visitor and origin for many websites — every monitoring request hits the Cloudflare edge first. Managed Rules, Bot-Fight Mode, Rate Limits and IP Reputation all apply there. Under Security → WAF → Tools → IP Access Rules in the Cloudflare dashboard IPs can be set to 'Allow' — they then skip all subsequent security rules for the zone.

For more complex scenarios a custom rule is recommended that explicitly exempts the monitor IP range from rate limiting. The Cloudflare expression language allows multiple IPs in a bracketed list:

# Cloudflare WAF Custom Rule (Security → WAF → Custom rules → Create)
# Field:  IP Source Address
# Operator: is in
# Value: {213.133.103.229 89.167.106.0 2a01:4f8:a0:935d::2 2a01:4f9:c012:730b::1}
# Action: Skip → All remaining custom rules, Managed rules, Rate limiting
# Description: xictraq-monitoring-whitelist
Bot-Fight Mode and 'I'm Under Attack'

Both modes serve a JavaScript challenge that no regular HTTP-client monitoring can solve. If you enable these modes during an attack, your monitoring stays blind for the entire activation period. An IP allowlist bypasses both — the monitoring node gets direct access, real attackers get the challenge.

iptables, nginx and Apache — native configuration

Besides the big WAFs there are setups where the firewall acts at the network or web-server layer. Key configs:

# iptables / ip6tables — insert Allow rules BEFORE DROP
iptables -I INPUT -s 213.133.103.229 -j ACCEPT
iptables -I INPUT -s 89.167.106.0 -j ACCEPT
ip6tables -I INPUT -s 2a01:4f8:a0:935d::2 -j ACCEPT
ip6tables -I INPUT -s 2a01:4f9:c012:730b::1 -j ACCEPT
# Persist with: netfilter-persistent save

For nginx a variable is recommended that sets different rate-limit keys depending on source IP — legitimate monitors run without limit, everyone else hits the standard cap:

# /etc/nginx/conf.d/xictraq-whitelist.conf
geo $xictraq_node {
    default 0;
    213.133.103.229 1;
    89.167.106.0 1;
    2a01:4f8:a0:935d::2 1;
    2a01:4f9:c012:730b::1 1;
}
map $xictraq_node $limit_req_key {
    0 $binary_remote_addr;
    1 "";
}
limit_req_zone $limit_req_key zone=default:10m rate=10r/s;

Apache allows IP allow lists via <RequireAll> blocks in the vhost or .htaccess. Important: order matters — Require all granted must come before the IP entries, otherwise only the allowlist passes.

Automated whitelist maintenance with the XICTRAQ endpoint

Every manual whitelist becomes stale the moment new monitoring nodes arrive. At XICTRAQ the check-node pool grows dynamically: currently three distributed EU nodes (DE + FI). Instead of broadcasting an IP list via email whenever a node rolls out, the public endpoint /api/public/nodes publishes the current list as JSON. Any firewall admin can poll it every 5 minutes via cron and regenerate the firewall config.

A minimal Fail2Ban example — the cron generates the ignoreip line in a separate file that Fail2Ban loads via include. When a new node arrives, the line is added within 5 minutes with zero admin effort:

#!/bin/bash
# /usr/local/bin/sync-xictraq-whitelist.sh
NODES=$(curl -s https://api.xictraq.com/api/public/nodes \
        | jq -r '.nodes[] | (.ipv4[], .ipv6[])' | tr '\n' ' ')
cat > /etc/fail2ban/jail.d/99-xictraq.local <<EOF
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 $NODES
EOF
systemctl reload fail2ban

The same approach works for ModSecurity, iptables and nginx. The full copy-paste snippets including IPv4 and IPv6 lists are in the XICTRAQ docs under Firewall whitelist — generated live from the node pool just like the JSON endpoint.

What happens on a rule collision?

Firewall rules are processed sequentially. An Allow rule placed after a Block rule no longer takes effect. Common pitfalls: in Fail2Ban ignoreip entries are processed before all jail filters — that works. In iptables the ACCEPT rule must be before DROP rules, otherwise DROP fires first. In Cloudflare WAF custom rules execute in the order they were created — the whitelist rule should be at the top with action 'Skip → All remaining custom rules, Managed rules, Rate limiting'. In ModSecurity ID order drives processing — the whitelist rule should have a low ID (e.g. 1000) so it runs before CRS rules (900000+).

Validation before rollout

After every whitelist change, trigger a manual uptime scan via XICTRAQ. The scan shows the actual HTTP response from all active nodes. If any node returns 403 or 429 the Allow rule is either not active or in the wrong order.

Checklist for new setups

  1. Fetch current monitoring IPs: curl https://api.xictraq.com/api/public/nodes
  2. Set Fail2Ban ignoreip and run systemctl reload fail2ban
  3. Add ModSecurity exception rule with ID 1000 to CRS setup
  4. On Cloudflare: create Custom Rule with IP Source match + Skip action
  5. Insert iptables/ip6tables Allow rules before DROP rules and persist
  6. Configure nginx rate-limit bypass via geo and map
  7. Trigger manual scan in XICTRAQ dashboard and verify 200 response on all nodes
  8. Set up cron auto-sync every 5 minutes for automatic node expansion

Set up the monitoring whitelist now

A clean firewall configuration is the precondition for your monitoring to tell the truth. XICTRAQ publishes the current node list as a public JSON endpoint and the full documentation includes ready-to-paste snippets for every common firewall system. Start free and have your site checked from multiple regions every 30 seconds — without your WAF getting in the way.

Frequently asked

Which IPs do I need to whitelist?
Two nodes are currently active: Nuremberg (213.133.103.229 IPv4, 2a01:4f8:a0:935d::2 IPv6) and Helsinki (89.167.106.0 IPv4, 2a01:4f9:c012:730b::1 IPv6). The live list is at api.xictraq.com/api/public/nodes — refreshed every 5 minutes, new nodes included automatically.
Is the whitelist a security risk?
The risk is minimal as long as only the concrete monitoring IPs are allowed (no subnet). The whitelisted monitoring servers run the XICTRAQ daemon with a dedicated system user without login shell — no SSH, no sudo, no open service beyond outbound HTTP requests. Even if a node were compromised it could only send the requests to your site you already expect.
Why not just whitelist the User-Agent?
User-Agents are trivial to spoof. An attacker sets the same UA and bypasses the rule. IP-based whitelists are more robust because IP addresses are assigned by the carrier, not set by the sender. With reputable EU cloud providers the host and region can additionally be verified via WHOIS.
What happens when XICTRAQ adds new nodes?
New nodes are automatically added to the /api/public/nodes endpoint as soon as they register. A 5-minute cron sync on your firewall picks up the change and updates the whitelist. We also announce larger changes in advance via email to the account admin.
Does the whitelist work behind Cloudflare?
Yes. With Cloudflare the whitelist is a Custom Rule that runs before all Managed Rules and Rate Limits. The monitoring IPs bypass Bot-Fight Mode, challenge pages and DDoS protection — real attackers still hit all defenses. Full Cloudflare config is in the XICTRAQ docs.
My hosting panel (Plesk, cPanel) has no direct rule input — what to do?
Plesk and cPanel typically offer a module for Custom ModSecurity rules or direct access to config files. In Plesk: Extensions → ModSecurity → Custom rules; in cPanel: ModSecurity Tools → Rules List. Alternatively the whitelist rule can be written to a dedicated .conf file in conf.d that gets picked up on webserver reload.
Sources

This article is based on data from: (Cloudflare), (OWASP).

Related in XICTRAQ

Start in 60 seconds

Let XICTRAQ watch your website.

Permanent free plan available. No credit card, no installation, no hidden fees.