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