09/11/2023 à 19h30 - Slash, la soirée tech d'Alsace Réseau Neutre

Pour donner un peu plus de détails qui pourront être utile pour rédiger une page de wiki sur notre cluster proxmox.

Dépôt « no subscription » et installation ifupdown2

echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-enterprise.list
apt update
apt full-upgrade
apt install ifupdown2

Configuration IPv4

La dernière fois, nous ne parvenions plus à remettre en route l’IPv4 sur la VM créé avec Cloud-init en se basant sur les instructions https://forum.arn-fai.net/t/suite-proxmox/8082/3.

Nous avons finalement découvert comment réactiver l’interface fwXXXi0. Pour faire ça il faut ajouter firewall=1 dans le matériel:

qm create $next_id --name $name --memory $memory --net0 virtio,bridge=vmbr0,firewall=1

Configuration IPv6

Activation du forwarding en IPv6

On s’est apperçu que la dernière fois nous avions oubliés de vérifier l’activation du forwarding en ipv6 sur l’hôte proxmox:

Ajout d’un fichier /etc/sysctl.d/arn.conf

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1
net.ipv6.conf.default.proxy_ndp = 1

Puis on charge en lançant:

sysctl -p

On a constaté cependant que les interfaces fwXXXi0 des VM ont aussi l’ipv6 forwarding désactivé, une recherche nous amène à découvrir que le script /etc/network/if-pre-up.d/bridge se charge de désactiver l’ipv6…

Pour contrer ce comportement, on propose ce script qui reste à tester:

#!/bin/sh

if [ ! -x /sbin/brctl ]
then
  exit 0
fi

. /lib/bridge-utils/bridge-utils.sh

case "$IF_BRIDGE_PORTS" in
    "")
    exit 0
    ;;
    none)
    INTERFACES=""
    ;;
    *)
    INTERFACES="$IF_BRIDGE_PORTS"
    ;;
esac


all_interfaces= &&
unset all_interfaces &&
bridge_parse_ports $INTERFACES | while read i
do
  for port in $i
  do
    # We attach and configure each port of the bridge
    if [ "$MODE" = "start" ] && [ ! -d /sys/class/net/$IFACE/brif/$port ]; then
      if [ -f /proc/sys/net/ipv6/conf/$port/disable_ipv6 ]
      then
        echo 0 > /proc/sys/net/ipv6/conf/$port/disable_ipv6
      fi
    fi
  done
done

Ajout des routes

ip -6 a a fe80::42:1 dev fwbr104i0
ip -6 r a 2a00:5881:8100:1010::1/64 dev fwbr104i0

Script mis à jour

#!/usr/bin/env bash
#set -euo pipefail
usage(){
>&2 cat << EOF
Usage: $0 --name NAME --memory MEMORY --disk DISK --ipv4 IPV4 [--ipv6 IPV6] [--nameserver NAMESERVER] [--user USER] 
EOFexit 1
}

args=$(getopt -a -o hn:m:d:4:6:r:u: --long help,name:,memory:,disk:,ipv4:,ipv6:,nameserver:,user: -- "$@")
if [[ $? -gt 0 ]]; then
  usage
fi
eval set -- ${args}
while :do
  case $1 in
    -h | --help)    usage      ; shift   ·
    -n | --name)   name=${2:-2048}    ; shift 2  ;;
    -m | --memory)    memory=${2:-2048}     ; shift 2  ;;
    -d | --disk)   disk=$((${2:-15} - 2))   ; shift 2 ;;
    -4 | --ipv4)   ipv4=$2   ; shift 2 ;;
    -6 | --ipv6)   ipv6=$2   ; shift 2 ;;
    -r | --nameserver)   nameserver=${2:-80.67.169.12 80.67.169.40}   ; shift 2 ;;
    -u | --user)   user=${2:-arn}   ; shift 2 ;;
# -- means the end of the arguments; drop this, and break out of the while loop
--) shift; break ;;
*) >&2 echo Unsupported option: $1
usage ;;
esac
done
if [[ $# -eq 0 ]]; then
  usage
fi

next_id=$(pvesh get /cluster/nextid)
qm create $next_id --name $name --memory $memory --net0 virtio,bridge=vmbr0,firewall=1
qm importdisk $next_id /root/debian-11-genericcloud-amd64.qcow2 local-zfs
qm set $next_id --scsihw virtio-scsi-pci --scsi0 local-zfs:vm-$next_id-disk-0
qm set $next_id --ide2 local-zfs:cloudinit
qm set $next_id --boot c --bootdisk scsi0
qm set $next_id --serial0 socket --vga serial0
qm set $next_id --ipconfig0 ip=${ipv4}/32,${ipv6}/64,gw=169.254.42.1,gw=fe80::42:1
qm resize $next_id scsi0 ${disk}G
qm set $next_id --nameserver "$nameserver"
qm set $next_id --ciuser "$user"
qm set $next_id --cipassword
qm start $next_id
ip a a 169.254.42.1 dev fw${next_id}i0
ip r a $ipv4/32 dev fw${next_id}i0
ip -6 a a fe80::42:1 dev fw${next_id}i0
ip -6 r a $ipv6/64 dev fw${next_id}i0

TODO

  • tester les scripts et les mettre dans un git
  • vérifier si en proxmox 8 ce comportement par défaut est toujours présent
  • tester l’importation d’un disque d’une VM ganeti
1 « J'aime »