About this measurement

What is being measured, how, and why for engineers - made by Jan Žorž

All countriesHomeState of IPv6TopologyIXPsAboutipv6.si ↗ Sparky

What is this?

A daily-refreshed measurement of how every Italian autonomous system that announces IPv6 prefixes treats ICMPv6, RPKI, and ASPA. Each row in the summary carries small badges next to the operator name:

ICMPv6 / RFC 4890

RPKI ROA coverage (per IPv6 prefix)

ASPA (RFC 9774)

Address space (RIPE inet6num status)


What is this measurement?

This site is a continuously-updated, two-vantage-point measurement of how every Italian autonomous system that announces IPv6 prefixes treats ICMPv6 - specifically Echo Request/Reply (the ping6 primitive), Time-Exceeded (used by traceroute), Packet-Too-Big (the foundation of Path-MTU Discovery on IPv6), and Destination-Unreachable. ICMPv6 is not optional in IPv6 the way ICMP often is in IPv4 - PMTUD, Neighbor Discovery, and a number of error semantics depend on specific ICMPv6 types being permitted end-to-end. So testing how ITA networks actually treat ICMPv6 is genuinely useful, both for operators tuning their ACLs and for end-users diagnosing weird connectivity.

Why this matters (the engineering motivation)

RFC 4890 ("Recommendations for Filtering ICMPv6 Messages in Firewalls") is the authoritative guidance: drop the chatty multicast/discovery types if you must, but keep error reporting intact.

Vantage points

We measure from three distinct vantage points so the results show the destination AS' own behavior rather than a single transit's idiosyncrasy:

If a destination is open from one vantage but blocked from the others, that almost always points to a transit-level filter rather than a destination policy.

Discovering pingable targets

Every announced ITA IPv6 ASN is enumerated from RIPEstat. For each, we try to find up to 10 addresses inside the AS' own announced prefix that respond to ICMPv6 Echo. Discovery is run from a single host (the orchestrator); the resulting target list is then synced to every measurement vantage so all vantages probe the same hosts. Sources, accumulated (no early-exit) and ranked by priority:

  1. Curated names: well-known country operator domains (curated per country in config/<cc>.json) and direct host overrides.
  2. DNS NS / SOA / MX / SPF / DMARC on every plausible apex domain (curated, slug-derived, whois-scraped). NS records typically point at the operator's own authoritative name servers (which live inside their prefixes and answer ICMPv6 reliably). SOA gives the primary master. MX gives mail servers. v=spf1 TXT records are parsed for ip6: literals and for a: / mx: / include: references. DMARC rua / ruf URIs reveal report-handler domains. SPF in particular is a goldmine: operators routinely list every outbound mail relay's IPv6 there.
  3. Holder-derived service hostnames: a broad set of generic service prefixes (www., ns1..4., mx1..4., mail., smtp., vpn., gw., edge., core., pe., git., monitor., lg., …) on names derived from the AS holder.
  4. RIPE whois -B: pull e-mail:, notify:, and org: contacts from the AS object & its inline person/role/org objects.
  5. PeeringDB: website field from the network record; plus IX peer addresses from netixlan for ITA exchanges.
  6. RIPE Atlas: the public IPv6 addresses of Atlas probes located in ITA - verified to be inside an ITA ASN's announced prefix.
  7. IPv6 Hitlist Service (TUM Alcatraz): ~19 million globally responsive IPv6 addresses, streamed through a longest-prefix matcher against every ITA ASN's announced prefixes.
  8. Certificate Transparency (crt.sh), NTP Pool, Ookla speedtest server list: filtered to ITA-prefix matches.
  9. Path-hop promotion: any hop on a yarrp / traceroute path whose IP falls inside an ITA ASN's own prefix is re-tested with Echo and adopted as a router target. This usually surfaces internal PE / core routers that wouldn't be discoverable via DNS.

For each candidate, the AAAA must fall inside the ASN's announced prefix and ping6 must elicit an Echo Reply -- otherwise it's discarded. Per-AS targets are deduplicated by IP (highest-priority source wins) and the cap of 10 is enforced in 03_finalize. The full per-target list and per-vantage probe outcomes are shown on every per-ASN page.

