Voici les états de préparation d'un serveur miniforum, en debian 12. Celui-ci va supporter docker et kvm, avec prise en charge du réseau wifi et filtrage+dhcp par opnsense kvm. Ce document regroupe les étapes que j'ai effectué, un synthèse de mes notes. Je vais essayer d'être le plus précis.
Probablement à ce stade, vous vous demandez pourquoi ne pas installer proxmox. Je veux partir sur une solution 100% de ma conception, c'est formateur.
A noter que:
A savoir :
wipefs -a /dev/sdc parted /dev/sdc mklabel gpt sudo parted /dev/sdc -- mkpart ESP fat32 1MiB 513MiB sudo parted /dev/sdc set 1 boot on sudo parted /dev/sdc -- mkpart primary 513MiB 100% sudo parted /dev/sdc set 2 lvm on
sudo mkfs.fat -F32 /dev/sdc1 sudo pvcreate /dev/sdc2 sudo vgcreate vg_ms01 /dev/sdc2 # Root 50 Go sudo lvcreate -L 40G -n lv_root vg_ms01 # Swap 16 Go sudo lvcreate -L 2G -n lv_swap vg_ms01 # /var 100 Go sudo lvcreate -L 20G -n lv_var vg_ms01 # Reste en /home sudo lvcreate -L 50G -n lv_home vg_ms01 sudo mkfs.ext4 /dev/vg_ms01/lv_root sudo mkfs.ext4 /dev/vg_ms01/lv_var sudo mkfs.ext4 /dev/vg_ms01/lv_home sudo mkswap /dev/vg_ms01/lv_swap
sudo apt update sudo apt install debootstrap
L'idée est de préparer la structure du FS pour le nouveau serveur.
mkdir -p /mnt/debian
mount /dev/vg_ms01/lv_root /mnt/debian
mkdir /mnt/debian/{boot,var,home}
mount /dev/sdc1 /mnt/debian/boot
mount /dev/vg_ms01/lv_var /mnt/debian/var
mount /dev/vg_ms01/lv_home /mnt/debian/home
swapon /dev/vg_ms01/lv_swap
apt install debootstrap gdisk lvm2 linux-image-amd64 grub-efi-amd64 -y debootstrap --arch amd64 bookworm /mnt/debian http://deb.debian.org/debian/
cat > /etc/fstab <<'EOF' /dev/vg_ms01/lv_root / ext4 defaults 0 1 /dev/vg_ms01/lv_var /var ext4 defaults 0 2 /dev/vg_ms01/lv_home /home ext4 defaults 0 2 /dev/vg_ms01/lv_swap none swap sw 0 0 /dev/sdc1 /boot vfat umask=0077 0 1 EOF
echo ms01 > /etc/hostname apt install locales tzdata -y dpkg-reconfigure locales dpkg-reconfigure tzdata #installation noyau apt install systemd-sysv vim net-tools lvm2 linux-image-amd64 grub-efi-amd64 -y #installation grub grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=debian --recheck update-grub #comptes passwd root adduser monuser usermod -aG sudo monuser #console+clavier apt-get install console-data
La carte est se nomme en(quelque chose). Je fais en sorte d'obtenir sur les cartes en* une addresse ip par le serveur dhcp du lan privé. Comme il y a plusieurs carte réseau, je ne sais pas au 1er boot sur laquelle je serais.
#reseau mkdir -p /etc/systemd/network cat > /etc/systemd/network/20-wired.network <<'EOF' [Match] Name=en* [Network] DHCP=yes EOF
apt update apt install systemd-resolved dnsutils -y systemctl enable systemd-resolved
Le serveur dispose d'un sortie video, je met en place les drivers.
apt install -y vainfo mesa-va-drivers mesa-vulkan-drivers -y
root@ms01:~# vainfo error: can't connect to X server! libva info: VA-API version 1.17.0 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so libva info: Found init function __vaDriverInit_1_17 libva error: /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so init failed libva info: va_openDriver() returns 1 libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so libva info: Found init function __vaDriverInit_1_8 libva error: /usr/lib/x86_64-linux-gnu/dri/i965_drv_video.so init failed libva info: va_openDriver() returns -1 root@ms01:~# lspci | grep VGA 00:02.0 VGA compatible controller: Intel Corporation Alder Lake-P Integrated Graphics Controller (rev 0c)
Vérification que sensors remonte de la data
root@ms01:/mnt/kvm/ISO# sensors ........... coretemp-isa-0000 Adapter: ISA adapter Package id 0: +54.0°C (high = +100.0°C, crit = +100.0°C) Core 0: +54.0°C (high = +100.0°C, crit = +100.0°C) Core 4: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 8: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 12: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 16: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 20: +53.0°C (high = +100.0°C, crit = +100.0°C) Core 24: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 25: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 26: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 27: +52.0°C (high = +100.0°C, crit = +100.0°C) Core 28: +51.0°C (high = +100.0°C, crit = +100.0°C) Core 29: +51.0°C (high = +100.0°C, crit = +100.0°C) Core 30: +51.0°C (high = +100.0°C, crit = +100.0°C) Core 31: +51.0°C (high = +100.0°C, crit = +100.0°C) ...........
#uninstall docker for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key: apt-get update apt-get install ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ tee /etc/apt/sources.list.d/docker.list > /dev/null apt-get update apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
#portainer docker volume create portainer_data docker run -d \ -p 8000:8000 \ -p 9443:9443 \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
#installation de la libvirt apt update apt install qemu-kvm libvirt-daemon-system libvirt-clients virt-manager ovmf -y usermod -aG libvirt monuser newgrp libvirt apt install bridge-utils vlan net-tools -y #installation plus complet sudo apt install qemu-system-x86 libvirt-daemon-system virtinst \ virt-manager virt-viewer ovmf swtpm qemu-utils guestfs-tools \ libosinfo-bin tuned
Cockpit permet la gestion des vm via web interface. Je configure mes VM pour utiliser spice pour le contrôle distant.
#cockpit administration web sudo apt install cockpit cockpit-machines
Si vous utilisez windows, installez le client spice. Lancer un cmd.exe en mode administrateur. Désolé, j'utilise encore windows, j'ai des produits non compatible linux.
winget install virt-viewer
root@ms01:/etc/wpa_supplicant# ip link show wlp90s0
6: wlp90s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DORMANT group default qlen 1000
link/ether 8e:ca:61:xx:xx:xx brd ff:ff:ff:ff:ff:ff permaddr 14:ea:63:xx:xx:xx
ip link set wlp90s0 up
apt install firmware-misc-nonfree
sudo modprobe -r mt7921e
sudo modprobe mt7921e
Liste des SSID disponibles, utilisation du point PPOP8P
root@ms01:/etc/wpa_supplicant# nmcli device wifi list
IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY
xx:xx:xx:xx:xx:xx PointA Infra 36 540 Mb/s 100 ▂▄▆█ WPA2
xx:xx:xx:xx:xx:xx PPOP8P Infra 149 270 Mb/s 80 ▂▄▆_ WPA2
xx:xx:xx:xx:xx:xx PointB Infra 6 270 Mb/s 74 ▂▄▆_ WPA2 WPA3
xx:xx:xx:xx:xx:xx PointC Infra 6 270 Mb/s 74 ▂▄▆_ WPA2
xx:xx:xx:xx:xx:xx PointD Infra 9 270 Mb/s 72 ▂▄▆_ WPA2
xx:xx:xx:xx:xx:xx PointE Infra 149 195 Mb/s 65 ▂▄▆_ WPA2
nmcli device wifi connect "PPOP8P" ifname wlp90s0 --ask
La liaison wifi va être utilisée par une vm. J'édite le xml de la configuration kvm et je modifie la section qui va bien.
<interface type='direct'> <mac address='52:54:00:xx:xx:xx'/> <source dev='wlp90s0' mode='bridge'/> <model type='virtio'/> </interface> virsh edit opnsense
Mise en place du bridge br1 pour la liaison wifi wan de la vm.
Créer le bridge br1 avec IP 192.168.120.1 :
nmcli connection add type bridge ifname br1 con-name br1 ipv4.addresses 192.168.120.1/24 ipv4.method manual ipv6.method ignore
Appliquer le bridge:
nmcli connection up br1
Activer l’IP forwarding:
nmcli connection modify br1 +ipv4.forwarding yes # marche pas en debian12, j'ai quelques difficultés, je fais. echo 1 > /proc/sys/net/ipv4/ip_forward # J'ajoute dans: /etc/sysctl.d/99-ip_forward.conf net.ipv4.ip_forward = 1 #je vérifie avec sysctl -p
on reduit le timout dhcp
nmcli connection modify PPOP8P ipv4.dhcp-timeout 20
Editer le fichier 90-wifi-nat-clean et le rendre executable.
vi /etc/NetworkManager/dispatcher.d/90-wifi-nat-clean chmod +x /etc/NetworkManager/dispatcher.d/90-wifi-nat-clean
A noter que l'internet qui est distribué par le fournisseur est incapable d'accepter une connexion entrante comme un port ssh ouvert. Il y a un nat partagé avec tous les clients pour rationaliser les ip sur le réseau publique. Cela oblige à utiliser wireguard par exemple pour ouvrir une porte de d'entrée ailleurs sur internet. Script:
#!/bin/bash
IFACE="$1"
STATUS="$2"
# On cible uniquement wlp90s0
if [ "$IFACE" = "wlp90s0" ]; then
if [ "$STATUS" = "up" ]; then
# On evite d'exposer les services a l'exterieur
# + connection tracking pour laisser les reponses revenir
iptables -C INPUT -i wlp90s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || \
iptables -I INPUT 1 -i wlp90s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -C INPUT -i wlp90s0 -j DROP 2>/dev/null || \
iptables -I INPUT 2 -i wlp90s0 -j DROP
# --- Ajout NAT/Forward si pas déjà présent ---
iptables -t nat -C POSTROUTING -s 192.168.120.0/24 -o wlp90s0 -j MASQUERADE 2>/dev/null || \
iptables -t nat -A POSTROUTING -s 192.168.120.0/24 -o wlp90s0 -j MASQUERADE
iptables -C FORWARD -i br1 -o wlp90s0 -j ACCEPT 2>/dev/null || \
iptables -A FORWARD -i br1 -o wlp90s0 -j ACCEPT
iptables -C FORWARD -i wlp90s0 -o br1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || \
iptables -A FORWARD -i wlp90s0 -o br1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
echo "WiFi up → règles NAT/Forward appliquées."
fi
if [ "$STATUS" = "down" ]; then
# --- Suppression NAT/Forward ---
iptables -t nat -D POSTROUTING -s 192.168.120.0/24 -o wlp90s0 -j MASQUERADE 2>/dev/null || true
iptables -D FORWARD -i br1 -o wlp90s0 -j ACCEPT 2>/dev/null || true
iptables -D FORWARD -i wlp90s0 -o br1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || true
# --- Suppression protection INPUT ---
iptables -D INPUT -i wlp90s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 2>/dev/null || true
iptables -D INPUT -i wlp90s0 -j DROP 2>/dev/null || true
echo "WiFi down → règles NAT/Forward supprimées."
fi
fi
Gestion de la vitesse de reprise du wifi après deconnexion
#Partie wifi et rescan automatique ne cas de perte du réseau vi /etc/NetworkManager/conf.d/wifi-reconnect.conf
[device] wifi.scan-rand-mac-address=no [wifi] # Intervalle entre deux rescans (en secondes) scan-interval=10
Toujours de problème de reprise sous wifi. A noter que la liaison n'est pas fixe, et distribué par un partage android avec mon smartphone. Il y a l'intermitance de la lisaison et parfois le temps entre 2 connections qui est très variable, de quelques minutes à plusieurs jours.
Force le check wifi par contab. La log est mise à jour.
* * * * * /usr/local/bin/autowifi.sh >> /var/log/autowifi.log 2>&1
Script autowifi.sh:
#!/bin/bash
WIFI_NAME="PPOP8P"
IFACE="wlp90s0"
CARRIER_FILE="/sys/class/net/$IFACE/carrier"
if [[ -f "$CARRIER_FILE" ]] && [[ "$(cat $CARRIER_FILE)" == "1" ]];
then
# Déjà associé à un AP
echo "$(date) - Interface $IFACE déjà connectée (carrier=1)"
else
# Sinon, on scanne
nmcli device wifi rescan >/dev/null 2>&1
if nmcli -t -f SSID device wifi list ifname "$IFACE" | grep -Fxq "$WIFI_NAME"; then
echo "$(date) - Réseau $WIFI_NAME trouvé, tentative de connexion..."
nmcli connection up "$WIFI_NAME"
else
echo "$(date) - Réseau $WIFI_NAME non trouvé"
fi
fi