12 lat ewolucji domowego routera na NetBSD - od ipf do pf, od bloku do XCP-NG

Czasami jedna komenda wywołuje lawinę nostalgii - uprecords
i cały świat Unixowy przeleciał mi przez pamięć.
# Uptime | System Boot up
----------------------------+---------------------------------------------------
1 166 days, 20:45:32 | NetBSD 7.1 Mon Mar 5 00:10:49 2018
2 152 days, 21:08:31 | NetBSD 7.0_STABLE Sat Jan 16 18:48:05 2016
3 129 days, 21:08:53 | NetBSD 9.3_STABLE Fri Jun 2 07:38:33 2023
4 124 days, 02:37:30 | NetBSD 9.2_STABLE Fri Apr 8 16:51:14 2022
5 118 days, 22:09:30 | NetBSD 9.0_STABLE Wed Oct 7 12:01:12 2020
6 111 days, 12:02:15 | NetBSD 10.0 Tue Jul 9 16:15:31 2024
7 102 days, 14:03:21 | NetBSD 6.1.4_PATCH Tue Jul 8 16:37:50 2014
8 81 days, 05:59:55 | NetBSD 6.1.4_PATCH Fri Apr 18 10:33:21 2014
9 80 days, 01:40:20 | NetBSD 6.1.5_PATCH Sat Jan 10 22:07:27 2015
10 75 days, 16:51:07 | NetBSD 8.0_STABLE Mon Mar 11 21:56:04 2019
----------------------------+---------------------------------------------------
-> 51 1 day , 12:06:09 | NetBSD 10.1_STABLE Wed Jul 9 02:24:30 2025
----------------------------+---------------------------------------------------
up 2990 days, 01:44:42 | since Sun Nov 25 23:59:36 2012
down 1619 days, 11:46:21 | since Sun Nov 25 23:59:36 2012
%up 64.867 | since Sun Nov 25 23:59:36 2012
Ponad 12 lat. 64.867% uptime. To nie jest rekord godny enterprise, ale to historia systemu, który ewoluował od routera dla bloku mieszkalnego do nowoczesnej maszyny wirtualnej na N100. Historia, która zaczęła się znacznie wcześniej...
Prehistoria - czasy pierwszego stałego IP na osiedlu
Zanim NetBSD zagościło na stałe jako router, byłem dumnym posiadaczem pierwszego łącza stałego ze stałym IP na osiedlu - dzięki TELE2. Kiedy sąsiedzi męczyli się z 0202122 i ciągłymi rozłączeniami co 2 godziny, ja już miałem swój kawałek prawdziwego internetu. Potem przyszedł DSL, też ze stałym IP. To były czasy!

NetBSD 1.5/1.6 - początki przygody
Moja historia z NetBSD zaczęła się od wersji 1.5, ale ledwo zdążyłem zainstalować system, a już wyszło 1.6. Oczywiście natychmiast reinstall - kto by chciał zostać w tyle?
To były czasy Pentium 2 z egzotycznymi kartami sieciowymi, które tylko NetBSD-current potrafił obsłużyć. Pamiętam te wieczory spędzone na kompilacji kernela, trzymanie kciuków żeby wykryło kartę 3Com albo dziwnego Realteka. Stabilizacja przyszła dopiero z serią 5.x - wtedy NetBSD zaczęło normalnie wspierać sprzęt konsumencki.

Era ipf - gdy NAT wymagał pustego pliku
NetBSD 1.6 i 2.0 to czasy ipf (IP Filter). Pamiętacie tę absurdalną zależność? Żeby działał NAT przez ipnat, musiałeś mieć plik /etc/ipf.conf
- choćby pusty!
# /etc/ipf.conf - musiał istnieć, inaczej ipnat nie działał
pass in all
pass out all
# /etc/ipnat.conf - tu była prawdziwa magia
map ex0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
To były też czasy udostępniania internetu w bloku. Kable ciągnięte po dachach, przez szyby wind, szachty wentylacyjne. NetBSD na starym PC jako router dla całego piętra. 512/128 kbit/s na 10 mieszkań - luksus!

