SwordArMor

Essai d’un routeur ARM

Dans la mesure où ARM prend de plus en plus d’ampleur, ça faisait quelques temps que je voulais voir ce que ça donnait de router avec, notamment par rapport à la gestion des IRQ et de la fréquence.
En effet, pour router il n’y a pas besoin d’avoir un CPU avec beaucoup de fioritures, mais plutôt un CPU très rapidement cadencé. Un paquet ne demande pas beaucoup de calcul, par contre ça en demande souvent. Il est également connu qu’il vaut mieux avoir un nombre carré de cœurs, pour que les drivers puissent plus facilement s’y retrouver pour leurs queues de traitement.

À cause d’un affreux influenceur IRC je me suis retrouvé en possession d’un Minisforum MS-R1. Il a tout ce que je demande à un routeur : deux ports réseau. Par contre en terme de CPU cadencé et carré c’est une autre histoire. Il y a un CPU de 4 cœurs à 1.8GHz et un autre de 8 cœurs à 2.6GHz, pour un seul nœud NUMA. Je ne sais pas comment ça fonctionne, et je ne sais pas trop à quel CPU les drivers réseau sont branchés.
Mais après tout, c’est pour router chez moi, où je fais à peine 250Mbps le vent dans le dos, donc pourquoi pas.

core01-rennes ~ # lscpu
Architecture:                aarch64
  CPU op-mode(s):            64-bit
  Byte Order:                Little Endian
CPU(s):                      12
  On-line CPU(s) list:       0-11
Vendor ID:                   ARM
  BIOS Vendor ID:            Cix Technology Group Co., Ltd.
  Model name:                Cortex-A520
    BIOS Model name:         CIX P1 CP8180   CPU @ 2.6GHz
    BIOS CPU family:         258
    Model:                   1
    Thread(s) per core:      1
    Core(s) per socket:      4
    Socket(s):               1
    Stepping:                r0p1
    Frequency boost:         disabled
    CPU(s) scaling MHz:      44%
    CPU max MHz:             1800.0000
    CPU min MHz:             800.0000
    BogoMIPS:                2000.33
    Flags:                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha
                             3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull sve
                             bitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti mte ecv afp mte3 wfxt
  Model name:                Cortex-A720
    BIOS Model name:         CIX P1 CP8180   CPU @ 2.6GHz
    BIOS CPU family:         258
    Model:                   1
    Thread(s) per core:      1
    Core(s) per socket:      8
    Socket(s):               1
    Stepping:                r0p1
    CPU(s) scaling MHz:      42%
    CPU max MHz:             2600.0000
    CPU min MHz:             800.0000
    BogoMIPS:                2000.33
    Flags:                   fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma lrcpc dcpop sha
                             3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb paca pacg dcpodp sve2 sveaes svepmull sve
                             bitperm svesha3 svesm4 flagm2 frint svei8mm svebf16 i8mm bf16 dgh bti mte ecv afp mte3 wfxt
Caches (sum of all):
  L1d:                       640 KiB (12 instances)
  L1i:                       640 KiB (12 instances)
  L2:                        4 MiB (12 instances)
  L3:                        12 MiB (1 instance)
NUMA:
  NUMA node(s):              1
  NUMA node0 CPU(s):         0-11
Vulnerabilities:
  Gather data sampling:      Not affected
  Ghostwrite:                Not affected
  Indirect target selection: Not affected
  Itlb multihit:             Not affected
  L1tf:                      Not affected
  Mds:                       Not affected
  Meltdown:                  Not affected
  Mmio stale data:           Not affected
  Old microcode:             Not affected
  Reg file data sampling:    Not affected
  Retbleed:                  Not affected
  Spec rstack overflow:      Not affected
  Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:                Mitigation; __user pointer sanitization
  Spectre v2:                Mitigation; CSV2, BHB
  Srbds:                     Not affected
  Tsa:                       Not affected
  Tsx async abort:           Not affected
  Vmscape:                   Not affected

