Stéphane Bortzmeyer

Based in Paris (France)




Likes on articles

About the author

I work at AFNIC (the registry of .fr domain names), in the R&D department, on, among other things, DNS, security, statistics.

• On Processing RIPE Atlas Results with jq by Stéphane Bortzmeyer

Alexandre Pion noticed a small bug: for the median too, we should exclude the null results.

• On Internet Stability in Times of Corona by Emile Aben

One may assume that, if some people delayed the changes, other people rushed in to adapt the networks to the increased load? Both behaviour may explain why the change rate is more or less the same?

• Reply to Chris Amin on RIS Live BGP Message Stream by Chris Amin

“Thanks, Stéphane! At some point I may add extra examples to the documentation. Is it okay if I include something based on your example?”

You're welcome to use this example as you see fit. A better version is available at

• On RIS Live BGP Message Stream by Chris Amin

Here is an asynchronous version of a Python client so you can do other things while waiting for updates. (In that case, we just display a timestamp.) #!/usr/bin/env python3 PERIOD = 5 RFC3339 = '%Y-%m-%dT%H:%M:%SZ' import sys import json import time import asyncio # import websockets class RISliveWebsocket(): def __init__(self, router, asn): self.router = router self.asn = asn async def __aenter__(self): self._conn = await websockets.connect("wss://") opening = json.dumps({"type": "ris_subscribe", "data": {"host": self.router, "path": self.asn}}) await self._conn.send(opening) print("Connected, %s sent" % opening) return self async def __aexit__(self, *args, **kwargs): print("Goodbye") pass async def send(self, message): await self._conn.send(message) async def receive(self): print("Trying to receive") return await self._conn.recv() async def tick(): while True: await asyncio.sleep(PERIOD) print("Waking up, it is %s" % time.strftime(RFC3339, time.gmtime(time.time()))) async def main(router, asn): sock = RISliveWebsocket(router, asn) async with sock as feed: while True: print(await feed.receive()) if __name__ == '__main__': if len(sys.argv) != 3: print("Usage: %s RIS-router ASn" % sys.argv[0], file=sys.stderr) sys.exit(1) try: loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait([main(sys.argv[1], sys.argv[2]), tick()])) except KeyboardInterrupt: pass # Does not call __aexit__?

• Reply to Arsen Stasic on DoH - It's DNS Jim, but not as we know it! by Sara Dickinson

“Stephane, Quad9 has also DoH ( )”

OK, they should just update the FAQ :-) Thanks for the info.

• On DoH - It's DNS Jim, but not as we know it! by Sara Dickinson

"CloudFlare, Google and Quad9 all offer DoH" As far as I know, only Cloudflare does it. Google Public DNS has an experimental DNS-over-HTTPS (proprietary, not DoH) service and Quad9 seems to have "only" DoT (see )

• On A Review of Blockchain Applicability to Internet Number Resources by Marco Hogewoning

Saying that automatic contracts ("smart contracts" is the marketing BS) cannot be changed ("these contracts are unmodifiable") is not strictly true. To quote an old saying "every problem in computer science can be solved with one more indirection". So, you can have a pointer to the current version of the code of the smart contract, and changing the code by adding a new version of the pointer. Of course, this adds complexities and security risks but it shows that there are ways to modify automatic contracts, for instance to follow a change in policies. The description of the "51 % attack" is very sketchy ("quickly spawning a large quantity of client nodes that participate in the consensus making"). In a real blockchain, techniques like proof-of-work and proof-of-stake prevent this trivial Sybil attack. But there is a subtler reason why the "51 % attack" is overhyped: it is easily detectable (the Bitcoin Core code, for instance, logs it). So, honest miners will see it. It will not be easy to recover from the attack (the honest miners will have to fork) but it cannot be stealthy.

• On ARTEMIS: Neutralising BGP Hijacking Within a Minute by Vasileios Kotronis

The link "real-time streaming capabilities" goes to a 404. I suspect the correct target is

• On Securing DNS Across all of my Devices with Pi-Hole + DNS-over-HTTPS + by Scott Helme

I love "curl | sudo bash" in an article about security :-) Seriously, it seems the article has a confusion between DoH, as currently being standardized at IETF (and deployed by Cloudflare on and the Google service which, unlike DoH, does not use the DNS wire format, but JSON, as shown in your example.

• On Creating RIPE Atlas One-off Measurements with Blaeu by Stéphane Bortzmeyer

The first package is for Gentoo :-)

Showing 52 comment(s)