479MB historii w katalogu /
Rzut oka na /
mojego routera to jak archeologiczne wykopaliska:
-rwxr-xr-x 1 root wheel 13M Oct 27 2012 netbsd-xen0-bezpf
-rwxr-xr-x 1 root wheel 14M Apr 18 2013 netbsd-xen0-old
-rwxr-xr-x 1 root wheel 14M May 26 2013 netbsd-xen0613
...
-rwxr-xr-x 1 root wheel 26M Oct 18 2019 netbsd90_BETA
-rwxr-xr-x 1 root wheel 24M Feb 3 2020 netbsd90_RC1
-rwxr-xr-x 1 root wheel 24M Feb 23 2020 netbsd90_RC2
-rwxr-xr-x 1 root wheel 7,5M Jan 17 09:30 netbsd10
Każdy kernel to zakładka w historii. netbsd-xen0-bezpf
z 2012? To eksperyment - czy router będzie szybszy bez pf? Różnice w rozmiarach? To nie przypadek:
- 13-26MB - kernele dla fizycznego sprzętu lub HVM
- 7-8MB - kernele PV dla DOMU lub DOM0
Analiza file
potwierdza:
$ file /netbsd-xen0-bezpf
/netbsd-xen0-bezpf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
statically linked, for NetBSD 6.0, with debug_info, not stripped
Ewolucja systemu - od ipf do pf, od fizycznego sprzętu do VM
NetBSD 2.0-5.x - stabilizacja i przejście na pf
- NetBSD 2.0 (2004) - ipf w pełnej krasie, ALTQ tylko przez przekompilowanie kernela
- NetBSD 3.0 (2005) - pf z OpenBSD wchodzi do gry jako moduł:
modload /usr/lkm/pf.o
- NetBSD 4.0 (2007) - pf można wkompilować w kernel, koniec z modułami
- NetBSD 5.0 (2009) - ALTQ zintegrowane z pf, prawdziwy QoS!
Przejście z ipf na pf to była rewolucja:
# Stare czasy ipf - zagmatwana składnia
pass in quick on ex0 proto tcp from any to any port = 22 flags S keep state
# Nowa era pf - czytelne i logiczne
pass in quick on $ext_if proto tcp to port ssh
Era fizycznego routera (2012-2018)
System wystartował 25 listopada 2012 na płycie ASUS E45M1-I DELUXE:
- AMD Dual-Core E-450
- 2x WD Red 2TB w RAID1 (raidframe)
- Port COM do monitorowania temperatury przez 1-wire
W cronie do dziś pozostały ślady:
#40 23 * * * raidctl -s raid0 | mail moj@mail.tld >/dev/null 2>&1
#*/2 * * * * /usr/home/cancer/temperatura/temperatura.sh >/dev/null 2>&1
Sam dodałem digitemp
do pkgsrc (https://pkgsrc.se/wip/digitemp). Monitoring temperatury przez 1-wire w 2015 roku!
Router jako hypervisor - era DOM0
Przez pewien czas router był nie tylko routerem - działał jako Xen DOM0 hostując kilka maszyn DOMU. Stąd duże kernele HVM w kolekcji. Router, firewall i hypervisor w jednym!
Home Assistant na NetBSD (2017)
W październiku 2017 router zyskał kolejną funkcję - smart home hub:
/.homeassistant # cat .HA_VERSION
0.55.0
To były czasy, gdy Home Assistant był projektem hobbystycznym. Działał na NetBSD bez problemu - Python to Python. Skończyło się, gdy projekt urósł i zaczął wymagać bibliotek niedostępnych w pkgsrc.
Wirtualizacja - od gospodarza do gościa (2018-obecnie)
Migracja na wirtualizację to było pełne koło:
- Fizyczny sprzęt z AMD E-450
- DOM0 na Supermicro z Intel Atom C2758
- DOMU pod Citrix Hypervisor, potem XCP-NG
- Obecnie VM na N100 pod XCP-NG
Chronologia wersji - śledząc uprecords
NetBSD 6.1.x (2014-2015)
7 102 days, 14:03:21 | NetBSD 6.1.4_PATCH Tue Jul 8 16:37:50 2014
8 81 days, 05:59:55 | NetBSD 6.1.4_PATCH Fri Apr 18 10:33:21 2014
9 80 days, 01:40:20 | NetBSD 6.1.5_PATCH Sat Jan 10 22:07:27 2015
Początek ery na fizycznym sprzęcie. System już z pf, żadnego ipf.
NetBSD 7.x (2016-2018)
2 152 days, 21:08:31 | NetBSD 7.0_STABLE Sat Jan 16 18:48:05 2016
1 166 days, 20:45:32 | NetBSD 7.1 Mon Mar 5 00:10:49 2018
Rekordowe 166 dni uptime! NetBSD 7 przyniosło lepsze SMP, wydajniejszy pf, stabilniejsze sterowniki.
NetBSD 8.x i 9.x (2019-2023)
10 75 days, 16:51:07 | NetBSD 8.0_STABLE Mon Mar 11 21:56:04 2019
5 118 days, 22:09:30 | NetBSD 9.0_STABLE Wed Oct 7 12:01:12 2020
4 124 days, 02:37:30 | NetBSD 9.2_STABLE Fri Apr 8 16:51:14 2022
3 129 days, 21:08:53 | NetBSD 9.3_STABLE Fri Jun 2 07:38:33 2023
Fascynująca sekwencja rozwoju NetBSD 9.0 w kernelach:
- netbsd90_BETA (26MB)
- netbsd90_RC1 (24MB)
- netbsd90_RC2 (24MB)
- netbsd90_STABLE (24MB)
NetBSD 10.x (2024-obecnie)
6 111 days, 12:02:15 | NetBSD 10.0 Tue Jul 9 16:15:31 2024
-> 51 1 day , 12:06:09 | NetBSD 10.1_STABLE Wed Jul 9 02:24:30 2025
Kernel tylko 7.5MB - powrót do PV DOMU. WireGuard w bazie, świetna wydajność na VM.
Dlaczego tylko 64.867% uptime?
- Aktualizacje na bieżąco - śledzę -STABLE, każdy patch oznacza restart
- Eksperymenty - OpenSense, pfSense, VyOS - zawsze wracam do NetBSD
- Rozwój infrastruktury - migracje między platformami
- Awarie zasilania - UPS dopiero od 2018
- "Tato, internet nie działa!" - debugging o 23:00
Lekcje z 12 lat
- NetBSD jest niezniszczalne - przetrwa każdą migrację
- Prostota wygrywa - pf > ipf, mniej = lepiej
- Historia ma znaczenie - 479MB kerneli to nie śmieci, to pamiętnik
- Ewolucja > Rewolucja - małe kroki, ciągłość konfiguracji
Co dalej?
Cel na 2025: wejść do top 10 w uprecords (potrzebuję 75 dni). Długoterminowo? Może pobiję rekord 166 dni z 2018?
System będzie dalej ewoluował. Może znowu zostanie hypervisorem? Może obsłuży 10 Gbit/s? Jedno jest pewne - będzie to NetBSD.

Dedykuję wszystkim, którzy pamiętają czasy 0202122, kompilowali kernel żeby wykryć kartę sieciową i mają gdzieś dyski z pierwszego RAIDa. Bo sentyment w IT to nie wada - to feature.