J’ai voulu bêtement tenter l’installation en PXE comme d’habitude, mais l’UEFI ne sait pas faire ça dans les menus, et j’ai pas trouvé la commande pour le faire depuis le shell UEFI (j’ai pas beaucoup cherché non plus). J’ai donc profité d’avoir récupéré des clés USB FRNIX au récent aPEERo de Rennes pour la dd et booter dessus, ça ne m’était pas arrivé depuis bien longtemps.
La machine a bien booté correctement sur le live gentoo, mais je n’avais pas de réseau. En effet les NICs realtek 10G étaient trop récentes pour le kernel LTS du moment (6.12). J’ai profité d’avoir un port PCI pour mettre une carte broadcom qui traînait chez moi et affaire réglée.
J’ai donc ensuite suivie la procédure classique d’installation de gentoo, mais en UEFI (une première pour moi, j’ai toujours activé la rétrocompat BIOS par flemme de changer mes habitudes).
Une fois l’installation faite je suis passé sur un kernel 6.18 (en estimant que ça sera celle là qui deviendra la prochaine LTS, on verra bien) afin de profiter des drivers ajoutés en 6.16. J’ai donc maintenant 4 cartes réseau et une carte Wi-Fi sur mon routeur, avec des noms toujours aussi prévisibles, merci la convention de nommage systemd.

core01-rennes ~ # lspci -k
00:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
	Kernel driver in use: pcieport
	Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8127 (rev 05)
	Subsystem: Realtek Semiconductor Co., Ltd. Device 0123
	Kernel driver in use: r8169
	Kernel modules: r8169
30:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
	Kernel driver in use: pcieport
	Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
31:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. Device 8127 (rev 05)
	Subsystem: Realtek Semiconductor Co., Ltd. Device 0123
	Kernel driver in use: r8169
	Kernel modules: r8169
60:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
	Kernel driver in use: pcieport
	Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
61:00.0 Network controller: MEDIATEK Corp. MT7922 802.11ax PCI Express Wireless Network Adapter
	Subsystem: MEDIATEK Corp. Device c616
	Kernel driver in use: mt7921e
	Kernel modules: mt7921e
90:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
	Kernel driver in use: pcieport
	Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
91:00.0 Non-Volatile memory controller: Kingston Technology Company, Inc. OM8TAP4 PCIe 4 NVMe SSD (QLC) (DRAM-less)
	Subsystem: Kingston Technology Company, Inc. OM8TAP4 PCIe 4 NVMe SSD (QLC) (DRAM-less)
	Kernel driver in use: nvme
	Kernel modules: nvme
c0:00.0 PCI bridge: Cadence Design Systems, Inc. Device 0100
	Kernel driver in use: pcieport
	Kernel modules: cdns3_pci_wrap, cdnsp_udc_pci
c1:00.0 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe
	Subsystem: Broadcom Inc. and subsidiaries Device 2003
	Kernel driver in use: tg3
	Kernel modules: tg3
c1:00.1 Ethernet controller: Broadcom Inc. and subsidiaries NetXtreme BCM5720 Gigabit Ethernet PCIe
	Subsystem: Broadcom Inc. and subsidiaries Device 2003
	Kernel driver in use: tg3
	Kernel modules: tg3
core01-rennes ~ # ip l
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp49s0:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 38:05:25:33:e2:30 brd ff:ff:ff:ff:ff:ff
3: enp193s0f0:  mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0a:f7:63:93:ca brd ff:ff:ff:ff:ff:ff
4: enp1s0:  mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 38:05:25:33:e2:2f brd ff:ff:ff:ff:ff:ff
5: enp193s0f1:  mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:0a:f7:63:93:cb brd ff:ff:ff:ff:ff:ff
6: wlp97s0:  mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
    link/ether b0:6b:11:11:48:e8 brd ff:ff:ff:ff:ff:ff

J’ai ensuite mis une IP sur chaque interface realtek, un PC au bout et j’ai activé le routage. Le but est de savoir si la machine tient le routage au giga (même si c’est un débit que j’atteins uniquement en pic, ça serait dommage de ne pas l’avoir).