For ASNs where every approach still finds no pingable target, that is itself a finding. The page distinguishes three cases based on how far our traceroutes get and whether any real IPv6 host was discoverable in the first place: transit only unreachable (traceroute never enters the AS), blocked in destination AS (traceroute enters and a real host was discovered, but every probed address is silent - typical for banks, ministries, air-traffic-control networks filtering at the AS edge), and no IPv6 implementation detected (traceroute enters the AS but no discovery source found any live host - typical for ASes that have an IPv6 allocation and announce it but have not yet deployed anything in it).

Source-code legend

Each target row in the per-ASN page carries a small badge identifying the discovery source. Hovering the badge shows the full description; quick reference:

CURcurated - hand-verified mapping for the largest country operators
NSDNS NS record on the org's apex domain (operator's own name servers)
SOADNS SOA primary nameserver
MXDNS MX record (mail-exchange host)
SPFSPF (TXT record): ip6: literal address, or hostname from a:/mx:/include:
DMARCDMARC report-handler URI from _dmarc TXT record
DRVholder-derived - guessed <service>.<holder-slug>.<tld> (www, ns1, mail, gw, vpn, edge, …)
ATLRIPE Atlas probe public IPv6 address
PDBPeeringDB netixlan / website
RDAPRDAP autnum entity vcard email/url (modern replacement for RIPE whois)
WHOISRIPE whois -B scrape (descr, email-domain, org)
CTCertificate Transparency log subject (crt.sh)
NTP<country>.pool.ntp.org member
OOKLAOokla Speedtest server in country
HITTUM Alcatraz IPv6 Hitlist (~19M responsive addresses)
RTRrouter - hop seen in this AS' own prefix on a prior traceroute or yarrp
PRBstatic prefix probe (::1, ::25, ::53, ::80, ::443, …)
SYNsynthetic prefix::1 fallback when no live host was found anywhere

What we measure per target

Active ICMPv6 Type 2 (Packet Too Big) acceptance test

