MTU Ninja
Vincent Bernat
Also available in
By date#
- Network lab with QEMU[1]
- Hacking the Go compiler to efficiently map IPv4 to IPv6[2]
- Self-hosted HTTP tunnels with SSH and nginx[3]
- Bot-free self-hosted analytics with GoatCounter on NixOS[4]
- Sidenotes with CSS anchor positioning[5]
- An interactive tour of the spanning tree protocol[6]
- A non-interactive tour of the spanning tree protocol[7]
- Building a Soviet Nail Factory: how KPIs killed efficiency[8]
- Blogging with LLMs as a non-native speaker[9]
- Sharding a routing table for lock-free reads in Go[10]
- CSS & vertical rhythm for text, images, and tables[11]
- Calculate “1/(40rods/hogshead) to L/100km” from your Zsh prompt[12]
- Automatic Prometheus metrics discovery with Docker labels[13]
- Fragments of an adolescent web[14]
- RAID 5 with mixed-capacity disks on Linux[15]
- Using eBPF to load-balance traffic across UDP sockets with Go[16]
- Compressing embedded files in Go[17]
- Akvorado 2.0[18]
- Offline PKI using 3 YubiKeys and an ARM single board computer[19]
- Auto-expanding aliases in Zsh[20]
- Customize Caddy's plugins with Nix[21]
- Fixing layout shifts caused by web fonts[22]
- Crafting endless AS paths in BGP[23]
- Why content providers need IPv6[24]
- Non-interactive SSH password authentication[25]
- DDoS detection and remediation with Akvorado and Flowspec[26]
- Building a SQL-like language to filter flows[27]
- Hacking the Geberit Sigma 70 flush plate[28]
- Fast and dynamic encoding of Protocol Buffers in Go[29]
- Managing infrastructure with Terraform, CDKTF, and NixOS[30]
- Akvorado: a flow collector, enricher, and visualizer[31]
- Broken commit diff on Cisco IOS XR[32]
- FRnOG #36: Akvorado[33]
- ClickHouse San Francisco Bay Area Meetup: Akvorado[34]
- Custom screen saver with XSecureLock[35]
- Automatic login with startx and systemd[36]
- Git as a source of truth for network automation[37]
- How to rsync files between two remote servers?[38]
- FRnOG #34: how we deployed a datacenter in one click[39]
- Short feedback on Cisco pyATS and Genie Parser[40]
- Switching to the i3 window manager[41]
- ThinkPad X1 Carbon (Gen 7): 2 years later[42]
- Upgrading my desktop PC[43]
- Serving WebP & AVIF images with Nginx[44]
- Jerikan+Ansible: a configuration management system for network[45]
- Transient prompt with Zsh[46]
- Zero-Touch Provisioning for Juniper[47]
- My collection of vintage PC cards[48]
- Running Isso on NixOS in a Docker container[49]
- Speeding up bgpq4 with IRRd in a container[50]
- Syncing RIPE, ARIN, and APNIC objects with a custom Ansible module[51]
- Keepalived and unicast over multiple interfaces[52]
- Syncing NetBox with a custom Ansible module[53]
- Syncing MySQL tables with a custom Ansible module[54]
- Syncing SSH keys on Cisco IOS XR with a custom Ansible module[55]
- Writing a custom Ansible module[56]
- Zero-Touch Provisioning for Cisco IOS[57]
- Safer SSH agent forwarding[58]
- Downgrading all Debian packages to a specific date[59]
- ThinkPad X1 Carbon 2014: 5 years later[60]
- Replacing Orange Livebox router with a Linux box[61]
- Self-hosted videos with HLS: subtitles[62]
- Zsh prompt with asynchronous Git status[63]
- Securing BGP on the host with origin validation[64]
- A Makefile for your Go project[65]
- Writing sustainable Python scripts[66]
- Pragmatic Debian packaging[67]
- HiDPI on dual 4K monitors with Linux[68]
- BGP LLGR: robust and reactive BGP sessions[69]
- Multi-tier load-balancing with Linux[70]
- A more privacy-friendly blog[71]
- OPL2 Audio Board: an AdLib sound card for Arduino[72]
- Self-hosted videos with HLS[73]
- Go @ Exoscale[74]
- Integration of a Go service with systemd: socket activation[75]
- Route-based VPN on Linux with WireGuard[76]
- Packaging an out-of-tree module for Debian with DKMS[77]
- OPL2LPT: an AdLib sound card for the parallel port[78]
- L3 routing to the hypervisor with BGP[79]
- (Micro)benchmarking Linux kernel functions[80]
- SwiNOG #32: BGP LLGR[81]
- Vienna Linux Meetup: are distributions still relevant?[82]
- Route-based IPsec VPN on Linux with strongSwan[83]
- Performance progression of IPv6 route lookup on Linux[84]
- IPv6 route lookup on Linux[85]
- Performance progression of IPv4 route lookup on Linux[86]
- IPv4 route lookup on Linux[87]
- SwiNOG #31: L3 routing to the hypervisor[88]
- VXLAN: BGP EVPN with FRR[89]
- VXLAN & Linux[90]
- Proper isolation of a Linux bridge[91]
- Netops with Emacs and Org mode[92]
- Integration of a Go service with systemd: readiness & liveness[93]
- Writing your own terminal emulator[94]
- A Makefile for your Go project (2017)[95]
- Build-time dependency patching for Android[96]
- Pragmatic Debian packaging (2016)[97]
- Testing network software with pytest and Linux namespaces[98]
- Django Meetup #35: pytest all the things![99]
- dotScale 2015: Docker Machine & Docker Swarm[100]
- Live patching QEMU for VENOM mitigation[101]
- Directory bookmarks with Zsh[102]
- Eudyptula Challenge: superfast Linux kernel booting[103]
- Staging a Netfilter ruleset in a network namespace[104]
- Intel Wireless 7260 as an access point[105]
- Replacing Swisscom router by a Linux box[106]
- Dashkiosk: manage dashboards on multiple displays[107]
- Local corporate APT repositories[108]
- EDNS client subnet support for BIND[109]
- Coping with the TCP TIME-WAIT state on busy Linux servers[110]
- Testing infrastructure with serverspec[111]
- Dailymotion: quick introduction to SystemTap[112]
- Snimpy: SNMP & Python[113]
- Automatic debugging packages in Debian[114]
- High availability with ExaBGP[115]
- Boilerplate for autotools-based C project[116]
- Packaging a daemon for macOS[117]
- lanĉo: a task launcher powered by cgroups[118]
- Contributing to open source: a new feature for RRDtool[119]
- Comptabilité d'une EURL avec GnuCash[120] (in French)
- lldpd 0.7.1[121]
- Network virtualization with VXLAN[122]
- Switching to the awesome window manager[123]
- GPG key transition statement 2012[124]
- Integration of Net-SNMP into an event loop[125]
- XBMC Eden on Debian Wheezy[126]
- Asynchronicity & Net-SNMP AgentX protocol[127]
- Recipes for extending Net-SNMP[128]
- Tuning Linux IPv4 route cache[129]
- TLS & Perfect Forward Secrecy[130]
- A quick look at Typekit[131]
- TLS computational DoS mitigation[132]
- TLS termination: stunnel, nginx & stud, round 2[133]
- Speeding up TLS: enabling session reuse[134]
- TLS termination: stunnel, nginx & stud[135]
- jchroot: chroot with more isolation[136]
- Plot benchmark results with Matplotlib[137]
- Rewriting my .zshrc[138]
- Dealing with missing locales on remote hosts[139]
- Alternate Android firmware on Samsung Galaxy S[140]
- Network lab: site to site VPN[141]
- The sorry state of Flash with 64-bit Debian[142]
- Anycast DNS[143]
- Mobile browsing & content optimization[144]
- Ready for World IPv6 day?[145]
- GNOME Power Manager without GNOME desktop[146]
- Providing a mobile version with CSS Media Queries[147]
- SNMP support for Keepalived[148]
- Network lab with User Mode Linux[149]
- Debian on ThinkPad Edge 11″[150]
- FVWM configuration[151]
- New website with Hyde[152]
- Migrating from Trac to GitHub[153]
- Python and C[154]
- Privilege separation in C[155]
- Python and networking[156]
- RMLL 2007 : Zabbix, un outil de supervision réseau[157] (in French)
- Théories de l'intrus pour la vérification des protocoles cryptographiques[158] (in French)
- Contre les brevets logiciels[159] (in French)
- 3 secondes ![160] (in French)
- Achats électroniques[161] (in French)
- Le manque d'efficacité des moteurs de recherche[162] (in French)
- Le e-commerce d'IBM[163] (in French)
- Coup de vent sur Netscape[164] (in French)
- Pratiques monopolistiques de Microsoft[165] (in French)
- Dix vœux pour 1998[166] (in French)
- Interview : Philippe Supera[167] (in French)
- France Télécom : baisse des tarifs[168] (in French)
- Reduce your France Télécom bill[169]
- Les spams[170] (in French)
- La guerre du push[171] (in French)
- Législatives et sondages[172] (in French)
- Rumeurs : virus par e-mail[173] (in French)
- La jungle des plugins[174] (in French)
- Le commerce électronique[175] (in French)
- La France en retard ?[176] (in French)
- Client d'Internet[177] (in French)
- Une page de pub[178] (in French)
- Le web multimédia[179] (in French)
- Les cookies[180] (in French)
- Microsoft Virtual Machine[181] (in French)
- Le Network Computer[182] (in French)