core01-rennes ~ # ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host proto kernel_lo
       valid_lft forever preferred_lft forever
2: enp49s0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 38:05:25:33:e2:30 brd ff:ff:ff:ff:ff:ff
    inet 10.0.22.1/24 scope global enp49s0
       valid_lft forever preferred_lft forever
    inet6 fe80::3a05:25ff:fe33:e230/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
3: enp193s0f0:  mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0a:f7:63:93:ca brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.6/24 brd 192.168.5.255 scope global enp193s0f0
       valid_lft forever preferred_lft forever
    inet6 2a0e:f42:0:3::6/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::20a:f7ff:fe63:93ca/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
4: enp1s0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 38:05:25:33:e2:2f brd ff:ff:ff:ff:ff:ff
    inet 10.0.35.1/24 scope global enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::3a05:25ff:fe33:e22f/64 scope link proto kernel_ll
       valid_lft forever preferred_lft forever
5: enp193s0f1:  mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:0a:f7:63:93:cb brd ff:ff:ff:ff:ff:ff
6: wlp97s0:  mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether b0:6b:11:11:48:e8 brd ff:ff:ff:ff:ff:ff
core01-rennes ~ # ip r
default via 192.168.5.254 dev enp193s0f0 metric 3
10.0.22.0/24 dev enp49s0 proto kernel scope link src 10.0.22.1
10.0.35.0/24 dev enp1s0 proto kernel scope link src 10.0.35.1
192.168.5.0/24 dev enp193s0f0 proto kernel scope link src 192.168.5.6

Et les deux PCs de tests sont configurés de la même façon, en échangeant juste les IPs.

roucool ~ # ip r
default via 10.0.22.1 dev enp0s25 
10.0.22.0/24 dev enp0s25 proto kernel scope link src 10.0.22.2 
127.0.0.0/8 via 127.0.0.1 dev lo 
roucool ~ # ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s25:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:1f:16:1e:f2:bd brd ff:ff:ff:ff:ff:ff
    inet 10.0.22.2/24 scope global enp0s25
       valid_lft forever preferred_lft forever
    inet6 fe80::21f:16ff:fe1e:f2bd/64 scope link 
       valid_lft forever preferred_lft forever
roucool ~ # mtr -bzwe 10.0.35.2
Start: 2026-02-03T21:35:40+0100
HOST: roucool.swordarmor.fr          Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. AS???    10.0.22.1               0.0%    10    0.1   0.2   0.1   0.3   0.1
  2. AS???    10.0.35.2               0.0%    10    0.3   0.3   0.3   0.4   0.0

En lançant un iperf3 j’ai bien du giga :

roucool ~ # iperf3 -c 10.0.35.2
Connecting to host 10.0.35.2, port 5201
[  5] local 10.0.22.2 port 46398 connected to 10.0.35.2 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   113 MBytes   947 Mbits/sec    0    462 KBytes       
[  5]   1.00-2.00   sec   112 MBytes   937 Mbits/sec    0    486 KBytes       
[  5]   2.00-3.00   sec   112 MBytes   942 Mbits/sec    2    402 KBytes       
[  5]   3.00-4.00   sec   112 MBytes   935 Mbits/sec    1    345 KBytes       
[  5]   4.00-5.00   sec   111 MBytes   934 Mbits/sec    2    390 KBytes       
[  5]   5.00-6.00   sec   111 MBytes   932 Mbits/sec    0    447 KBytes       
[  5]   6.00-7.00   sec   112 MBytes   940 Mbits/sec    3    389 KBytes       
[  5]   7.00-8.00   sec   111 MBytes   933 Mbits/sec    0    448 KBytes       
[  5]   8.00-9.00   sec   112 MBytes   937 Mbits/sec    0    455 KBytes       
[  5]   9.00-10.00  sec   112 MBytes   940 Mbits/sec    0    457 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  1.09 GBytes   938 Mbits/sec    8            sender
[  5]   0.00-10.01  sec  1.09 GBytes   936 Mbits/sec                  receiver

