# biOS 0.4.0 Entwicklungsstand. Image `bios-0.4.0-dev.20261101-generic-amd64.iso`, gebaut aus Commit `bdaf3082f`, mit VPP 26.10 und Linux 7.3. ## Standarddaten | | | |---|---| | Benutzer | `bios` | | Passwort | `bios` | | Hostname | `bios` | | Serielle Konsole | `ttyS0`, 115200 Baud | | Netzwerk | keine Adressen, SSH aus | | Routing-Backend | BIRD, FRR als Fallback | Nach dem Start vom ISO mit `install image` auf die Platte installieren und das Passwort ändern: ``` configure set system login user bios authentication plaintext-password commit save ``` SSH einschalten: ``` set interfaces ethernet eth0 address / set service ssh commit save ``` VPP braucht isolierte CPU-Kerne und Huge Pages, beides wirkt erst nach einem Neustart: ``` set system option kernel cpu isolate-cpus 2-3 set system option kernel memory hugepage-size 2M hugepage-count 1800 commit save reboot ``` Danach: ``` set vpp settings interface eth1 commit ``` ## Download | | | |---|---| | Neuestes Image | | | Für Programme | (Version, URL, Größe, SHA-256), | | Dieser Bericht | , als Text | SHA-256 des Images: `05ae80f680f3b62f22eee0c2c684039ee78ae6b265734e3818fd7f5553721180` ## Änderungen ### VPP - VPP 26.10 wird aus den FD.io-Quellen gebaut (`stable/2610`), mit 41 Patches. 0001–0037 sind die portierten VyOS-Patches, 0038–0041 kommen von biOS. - Die MTU wird beim DPDK-Start auf das Limit der NIC begrenzt. Sonst startet eine NIC mit einem Limit unter 9000 nicht (`pmd-init-fail`), etwa virtio mit `host_mtu=1500`. - Die Plugins `tap`, `ipip` und `policer` sind in 26.10 eigenständig und in `startup.conf` eingeschaltet, `avf` gibt es nicht mehr. - Die Krypto-Engine `openssl` ist immer aktiv, WireGuard braucht ChaCha20-Poly1305. - `accel-ppp-ng` ist gegen VPP 26.10 gebaut, sonst startet der PPPoE-Server nicht. ### Neue Konfiguration **Soft RSS** verteilt Pakete per Software auf die Worker, für Verkehr, den die NIC nicht hashen kann. Braucht `cpu-cores` 2 oder mehr: ``` set vpp settings resource-allocation cpu-cores 2 set vpp settings interface eth1 soft-rss type 4-tuple # 2-tuple, src-ip, dst-ip ``` **WireGuard im Dataplane**, die Schnittstelle erscheint für BIRD und FRR im Kernel: ``` set interfaces vpp wireguard vppwg0 address 10.255.0.1/30 set interfaces vpp wireguard vppwg0 source-address 192.0.2.1 set interfaces vpp wireguard vppwg0 port 51820 set interfaces vpp wireguard vppwg0 private-key set interfaces vpp wireguard vppwg0 peer site-b public-key set interfaces vpp wireguard vppwg0 peer site-b preshared-key set interfaces vpp wireguard vppwg0 peer site-b allowed-ips 10.255.0.2/32 set interfaces vpp wireguard vppwg0 peer site-b address 198.51.100.2 set interfaces vpp wireguard vppwg0 peer site-b port 51820 ``` - Die Tunnel-Adresse des Peers muss als einzelne Adresse in den `allowed-ips` stehen. - VPP wählt den Peer über den Next Hop der Route, eine Route über `vppwgN` braucht einen Next Hop in den `allowed-ips` eines Peers. - `source-address` ist Pflicht und muss auf einem VPP-Interface liegen. - Jede Änderung legt das Interface neu an, der Tunnel bricht kurz ab. **Firewall für weitergeleiteten Verkehr:** `set firewall ipv4|ipv6 forward filter` wirkt jetzt auch auf das, was VPP weiterleitet, als ACLs des VPP-ACL-Plugins. - `accept` wird `permit+reflect`, Antwortverkehr läuft über Sessions. - `established` muss `accept` sein: `global-options state-policy established action accept`. - `reject` verwirft nur, ohne ICMP oder RST. - Nicht abbildbare Regeln lassen den Commit fehlschlagen, mit Pfad der Regel, zum Beispiel `outbound-interface`, `limit`, `recent`, `time`, `mark`, `dscp`, `geoip`, `fqdn`. - Ein Interface mit `vpp acl ip interface` kann nicht zugleich gefiltert werden. - Bridges und Cross-Connects leiten in Layer 2 weiter und bekommen keine ACL. - Die ACLs überstehen einen Neustart von VPP und des Routers. - Ein gestopptes VPP lässt den Firewall-Commit nicht scheitern. ### Werkzeuge - `tools/smoketest [--shards 10]` führt die Testsuite parallel in mehreren VMs aus. - `tools/publish-image ` veröffentlicht ein Image auf dem Download-Server. ## Testergebnisse ### Smoketests Lauf auf dem oben genannten Image, 11 VMs mit KVM, virtio-, e1000e- und vmxnet3-NICs: | | | |---|---| | Module | 115, alle bestanden | | Tests | 1397, kein Fehler | | Übersprungen | 151: 147 Interface-Tests für Funktionen, die die jeweilige Interface-Familie nicht hat, 2 nur für arm64, 2 passen nicht zu IPoE | | Darunter VPP | `test_vpp.py`, 49 Tests | | Dauer | 18 Minuten | Einzelergebnisse je Modul: ### Verkehr durch VPP Drei VMs mit virtio-NICs: B – A (VPP) – C, in den WireGuard-Tests auch B mit VPP. | Test | Ergebnis | |---|---| | Ping von B an den Router A über Linux-CP | 3 von 3 | | Weiterleitung von B nach C durch VPP | 4 von 5 | | Forward-Filter nur TCP: Ping von B nach C | 0 von 3, verworfen wie konfiguriert | | Derselbe Filter: Ping von B an den Router | 3 von 3 | | Regel für ICMP ergänzt: Ping von B nach C | 3 von 3 | | Ohne Regel in Gegenrichtung: Ping von C nach B | 0 von 3, verworfen wie konfiguriert | | BGP mit BIRD | `Established`, Route im Kernel und in der VPP-FIB (`lcp-rt-dynamic`) | | Neustart von A | VPP, ACLs, BGP-Session und FIB-Route wieder da; danach 2 von 3 Pings | | Neustart von VPP mit Firewall und Soft RSS | ACLs wieder da, Soft RSS aktiv; kurz darauf 20 von 20 | | WireGuard mit Preshared Key | je 5 von 5 in beide Richtungen, Handshake aufgebaut | Die einzelnen Paketverluste treten kurz nach Konfiguration oder Start auf. Die Ursache ist nicht untersucht, naheliegend ist die Auflösung der Nachbaradressen. Protokolle: [BGP und Neustart](traffic-bgp-reboot.txt), [WireGuard, Firewall und Soft RSS](traffic-wireguard.txt) ## Offen - **Hardware:** Alles lief in QEMU. Echte NICs, Durchsatz, volle BGP-Tabelle und QinQ sind nicht getestet. - **Nicht gelaufen:** Config-Load-Tests (`testc`, `testcvpp`), RAID, TPM, Secure Boot, UEFI nur stichprobenartig. - **Ungeklärt:** Die Zabbix-Tests schlugen in früheren Läufen zweimal fehl und bestehen jetzt, ohne dass dort etwas geändert wurde. Eine VM mit UEFI hing einmal beim ersten Start, ein späterer Lauf bestand. - **Firewall:** Per DHCP gelernte eigene Adressen kennt die ACL erst nach dem nächsten Commit. Die Session-Tabelle ist noch nicht für volle Internet-Last dimensioniert und getestet.