By category#
- https://vincent.bernat.ch/en/blog/2012-network-lab-qemu
- https://vincent.bernat.ch/en/blog/2026-go-netip-addrto6
- https://vincent.bernat.ch/en/blog/2026-http-over-ssh
- https://vincent.bernat.ch/en/blog/2026-goatcounter
- https://vincent.bernat.ch/en/blog/2026-css-sidenotes
- https://vincent.bernat.ch/en/blog/2026-spanning-tree
- https://vincent.bernat.ch/en/blog/2026-spanning-tree-video
- https://vincent.bernat.ch/en/blog/2026-kpi-goodhart
- https://vincent.bernat.ch/en/blog/2026-blogging-llm
- https://vincent.bernat.ch/en/blog/2026-akvorado-rib-sharding
- https://vincent.bernat.ch/en/blog/2026-css-vertical-rhythm
- https://vincent.bernat.ch/en/blog/2026-zsh-calculator
- https://vincent.bernat.ch/en/blog/2026-prometheus-metrics-discovery-docker-labels
- https://vincent.bernat.ch/en/blog/2026-old-web-articles
- https://vincent.bernat.ch/en/blog/2026-unequal-linux-raid
- https://vincent.bernat.ch/en/blog/2026-reuseport-ebpf-go
- https://vincent.bernat.ch/en/blog/2025-go-embed-compressed
- https://vincent.bernat.ch/en/blog/2025-akvorado-2.0
- https://vincent.bernat.ch/en/blog/2025-offline-pki-yubikeys
- https://vincent.bernat.ch/en/blog/2025-zsh-autoexpand-aliases
- https://vincent.bernat.ch/en/blog/2024-caddy-nix-plugins
- https://vincent.bernat.ch/en/blog/2024-cls-webfonts
- https://vincent.bernat.ch/en/blog/2024-bgp-endless-aspath
- https://vincent.bernat.ch/en/blog/2024-why-ipv6
- https://vincent.bernat.ch/en/blog/2023-sshpass-without-sshpass
- https://vincent.bernat.ch/en/blog/2023-akvorado-ddos-flowspec
- https://vincent.bernat.ch/en/blog/2023-sql-like-language-filter
- https://vincent.bernat.ch/en/blog/2023-geberit-sigma-70
- https://vincent.bernat.ch/en/blog/2023-dynamic-protobuf-golang
- https://vincent.bernat.ch/en/blog/2022-cdktf-nixos
- https://vincent.bernat.ch/en/blog/2022-akvorado-flow-collector
- https://vincent.bernat.ch/en/blog/2022-cisco-show-commit-changes-diff
- https://vincent.bernat.ch/en/blog/2022-frnog36-akvorado
- https://vincent.bernat.ch/en/blog/2022-clickhouse-meetup-akvorado
- https://vincent.bernat.ch/en/blog/2021-xsecurelock
- https://vincent.bernat.ch/en/blog/2021-startx-systemd
- https://vincent.bernat.ch/en/blog/2021-source-of-truth-network
- https://vincent.bernat.ch/en/blog/2021-rsync-ssh-two-remotes
- https://vincent.bernat.ch/en/blog/2021-frnog34-jerikan
- https://vincent.bernat.ch/en/blog/2021-pyats-genie-parser
- https://vincent.bernat.ch/en/blog/2021-i3-window-manager
- https://vincent.bernat.ch/en/blog/2021-thinkpad-x1-7th
- https://vincent.bernat.ch/en/blog/2021-desktop-pc-upgrade
- https://vincent.bernat.ch/en/blog/2021-webp-avif-nginx
- https://vincent.bernat.ch/en/blog/2021-network-jerikan-ansible
- https://vincent.bernat.ch/en/blog/2021-zsh-transient-prompt
- https://vincent.bernat.ch/en/blog/2020-dhcp-ztp-juniper
- https://vincent.bernat.ch/en/blog/2020-old-pc-cards
- https://vincent.bernat.ch/en/blog/2020-docker-nixos-isso
- https://vincent.bernat.ch/en/blog/2020-bgpq4-irrd-docker
- https://vincent.bernat.ch/en/blog/2020-syncing-ripe-arin-apnic-ansible
- https://vincent.bernat.ch/en/blog/2020-keepalived-unicast-vxlan
- https://vincent.bernat.ch/en/blog/2020-syncing-netbox-ansible
- https://vincent.bernat.ch/en/blog/2020-syncing-mysql-tables-ansible
- https://vincent.bernat.ch/en/blog/2020-syncing-ssh-keys-iosxr-ansible
- https://vincent.bernat.ch/en/blog/2020-custom-ansible-module
- https://vincent.bernat.ch/en/blog/2020-dhcp-cisco-ios
- https://vincent.bernat.ch/en/blog/2020-safer-ssh-agent-forwarding
- https://vincent.bernat.ch/en/blog/2020-downgrade-debian
- https://vincent.bernat.ch/en/blog/2020-thinkpad-x1-5-years
- https://vincent.bernat.ch/en/blog/2019-orange-livebox-linux
- https://vincent.bernat.ch/en/blog/2019-self-hosted-videos-subtitles
- https://vincent.bernat.ch/en/blog/2019-zsh-async-vcs-info
- https://vincent.bernat.ch/en/blog/2019-bgp-host-rpki
- https://vincent.bernat.ch/en/blog/2019-makefile-build-golang
- https://vincent.bernat.ch/en/blog/2019-sustainable-python-script
- https://vincent.bernat.ch/en/blog/2019-pragmatic-debian-packaging
- https://vincent.bernat.ch/en/blog/2018-4k-hidpi-dual-screen-linux
- https://vincent.bernat.ch/en/blog/2018-bgp-llgr
- https://vincent.bernat.ch/en/blog/2018-multi-tier-loadbalancer
- https://vincent.bernat.ch/en/blog/2018-more-privacy-blog
- https://vincent.bernat.ch/en/blog/2018-opl2-audio-board
- https://vincent.bernat.ch/en/blog/2018-self-hosted-videos
- https://vincent.bernat.ch/en/blog/2018-golang-exoscale
- https://vincent.bernat.ch/en/blog/2018-systemd-golang-socket-activation
- https://vincent.bernat.ch/en/blog/2018-route-based-vpn-wireguard
- https://vincent.bernat.ch/en/blog/2018-packaging-driver-debian-dkms
- https://vincent.bernat.ch/en/blog/2018-adlib-opl2lpt
- https://vincent.bernat.ch/en/blog/2018-l3-routing-hypervisor
- https://vincent.bernat.ch/en/blog/2017-linux-kernel-microbenchmark
- https://vincent.bernat.ch/en/blog/2017-swinog32-bgp-llgr
- https://vincent.bernat.ch/en/blog/2017-vienna-linux-distributions
- https://vincent.bernat.ch/en/blog/2017-route-based-vpn
- https://vincent.bernat.ch/en/blog/2017-performance-progression-ipv6-route-lookup-linux
- https://vincent.bernat.ch/en/blog/2017-ipv6-route-lookup-linux
- https://vincent.bernat.ch/en/blog/2017-performance-progression-ipv4-route-lookup-linux
- https://vincent.bernat.ch/en/blog/2017-ipv4-route-lookup-linux
- https://vincent.bernat.ch/en/blog/2017-swinog31-l3-hypervisor
- https://vincent.bernat.ch/en/blog/2017-vxlan-bgp-evpn
- https://vincent.bernat.ch/en/blog/2017-vxlan-linux
- https://vincent.bernat.ch/en/blog/2017-linux-bridge-isolation
- https://vincent.bernat.ch/en/blog/2017-netops-org-mode
- https://vincent.bernat.ch/en/blog/2017-systemd-golang
- https://vincent.bernat.ch/en/blog/2017-write-own-terminal
- https://vincent.bernat.ch/en/blog/2017-makefile-build-golang
- https://vincent.bernat.ch/en/blog/2016-android-build-time-patch
- https://vincent.bernat.ch/en/blog/2016-pragmatic-debian-packaging
- https://vincent.bernat.ch/en/blog/2016-testing-pytest-linux-namespaces
- https://vincent.bernat.ch/en/blog/2016-django-meetup-pytest-all-the-things
- https://vincent.bernat.ch/en/blog/2015-dotscale-docker-machine-swarm
- https://vincent.bernat.ch/en/blog/2015-hotfix-qemu-venom
- https://vincent.bernat.ch/en/blog/2015-zsh-directory-bookmarks
- https://vincent.bernat.ch/en/blog/2014-eudyptula-boot
- https://vincent.bernat.ch/en/blog/2014-netfilter-firewall-script
- https://vincent.bernat.ch/en/blog/2014-intel-7260-access-point
- https://vincent.bernat.ch/en/blog/2014-swisscom-router
- https://vincent.bernat.ch/en/blog/2014-dashkiosk
- https://vincent.bernat.ch/en/blog/2014-local-apt-repositories
- https://vincent.bernat.ch/en/blog/2014-bind-edns0-client-subnet
- https://vincent.bernat.ch/en/blog/2014-tcp-time-wait-state-linux
- https://vincent.bernat.ch/en/blog/2014-serverspec-test-infrastructure
- https://vincent.bernat.ch/en/blog/2013-dailymotion-systemtap-intro
- https://vincent.bernat.ch/en/blog/2013-snimpy
- https://vincent.bernat.ch/en/blog/2013-debugging-packages-in-debian
- https://vincent.bernat.ch/en/blog/2013-exabgp-highavailability
- https://vincent.bernat.ch/en/blog/2013-bootstrap.c
- https://vincent.bernat.ch/en/blog/2013-autoconf-osx-packaging
- https://vincent.bernat.ch/en/blog/2013-lanco
- https://vincent.bernat.ch/en/blog/2013-contribute-rrdtool
- https://vincent.bernat.ch/fr/blog/2013-gnucash-eurl
- https://vincent.bernat.ch/en/blog/2013-lldpd-0.7.1
- https://vincent.bernat.ch/en/blog/2012-multicast-vxlan
- https://vincent.bernat.ch/en/blog/2012-awesome-wm
- https://vincent.bernat.ch/en/blog/2012-gpg-transition-new-key
- https://vincent.bernat.ch/en/blog/2012-snmp-event-loop
- https://vincent.bernat.ch/en/blog/2012-xbmc-debian-wheezy
- https://vincent.bernat.ch/en/blog/2012-fixing-async-agentx
- https://vincent.bernat.ch/en/blog/2012-extending-netsnmp
- https://vincent.bernat.ch/en/blog/2011-ipv4-route-cache-linux
- https://vincent.bernat.ch/en/blog/2011-ssl-perfect-forward-secrecy
- https://vincent.bernat.ch/en/blog/2011-typekit-overview
- https://vincent.bernat.ch/en/blog/2011-ssl-dos-mitigation
- https://vincent.bernat.ch/en/blog/2011-ssl-benchmark-round2
- https://vincent.bernat.ch/en/blog/2011-ssl-session-reuse-rfc5077
- https://vincent.bernat.ch/en/blog/2011-ssl-benchmark
- https://vincent.bernat.ch/en/blog/2011-jchroot-isolation
- https://vincent.bernat.ch/en/blog/2011-plot-benchmark-results-matplotlib
- https://vincent.bernat.ch/en/blog/2011-zsh-zshrc
- https://vincent.bernat.ch/en/blog/2011-ssh-and-locales
- https://vincent.bernat.ch/en/blog/2011-android-samsung-galaxy-s
- https://vincent.bernat.ch/en/blog/2011-lab-site-to-site-vpn
- https://vincent.bernat.ch/en/blog/2011-flash-on-debian
- https://vincent.bernat.ch/en/blog/2011-dns-anycast
- https://vincent.bernat.ch/en/blog/2011-mobile-browsing-content-optimization
- https://vincent.bernat.ch/en/blog/2011-ipv6-day
- https://vincent.bernat.ch/en/blog/2011-gnome-power-manager
- https://vincent.bernat.ch/en/blog/2011-css-media-query
- https://vincent.bernat.ch/en/blog/2011-keepalived-snmp-ipv6
- https://vincent.bernat.ch/en/blog/2011-uml-network-lab
- https://vincent.bernat.ch/en/blog/2011-thinkpad-edge-11
- https://vincent.bernat.ch/en/blog/2011-fvwm-configuration
- https://vincent.bernat.ch/en/blog/2011-new-website-with-hyde
- https://vincent.bernat.ch/en/blog/2011-migrating-to-github
- https://vincent.bernat.ch/en/blog/2010-python-c
- https://vincent.bernat.ch/en/blog/2009-privilege-separation-c
- https://vincent.bernat.ch/en/blog/2009-python-networking
- https://vincent.bernat.ch/fr/blog/2007-rmll-zabbix
- https://vincent.bernat.ch/fr/blog/2006-these
- https://vincent.bernat.ch/fr/blog/2001-brevets-logiciels
- https://vincent.bernat.ch/fr/blog/1998-3-secondes
- https://vincent.bernat.ch/fr/blog/1998-achats-electroniques
- https://vincent.bernat.ch/fr/blog/1998-moteurs-de-recherche
- https://vincent.bernat.ch/fr/blog/1998-ecommerce-ibm
- https://vincent.bernat.ch/fr/blog/1998-netscape
- https://vincent.bernat.ch/fr/blog/1998-monopole-microsoft
- https://vincent.bernat.ch/fr/blog/1997-dix-voeux
- https://vincent.bernat.ch/fr/blog/1997-interview-philippe-supera
- https://vincent.bernat.ch/fr/blog/1997-nouveaux-tarifs-ft
- https://vincent.bernat.ch/en/blog/1997-reduce-bill-ft
- https://vincent.bernat.ch/fr/blog/1997-spams
- https://vincent.bernat.ch/fr/blog/1997-guerre-push
- https://vincent.bernat.ch/fr/blog/1997-legislatives-sondages
- https://vincent.bernat.ch/fr/blog/1997-virus-good-times
- https://vincent.bernat.ch/fr/blog/1997-web-plugins
- https://vincent.bernat.ch/fr/blog/1997-commerce-electronique
- https://vincent.bernat.ch/fr/blog/1997-france-retard-internet
- https://vincent.bernat.ch/fr/blog/1997-client-internet
- https://vincent.bernat.ch/fr/blog/1997-page-publicitaire
- https://vincent.bernat.ch/fr/blog/1997-web-multimedia
- https://vincent.bernat.ch/fr/blog/1997-cookies
- https://vincent.bernat.ch/fr/blog/1997-microsoft-virtual-machine
- https://vincent.bernat.ch/fr/blog/1996-network-computer