iperf Done.

Donc la machine semble suffisamment taillée pour faire office de CPE. En lançant un htop pendant le test, j’ai remarqué que l’IRQ était à 80% sur un seul cœur (en même temps j’ai fait le test avec un seul flux), mais la question est de savoir s’il y a assez de marge en ayant un PPP en plus dans l’équation. Je n’ai pas encore testé ce cas de figure car je n’ai pas encore remplacé mon ancien routeur, mais ça devrait se faire assez rapidement.

Installer des optiques 10G ZR directement dans une carte réseau PCI

Dans un contexte de FAI associatif comme grifon on cherche à vraiment limiter les coûts. Cela nous amène à des architectures où des machines peuvent faire à la fois routeur et serveur. C’est le cas de la machine que nous avons à TH2 : grifon la partage avec stolon afin …

Lire la suite

Sécurisation du routage BGP en utilisant ASPA avec routinator et bird (cas de Breizh-IX)

Le BGP est un protocole de routage dynamique qui se base historiquement sur la confiance. En théorie, n’importe qui peut plus ou moins annoncer n’importe quoi, et ça sera pris en compte. En pratique, les peerings BGP sont protégés par des prefix-lists afin de ne propager que ce …

Lire la suite

mautrix-signal ⚠ Your message may not have been bridged: 110: Verification failure in zkgroup

Pour éviter d’avoir plein d’applications de messagerie instantanée sur mon téléphone, je bridge tout dans matrix et je n’utilise directement que matrix. Ma machine matrix était sur une infra d’hypervision que je n’ai plus vraiment envie d’utiliser, et j’ai depuis une plus grosse …

Lire la suite

Le concept d’empty non terminal (ENT) en DNS, et son interaction avec les wildcards

Cet article est écrit en collaboration avec Axel Viala. Tout au long de l’article nous parlons de serveurs faisant autorité, les révolveurs n’ayant pas ce cas à gérer.

Sur un nom de domaine, on peut se retrouver avec des sous-domaines vides mais ayant des enfants. Nous appelons cela …

Lire la suite

Faire tenir la charge à une instance mastodon malgré Musk

Si vous lisez ce blog, vous savez sûrement qu’un riche mégalomane étasunien a racheté twitter, et qu’on en attendait pas moins de son mode de gestion. Cela a entraîné un exode vers mastodon, qui ronronnait tranquillement dans son coin jusqu’ici.
Je vais ici partager les différentes actions …

Lire la suite

Avoir une sorte de flowspec sous linux avec ipset

Internet étant truffé de machines plus ou moins vérolées qui scannent le monde entier, j’ai eu envie de les bloquer à l’échelle complète de mon réseau ; un genre de fail2ban2bgp.
Avec netfilter il n’existe pas de mécanisme pour avoir des règles dynamiques, et donc pas de moyen …

Lire la suite

Remonter le constructeur et le modèle d’un serveur en SNMP

Par défaut, la configuration de net-snmpd ne remonte pas le constructeur et le modèle d’un serveur, ce qui fait que LibreNMS (ou Observium) vont afficher « Generic x86 64-bit » là où on pourrait avoir « Dell Inc. [PowerEdge R510] » ou « HP [ProLiant DL320e Gen8] », ce qui rend plus facile l’inventorisation …

Lire la suite

Installer son instance mastodon sous Gentoo

Suite à l’annonce de Valère d’arrêter les services hostux, et donc l’instance mastodon, j’ai décidé de monter la mienne. La principale raison est que je n’ai pas trouvé d’autre instance en Europe avec un TLSA. Je ne vais pas ici expliquer toute l’installation …

Lire la suite

Désactivation de la souris pour urxvt et terminator (et autres terminaux basés sur VTE)

Depuis quelques temps, le support de la souris est activé par défaut sur certaines applications CLI, notamment vim. Ceci empêche d’utiliser le presse-papier « clic milieu » et ne sert en outre à rien, c’est donc fort ennuyeux.

J’ai un peu cherché comment désactiver le support de la souris …

Lire la suite