Mastodon

Blog de Alkahan

Mise en place d'un lien réseau 10G avec thunderbolt

  05/05/2026 [linux réseau thunderbolt usb4 10G] - 700 mots


J’ai deux machines qui me servent d’hôtes incus. Ces machines possèdent deux interfaces réseau mais comme je veux virtualiser mon pare-feu j’ai besoin d’une interface supplémentaire : 1 pour le WAN, 1 pour le LAN et 1 pour l’interconnexion entre les deux nœuds du cluster. J’avais vu que l’on pouvait utiliser thunderbolt pour ça. Il faut pour cela disposer d’un port USB4 ce qui mon cas.

J’ai acheté pour cela un câble USB4 certifié thunderbolt 3 et 4 pour moins de 10 euros.

Voici le schéma de notre réseau avec le plan d’adressage :

  [node1] ─── (thunderbolt) ───  [node2]
10.1.1.1/24                    10.1.1.2/24

Tests manuels

Pour faire de l’ethernet par-dessus thunderbolt il faut utiliser le module thunderbolt_net

Pour tester rapidement on charge le module à la main sur les deux machines :

modprobe thunderbolt_net

On peut vérifier que le noyau a créé une nouvelle interface réseau

ip link | grep thunderbolt
35: thunderbolt0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 02:0f:fc:e4:87:0a brd ff:ff:ff:ff:ff:ff

On attribue maintenant une adresse IP:

sur la première machine

node1:# ip addr add 10.1.1.1/24 dev thunderbolt0

sur la deuxième machine

node2:# ip addr add 10.1.1.2/24 dev thunderbolt0

On vérifie que le ping passe:

node1:# ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.328 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=0.372 ms
64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=0.303 ms

Maintenant on va faire les tests de performance avec iperf3. On installe iperf3 sur les deux machines:

apt intall iperf3

On va utiliser la 2e comme serveur:

node2:# iperf3 -s

sur la première on lance le client:

node1:# iperf3 -c 10.1.1.2
Connecting to host 10.1.1.2, port 5201
[  5] local 10.1.1.1 port 33174 connected to 10.1.1.2 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  1.37 GBytes  11.7 Gbits/sec    1   3.04 MBytes       
[  5]   1.00-2.00   sec  1.38 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   2.00-3.00   sec  1.37 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   3.00-4.00   sec  1.38 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   4.00-5.00   sec  1.38 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   5.00-6.00   sec  1.37 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   6.00-7.00   sec  1.38 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   7.00-8.00   sec  1.37 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   8.00-9.00   sec  1.38 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
[  5]   9.00-10.00  sec  1.37 GBytes  11.8 Gbits/sec    0   3.04 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  13.7 GBytes  11.8 Gbits/sec    1            sender
[  5]   0.00-10.00  sec  13.7 GBytes  11.8 Gbits/sec                  receiver

iperf Done.

Et voilà un lien 10G pour moins de 10 euros. Le câble et le protocole thunderbolt sont capables d’atteindre 40Gbit/s on en est loin ici. Le problème vient sans doute du module, et contrairement à une carte réseau ethernet, il n’y a ici pas d’accélération matérielle. Et dans tous les cas c’est très suffisant pour mon usage.

Passons maintenant à la configuration définitive

Configuration définitive

On charge le module au démarrage en créant le fichier /etc/modules-load.d/thunderbolt_net.conf

thunderbolt_net

On configure le lien réseau dans networkd. L’interface sera nommée eno3. fichier /etc/systemd/network/00-thunderbolt-eno3.link

[Match]
Driver=thunderbolt-net

[Link]
Name=eno3
MACAddressPolicy=none

On configure les adresses IP dans le fichier /etc/systemd/network/15-eno3.network

[Match]
Name=eno3

[Link]
MTUBytes=9000

[Network]
Address=10.1.1.1/24
ConfigureWithoutCarrier=yes

sur le 2e nœud on remplace l’adresse IP 10.1.1.1/24 par 10.1.1.2/24

Il n’y a pas de détection du link comme sur une carte réseau, c’est la raison pour laquelle on passe le paramètre ConfigureWithoutCarrier à yes qui indique à networkd de configurer l’addresse IP dans tous les cas.

On recharge la configuration réseau, et on affiche le résultat

networkctl reload
networkctl | grep eno3
35 eno3         ether     routable    configured

Source: Thunderbolt Networking Setup on Linux