For each target we additionally try to determine whether the destination network will accept and act on an inbound ICMPv6 Type 2 - the Packet Too Big message, abbreviated PTB below - per RFC 8201 PMTU Discovery validation. We run all four methods in parallel at every vantage and record a 4×N matrix of (method, vantage) verdicts; the per-AS page exposes that matrix in full so an operator can see whether two vantages disagree because of method-mismatch (each vantage's first-success method landed on different protocols) or because of an actually-asymmetric filter on the path. A row collapses to a single verdict when its methods agree; when methods inside a single vantage disagree the row is flagged as a measurement artifact rather than a real-world finding.

  1. icmp6-echo - the universal method. Send a 1500-byte Echo Request, observe the (whole) Echo Reply. Forge an ICMPv6 Type 2 (MTU=1280) toward the destination with the captured Reply embedded (RFC 4884 / RFC 8201 require the embedded packet to match a real flow). Send another 1500-byte Echo. If the next Reply arrives fragmented via the IPv6 Fragment Header, the destination cached PMTU=1280 and honored our Type 2. If the path PMTU is below 1500 B (so even the natural Echo Reply comes back fragmented and the test cannot tell whether shrinkage is our doing), the script automatically steps down to 1400 B / PTB 1200 and then 1300 B / PTB 1100, so a smaller path PMTU on one vantage doesn't force a fall-through to a TCP-based method.
  2. dns-tcp - for nameserver targets (port 53). Pipeline 8 queries (ANY ., NS ., DNSKEY com, NS net, ANY example.com, ANY isoc.org, …) on one TCP connection so the response stream is large enough; sniff segments; forge PTB; reconnect; compare segment sizes.
  3. tls - for HTTPS targets (port 443). Initiate a TLS handshake (cert chain is typically 2-8 KB); sniff segments; forge PTB; redo handshake; compare.
  4. http - the original test on port 80. HTTP GET that elicits a multi-KB response.

Each method reports one of honored, not_honored, partial, inconclusive, no_tcp, no_echo. The vantage-level summary is the most decisive verdict across the four methods (honored/not_honored dominate; inconclusive is broken only by another method on the same vantage). The forged Type 2 source IP is our own address, not a path router - per RFC 8201, implementations that validate the embedded packet against a recent flow accept this.

Per-hop PTB acceptance walk

For every AS where the per-vantage Type 2 verdicts disagree, we additionally run a per-hop walk from the local vantage: replay the same forged Type 2 / large-Echo dance, but targeted at every hop on the forward path in reverse order (deepest first). The first hop where the Echo Reply comes back at the full 1460-byte payload after our PTB is the first break point - the router that silently dropped (or didn't honour) the PTB. The walk lets operators move from "AS X is somewhere on the bad path" to "the break is at hop N, IP 2a…, AS Y, which is upstream of the destination". Walks that produce no clear break (every hop opaque to traceroute) are reported as inconclusive rather than fabricated.

Diagnostic interpretation (AI explainer)

Once the matrix and walk data are assembled, an LLM (Anthropic Claude) is asked to read the structured payload and write a short operator-facing explanation: which transit AS is the prime suspect, which specific hop the walk implicates, which side (destination ingress vs. transit hop) is the most actionable next step. The explainer never invents data - it only paraphrases the matrix + walk + path-divergence findings. Each explanation is cached per-AS and re- generated only when the disagreement signature changes (verdicts shift, divergence point moves, walk break-point moves), so a stable misconfiguration is summarised once and re-used across daily runs. Explanations appear as a "Diagnostic interpretation" callout on the per-AS page.

When the vantage points disagree

The same destination can produce different Type 2 verdicts from different vantage points. The per-ASN page tags every disagreement with one of these causes so you can tell apart "real-world finding" from "measurement artifact":

Classification

Each (AS, vantage) result lands in exactly one bucket:

How to read a row

RPKI & ASPA methodology

Resource Public Key Infrastructure (RFC 6480) cryptographically binds an IP prefix to its origin AS. ASPA - Autonomous System Provider Authorisation (RFC 9774, ratified 2024) - extends RPKI so a customer AS can additionally publish the list of upstream providers authorised to propagate its routes; routes that arrive via any other path are then ASPA-invalid.

For every announced IPv6 prefix and every AS we query a local Routinator at rpki-lju.6connect.com: GET /json returns the full set of Validated ROA Payloads (VRPs) and ASPA records. We classify each prefix locally as valid (covering VRP with matching origin and adequate maxLength), invalid (covering VRP exists but origin or maxLength mismatch), or not-found (no covering VRP). The aggregated state drives the RPKI badge on the main table and the per-prefix breakdown on each per-ASN page. ASPA records are surfaced as ASPA ✓ with the provider list on hover; ASes that have not yet published an ASPA record carry a yellow ASPA - badge.

Other pages

Limitations and honest disclaimers

Cadence and provenance

The pipeline runs daily at 12:00 Europe/Ljubljana via cron on the orchestrator (scripts/08_daily_run.sh) under a flock single-instance lock so a manual re-run cannot collide with the scheduled one. Each run keeps its raw per-vantage-point JSON in results/ so historical trends are derivable.

External services consulted: RIPEstat (ASN list, prefix announcements, RIS BGP visibility); RIPE whois port 43 plus RIPE RDAP (rdap.db.ripe.net) - we maintain the RDAP path as a futureproof replacement since RIPE NCC has signalled the deprecation of plaintext whois; PeeringDB; RIPE Atlas; TUM IPv6 Hitlist Service; crt.sh (Certificate Transparency); MIX-IT / NAMEX / MINAP / TOP-IX / VSIX / EQUINIX-MILAN / BGPX-ROME / NAMEX-BARI / PCIX / DECIX-PALERMO (IXP Manager / PeeringDB); Team Cymru bulk whois (hop AS attribution); local Routinator rpki-lju.6connect.com (RPKI ROA + ASPA validation).

All scripts and data live on the orchestrator; per-vantage probe results are mirrored from each remote vantage into the orchestrator's tree at the end of every daily run.

Built and maintained by Jan Žorž with assistance from Sparky. · Raw analyzed dataset: data.json.