Integration guide

Public test records and safe examples for using bl.scott.ovh

Test records

Back to DNSBL

These records are permanent tests and are excluded from live listing totals.

QueryExpectedMeaning
2.0.0.127.bl.scott.ovh127.0.0.2User-reported spam
3.0.0.127.bl.scott.ovh127.0.0.3Open relay/proxy
4.0.0.127.bl.scott.ovh127.0.0.4Web/application attack
8.0.0.127.bl.scott.ovh127.0.0.8Repeat offender
2.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.bl.scott.ovh127.0.0.2IPv6 canary for 2001:db8::2
dig 8.0.0.127.bl.scott.ovh A +short dig 8.0.0.127.bl.scott.ovh TXT +short

IPv6 lookups

IPv6 addresses are expanded and reversed nibble by nibble in the query name. Query that owner for an A response. ScotNet uses the same 127.0.0.x return-code namespace for IPv4 and IPv6 offenders. The exact lookup format does not change when an address is covered by an escalated prefix.

IP6='2a00:da00:1800:87::1' OWNER=$(python3 - <<PY import ipaddress ip = ipaddress.ip_address("$IP6") print(".".join(reversed(ip.packed.hex()))) PY ) dig +short A "${OWNER}.bl.scott.ovh" dig +short TXT "${OWNER}.bl.scott.ovh"

Exact listings and prefix escalation

Exact-address listing is the default: IPv4 /32 and IPv6 /128. Prefix escalation is reserved for repeated abuse from multiple distinct addresses in the same network.

Evidence sourceFamilyDefaultEscalationEvidence window
Apache-securityIPv4Exact /32/24 after 6 distinct listed addresses7 days
Apache-securityIPv6Exact /128/64 after 3 distinct listed addresses7 days
ThreatmailIPv4Exact /32/24 after 6 distinct listed addresses14 days
ThreatmailIPv6Exact /128/64 after 3 distinct listed addresses14 days

Apache-security and Threatmail are evaluated independently: for example, three Apache addresses plus three Threatmail addresses do not satisfy either six-address IPv4 threshold. Escalated ranges use 127.0.0.8, expire after 30 quiet days, and are checked by the daily zone-consistency audit.

Consumers continue querying the exact IPv4 or IPv6 lookup owner. When a range is actively escalated, DNS answers that exact lookup from the prefix policy; no separate client-side range query is required.

Return codes and policy

Consumers should make decisions from the stable 127.0.0.x return code. Feed source, category and subcategory are explanatory metadata and may become more specific without changing the broad DNS classification.

CodeClassificationTypical evidenceDefault retention
127.0.0.2User-reported spamTrusted ARF/original-message evidence30 days
127.0.0.3Open relay/proxyVerified relay or proxy behaviour14 days
127.0.0.4Web/application attackApache exploit evidence or Threat Prevention alert30 days
127.0.0.8Repeat offenderRepeated independent abuse or qualifying prefix escalation90 days

Canonical feed labels

Sanitised history uses stable source labels so integrations do not need to handle older aliases such as web:post, spam or manual-miko.

Canonical sourceMeaningAutomatic listing policy
apache-securityLocal Apache security evaluationHigh-confidence exploit rules or repeated qualifying probes
threatmailapplication platform Threat Prevention alerts received through IMAPMedium/high/critical alerts according to configured threshold and confidence
user-spam-reportTrusted user-submitted ARF/original-message evidenceUsually private pending review until corroborated
manual-adminDirect operator listingOperator controlled
operator-reviewApproved private review candidateOperator controlled and audited

Threatmail taxonomy

Threatmail evidence is mapped to a broad category and subcategory without exposing email content, destination addresses, subjects or credentials. Current categories include command-and-control, malware, exploit, reconnaissance, credential-attack, denial-of-service, reputation, policy and other.

# Example sanitised history event { "source": "threatmail", "kind": "attack", "category": "reputation", "subcategory": "poor-reputation", "severity": "medium", "summary": "ET CINS Active Threat Intelligence Poor Reputation IP group 6" }

The category helps reporting and filtering; the original stable DNS return code remains authoritative for enforcement.

Public JSON check API

DNS remains authoritative. The JSON API is a rate-limited convenience endpoint for scripts and canary monitoring: 60 requests/minute and 500 requests/hour per client IP.

curl -sS 'https://bl.scott.ovh/api/check.php?ip=2a00:da00:1800:87::1' # Example fields: # listed, code, reason, family, scope, prefix, query_owner, fqdn # scope is "exact" for /32 or /128, or "prefix" when /24 or /64 escalation covers the address.

Public JSON history API

Sanitised per-IP history is served from an atomically published SQLite snapshot backed by a root-only SQLite/WAL primary, with public-history.json retained as an automatic compatibility fallback. It is limited to 10 requests/minute and 100 requests/hour per client IP. Invalid IP input is rejected before database or fallback-file access.

# Latest 10 retained events curl -sS 'https://bl.scott.ovh/api/history.php?ip=203.0.113.10&limit=10' # Fast indexed state/source summary with no event rows curl -sS 'https://bl.scott.ovh/api/history.php?ip=203.0.113.10&summary=1'

For automated or bulk DNSBL checking, use DNS rather than repeatedly polling the PHP APIs.

Postfix

Use with care on production mail. Start with reject_rbl_client only at a sensible point in your restriction chain.

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, reject_rbl_client bl.scott.ovh

Rspamd

# /etc/rspamd/local.d/rbl.conf rbls { scotnet_dnsbl { rbl = "bl.scott.ovh"; ipv4 = true; returncodes = { SCOTNET_SPAM = "127.0.0.2"; SCOTNET_PROXY = "127.0.0.3"; SCOTNET_WEB_ATTACK = "127.0.0.4"; SCOTNET_REPEAT = "127.0.0.8"; } } }

SpamAssassin

header RCVD_IN_SCOTNET_DNSBL eval:check_rbl('scotnet', 'bl.scott.ovh.') describe RCVD_IN_SCOTNET_DNSBL Listed in ScotNet DNSBL score RCVD_IN_SCOTNET_DNSBL 2.5

Exim

deny message = rejected: sender host is listed in ScotNet DNSBL dnslists = bl.scott.ovh

Fail2ban pre-check idea

For Fail2ban, treat ScotNet DNSBL as a signal, not as the only reason to ban. Query DNS first, then decide whether to shorten or lengthen ban time.

dig +short 4.3.2.1.bl.scott.ovh A # If a 127.0.0.x answer appears, the IP is already known to ScotNet.