Anycast measurement lab

This is a small lab that measures anycast catchments: which networks reach which site of an anycast service, over IPv4 and IPv6. I run it alone. My name is Stefan Böck, I live in Germany, and the lab has its own ASN, AS218833. From August to October 2026 the lab announced its own prefixes from up to 33 locations and served authoritative DNS for my own domains. I paused it on 2026-10-07 because the prefix and the servers cost money every month. The ASN and the IPv6 prefix stay. Measurements with RIPE Atlas continue, because they need no lab prefix.

If you got here from a firewall log or a reverse-DNS lookup: here is how to confirm it was me, and here is the opt-out. No reason required, no questions asked.

Operated by Portalix UG (haftungsbeschränkt), München, Germany, my own company. Until October 2026 the company also offered paid measurement services under anycast.dev. That offer is closed. anycast.dev now redirects here.

Lab notes

Sixteen measurement notes from August and September 2026. Every note carries the RIPE Atlas measurement IDs, so anyone can check the numbers. Among them: two drains of one site, 52 hours apart, where 85 and 88 % of the probes came back within 82 seconds and the same ten entries never did; how the TLDs, Germany and Europe delegate their DNS; and what one anycast site costs or saves per continent.

Bill Woodcock, Packet Clearing House, on Mastodon about one of the notes: “It's a great use of RIPE Atlas, since all the measurements are auditable and all the results can be independently verified.” Quoted with permission.

All notes: anycast.org/notes · RSS

Tools

whoserves

A small Python tool that measures catchments from the user's side, for any zone, with public RIPE Atlas measurements. It will plan the measurements, weight the probes by population, and report which site serves which region, what moves during maintenance, and which operator takes over when one fails. Status: placeholder 0.0.2 on PyPI, no measurement code yet. I write it by hand. Apache-2.0. Code: github.com/anycast-lab/whoserves · PyPI

anycast-agent

A small passive agent for nameservers from the lab period. It reads dnstap metadata and collects Verfploeter replies on the operator's own nodes. Query names and full client addresses never leave the server. It is a prototype, written mostly with a coding assistant, and it has been stopped on all lab nodes since 2026-10-30. The code stays public: github.com/anycast-lab/anycast-agent

Current status

Active probingnot started No measurement packets have been sent from lab prefixes. The lab has been paused since 2026-10-07.
ASNAS218833 (ANYCAST-LAB), assigned by RIPE NCC on 2026-08-28 via sponsoring LIR Via-Registry / Virtua Systems. Organisation: Portalix UG, abuse contact abuse@anycast.org.
IPv4 prefix94.249.165.0/24 was leased from GHOSTnet GmbH (AS12586) and announced from 2026-08-29 to 2026-10-28. The lease ended on 2026-10-28. This prefix is no longer mine.
IPv6 prefix2a03:5840:161::/48, announced from 2026-08-28 to 2026-10-28. RPKI ROA and route6 object registered for AS218833. Assigned to the lab, currently not announced.
What the prefixes carryUntil 2026-10-07: authoritative DNS for my own domains, dual-stack. Since then nothing. No customer traffic, no probing. If active probing starts, the source addresses will be listed here before the first packet leaves.
LocationsNone. Up to 33 locations were live between August and October 2026. The last node, Frankfurt, was shut down on 2026-10-28.
External measurementsI also run DNS measurements through RIPE Atlas. Those packets come from Atlas probes, not from lab prefixes, and are governed by RIPE Atlas' own rules.
Last updated2026-11-01

What my probes would do

I use the Verfploeter method (de Vries et al., IMC 2017; used in production at B-Root and for .nl): one lab node sends ICMP echo requests with the anycast address as the source; every lab node records which replies arrive there. The node that receives your reply is the node BGP routes you to. That is the whole measurement.

How to confirm it was me

  1. The source address is inside one of the prefixes listed under Status.
  2. dig -x <source address> returns a name ending in .anycast.org, for example probe-fra1.anycast.org. (Reverse DNS for the probe addresses is set before the first run; until then no probe traffic exists to check.)
  3. The RIPE database (whois <source address>) shows the lab ASN ANYCAST-LAB, organisation Portalix UG, and abuse@anycast.org as abuse contact.
  4. The ICMP payload contains the string anycast.org measurement - opt-out: https://anycast.org/#opt-out.

If a packet claims to be from me and fails these checks, it was not me. Please tell me at abuse@anycast.org; spoofed measurement traffic is something I want to know about.

Opt out

Send the prefixes or AS numbers you want excluded to optout@anycast.org, or use the form. I add them to the exclusion list within two business days, confirm by e-mail, and never probe them again. The list applies to every future run and to every lab node. No justification needed.

I keep the exclusion list private (it is a list of networks that asked not to be contacted). I verify that the requester is plausibly responsible for the prefix (RIPE/ARIN/APNIC contact, or mail from the network's domain) only to prevent someone from excluding networks they do not operate; I do not challenge the request itself.

What I store and publish

Why I do this

Anycast is how most of the Internet's DNS is delivered, and operators mostly cannot see where their traffic actually lands. The measurement methods are published, but a small operator, or a registry with an outsourced provider, has no tool to check who really serves their users and what happens when one site fails. The lab exists to build that in the open. The notes show the method on real zones, whoserves will make it a tool anyone can run, and the experiments on the lab's own prefixes are documented so others can learn from them.

References

Use of generative AI

Past use: the measurement pipeline behind the notes, the anycast-agent prototype, and the text of the notes and of this page were drafted with a coding assistant under my direction. The measurements, the Atlas measurement IDs and the numbers are my own and public, so every claim can be checked without trusting the text.

Present use: for whoserves the assistant is read-only. It may run tests and review code and text that I wrote. It does not write code, documentation or text for whoserves. The README of whoserves will say the same.

Contact

PersonStefan Böck, stefan@anycast.org
Abuseabuse@anycast.org (also the abuse-c in the RIPE database)
Opt-outoptout@anycast.org
Network operationsnoc@anycast.org
PeeringPeeringDB: AS218833 — open peering policy, no exchange presence yet