« Proxmox 8 » : différence entre les versions

De Linux Server Wiki
Aller à la navigation Aller à la recherche
 
(149 versions intermédiaires par le même utilisateur non affichées)
Ligne 3 : Ligne 3 :
[[Category:virtualisation]]
[[Category:virtualisation]]


Nous allons voir comment installer proxmox 6.x avec LVM2
Nous allons voir comment installer proxmox 7.x sur un raid 1 logiciel (md / mdadm) avec debootstrap.


=Prérequis=
=Prérequis=
Ligne 18 : Ligne 18 :
* <code>/etc/hosts</code>
* <code>/etc/hosts</code>
* <code>/etc/fstab</code>
* <code>/etc/fstab</code>
* <code>/etc/default/rcS</code>
* <code>/etc/mdadm/mdadm.conf</code> si vous disposez d'un raid logiciel
* <code>/etc/mdadm/mdadm.conf</code> si vous disposez d'un raid logiciel
* tout fichier de personnalisation de grub (<code>/etc/grub.d/</code> par exemple)
* tout fichier de personnalisation de grub (<code>/etc/grub.d/</code> par exemple)
Ligne 24 : Ligne 23 :
Cela vous permettra de vous faire une idée plus précise de ce qui doit figurer dans ces différents fichiers.
Cela vous permettra de vous faire une idée plus précise de ce qui doit figurer dans ces différents fichiers.


=Partitionnement=
=Partitionnement et système de fichier=


Voici le partitionnement que je vais utiliser :
Voici le partitionnement que je vais utiliser :
* /dev/sda1 10 Go (/)  
* Partition root (/) de 20 Go (/) en raid 1 sur les disques sda et sdb
* /dev/sda2 4096 Go (swap)
* Partitions swap de 4096 Go chacune réparties sur sda et sdb
* /dev/sda3 reste de l'espace disque (lvm)
* Le reste de l'espace sera utilisé plus tard pour un LVM dédié aux VMs


==Création des systèmes de fichiers==
==Partitionnement==
 
===Possibilité 1 : Partitionnement GPT pour EFI / UEFI===
 
Nous allons créer avec <code>gdisk</code> 3 partitions sur chaque disque :
* sda1 et sdb1 : partitions EFI (ESP), obligatoire pour le démarrage EFI/UEFI. Il faudra leur attribuer le type <code>EF00</code>. Pour assurer une bonne compatibilité avec les multiples firmwares EFI, il est recommandé de leur attribuer une taille de 512 MiB (+512M au prompt gdisk).
* sda2 et sdb2 : partitions pour le raid root (/). Il faudra leur attribuer le type <code>FD00</code>.
* sda3 et sdb3 : partitions swap séparées. Il faudra leur attribuer le type <code>8200</code>.
 
<br>


Pour les partitions EFI, nous créons un système de fichier FAT32 avec le label (nom) <code>EFI_SYSPART</code> :
<pre>
<pre>
mkfs.ext4 /dev/sda1
mkfs.fat -F 32 -n EFI_SYSPART /dev/sda1
mkswap /dev/sda2
mkfs.fat -F 32 -n EFI_SYSPART /dev/sdb1
</pre>
</pre>


==Création du LVM==
===Possibilité 2 : Partitionnement GPT pour BIOS===
 
Nous allons créer avec <code>gdisk</code> 3 partitions sur chaque disque :
* sda1 et sdb1 : partitions pour le bootloader. Il faudra leur attribuer le type <code>EF02</code>. On peut la créer idéalement du secteur 34 au secteur 2047 du disque.
* sda2 et sdb2 : partitions pour le raid root (/). Il faudra leur attribuer le type <code>FD00</code>.
* sda3 et sdb3 : partitions swap séparées. Il faudra leur attribuer le type <code>8200</code>.
 
Notez que la partition du bootloader ne doit pas être formatée.
 
===Possibilité 3 : partitionnement MBR pour BIOS (non prise en charge dans ce wiki)===
 
A titre informatif : création avec <code>parted</code>, sans nécessité de créer une partition dédiée au bootloader/grub.
 
==Création du RAID==
 
Pour des raisons esthétiques, définissez l'hostname de votre système de rescue :
<pre>hostname proxmox</pre>


Pour créer votre raid 1 avec 2 disques :
<pre>
<pre>
pvcreate /dev/sda3
mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2
vgcreate main /dev/sda3
</pre>
</pre>


Nous ne créerons pas de volume logique dans le LVM maintenant. Nous laisserons en effet proxmox et KVM se charger de créer des volumes logiques pour chaque VM.
Notez que si vous souhaitez utiliser plus que 2 disques, il faut augmenter la valeur de <code>--raid-devices</code> et ajouter les partitions des disques à la suite.
 
Attendez que le raid soit synchronisé avant de continuer. Vous pouvez surveiller facilement cela avec la commande <code>watch cat /proc/mdstat</code>.
 
==Création des systèmes de fichiers==
 
Créez un système de fichier ext4 pour le raid du root :
<pre>
mkfs.ext4 /dev/md2
</pre>
 
Enfin, initialisez les swaps :
<pre>
mkswap /dev/sda3
mkswap /dev/sdb3
</pre>


=Installation de proxmox=
=Installation de proxmox=
Ligne 51 : Ligne 91 :
==Installation du système de base==
==Installation du système de base==


<pre>aptitude install debootstrap debian-keyring debian-archive-keyring</pre>
Nous débutons par installer le système de base de Debian avec <code>debootstrap</code>
 
Installez les paquets nécessaires dans votre rescue :
<pre>apt install debootstrap debian-keyring debian-archive-keyring</pre>


Montez votre partition raid root sur <code>/mnt</code> :
<pre>
<pre>
mount /dev/sda1 /mnt
mount /dev/md2 /mnt
</pre>
</pre>


<pre>debootstrap --arch=amd64 buster /mnt http://ftp.fr.debian.org/debian</pre>
Installez le système de base debian, version bookworm :
<pre>debootstrap --arch=amd64 bookworm /mnt http://ftp.fr.debian.org/debian</pre>


==Configuration de Debian==
==Configuration de Debian==


Montez les vfs suivants, puis chrootez dans votre nouveau système debian :
<pre>
<pre>
mount -o bind /proc /mnt/proc
mount -o bind /proc /mnt/proc
mount -o bind /dev /mnt/dev
mount -o bind /dev /mnt/dev
mount -o bind /dev/pts /mnt/dev/pts
mount -o bind /sys /mnt/sys
mount -o bind /sys /mnt/sys
chroot /mnt
chroot /mnt
</pre>
</pre>


Editez le fichier <code>/etc/apt/sources.list</code> :
Configurez les archives apt : éditez le fichier <code>/etc/apt/sources.list</code> :
<pre>
<pre>
deb http://ftp.fr.debian.org/debian buster main contrib non-free
# main archive
deb-src http://ftp.fr.debian.org/debian buster main contrib non-free
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware


#mises à jour de sécurité
# security updates
deb http://security.debian.org/ buster/updates main contrib non-free
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src http://security.debian.org/ buster/updates main contrib non-free
deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware


#anciennement debian-volatile
# bookworm-updates, previously known as 'volatile'
deb http://ftp.fr.debian.org/debian buster-updates main contrib non-free
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src http://ftp.fr.debian.org/debian buster-updates main contrib non-free
deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware


#anciennement backports
# backports archive
#deb http://ftp.fr.debian.org/debian/ buster-backports main contrib non-free
deb http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
</pre>
</pre>


Mettez à jour les paquets :
Mettez à jour les paquets :
<pre>
<pre>
aptitude update
apt update
aptitude safe-upgrade
apt full-upgrade
</pre>
</pre>


Installez les locales et la configuration de console :
Installez les locales et la configuration de console :
<pre>
<pre>
aptitude install locales  
apt install locales  
dpkg-reconfigure locales
dpkg-reconfigure locales
aptitude install console-data console-setup-linux console-setup
apt install console-data console-setup-linux console-setup wget
dpkg-reconfigure console-data # from arch > french > latin9)
dpkg-reconfigure console-data # from arch > french > latin9)
</pre>
</pre>
Ligne 105 : Ligne 154 :
</pre>
</pre>


Installez postfix :
Configurez votre fichier <code>/etc/fstab</code>.<br>
Pour GPT pour EFI / UEFI :
<pre>
# <file system> <mount point>  <type>  <options>                                <dump>  <pass>
/dev/md2        /              ext4    defaults,errors=remount-ro,relatime      0      1
/dev/sda1      /boot/efi      vfat    defaults                                  0      1
/dev/sda3      swap    swap    sw,pri=1                                          0      0
/dev/sdb3      swap    swap    sw,pri=1                                          0      0
</pre>
 
Pour GPT pour BIOS :
<pre>
<pre>
aptitude install postfix
# <file system> <mount point>  <type>  <options>                                <dump>  <pass>
/dev/md2        /              ext4    defaults,errors=remount-ro,relatime      0      1
/dev/sda3      swap    swap    sw,pri=1                                          0      0
/dev/sdb3      swap    swap    sw,pri=1                                          0      0
</pre>
</pre>


Configurez votre /etc/fstab :
Montez la partition EFI / ESP dans le cas d'un partitionnement GPT pour EFI / UEFI :
<pre>
<pre>
# <file system> <mount point>  <type>  <options>      <dump>  <pass>
mkdir /boot/efi
/dev/sda1        /       ext4    errors=remount-ro      0      1
mount /boot/efi
/dev/sda2      swap    swap    defaults        0      0
</pre>
</pre>


/etc/network/interfaces :
Configurez les interfaces réseaux dans <code>/etc/network/interfaces</code> :
<pre>
<pre>
# The loopback network interface
# The loopback network interface
Ligne 123 : Ligne 184 :
iface lo inet loopback
iface lo inet loopback


auto eth0
auto eno3
iface eth0 inet static
iface eno3 inet static
         address XXXX
         address XXXX/24
        netmask 255.255.255.0
        network XXXX
        broadcast XXXX
         gateway XXXX
         gateway XXXX
</pre>
</pre>


/etc/hosts:
Configurez le fichier <code>/etc/hosts</code> :
<pre>
<pre>
# Do not remove the following line, or various programs
# local
# that require network functionality will fail.
127.0.0.1      localhost
127.0.0.1      localhost.localdomain localhost
::1             localhost ip6-localhost ip6-loopback
ipdelamachine    machine.domain.tld machine
ff02::1         ip6-allnodes
# The following lines are desirable for IPv6 capable hosts
ff02::2         ip6-allrouters
#(added automatically by netbase upgrade)
 
::1     ip6-localhost ip6-loopback
# main
feo0::0 ip6-localnet
ipdelamachine  proxmox.domain.tld proxmox pvelocalhost
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
</pre>
</pre>


Définissez les hostnames dans ces fichiers :
<pre>
<pre>
echo votrehostname > /etc/hostname
# Pour celui la : non-fqdn
echo votrehostname > /etc/mailname
echo proxmox > /etc/hostname
# Pour celui la : fqdn
echo proxmox.domain.tld > /etc/mailname
</pre>
</pre>


'''ATTENTION''' Le fichier /etc/hosts DOIT être cohérent avec le fichier /etc/hostname. Par exemple, si le contenu de /etc/hostname est <code>proxmox.domain.tld</code> et que l'ip de votre proxmox est 225.182.54.9 il faudra veiller a avoir les informations suivantes dans <code>/etc/hosts</code> :
'''ATTENTION''' Le fichier <code>/etc/hosts</code> DOIT être cohérent avec le fichier <code>/etc/hostname</code>.<br>
Par exemple, si le contenu de <code>/etc/hostname</code> est <code>proxmox</code> et que l'ip de votre proxmox est 225.182.54.9 il faudra veiller a avoir les informations suivantes dans <code>/etc/hosts</code> :
<pre>
<pre>
127.0.0.1 localhost
127.0.0.1 localhost
225.182.54.9 proxmox.domain.tld proxmox
225.182.54.9 proxmox.domain.tld proxmox pvelocalhost
</pre>
</pre>


N'oubliez pas de configurer les dns (ceux de votre hébergeur dédié) :
'''Attention : n'utilisez pas 127.0.1.1 (comme le fait debian) mais bien la vrai ip (ici 225.182.54.9)'''
 
N'oubliez pas de configurer les dns (ceux de votre hébergeur dédié) dans <code>/etc/resolv.conf</code> :
<pre>nameserver XX.XX.XX.XX</pre>
<pre>nameserver XX.XX.XX.XX</pre>
Installez postfix :
<pre>
hostname -F /etc/hostname
apt install postfix
</pre>
Enfin, comme nous installons notre partition de boot sur un raid software, il faut installer <code>madadm</code> à ce stade :
<pre>apt install mdadm</pre>
Vérifiez si votre array root s'est bien défini automatiquement dans <code>/etc/mdadm/mdadm.conf</code>. Si ce n'est pas me cas, ajoutez la configuration de l'array manuellement :
<pre>mdadm --examine --scan >> /etc/mdadm/mdadm.conf</pre>


==Installation de proxmox - kernel==
==Installation de proxmox - kernel==
Ligne 167 : Ligne 239 :
<pre>
<pre>
# PVE pve-no-subscription repository provided by proxmox.com, NOT recommended for production use
# PVE pve-no-subscription repository provided by proxmox.com, NOT recommended for production use
deb http://download.proxmox.com/debian/pve buster pve-no-subscription
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
</pre>
</pre>


Ajoutez la clé du dépôt proxmox :
Ajoutez la clé du dépôt proxmox :
<pre>
<pre>
wget http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg -O /etc/apt/trusted.gpg.d/proxmox-ve-release-6.x.gpg
wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg  
aptitude update
</pre>
 
Mettez à jour le système :
<pre>
apt update
apt full-upgrade
</pre>
</pre>
===Possibilité 1 : Partitions GPT pour EFI / UEFI===
Vérifiez que <code>/boot/efi</code> est bien monté. Si ce n'est pas le cas, faites le.


Installez le kernel proxmox :
Installez le kernel proxmox :
<pre>
<pre>
aptitude install pve-firmware
apt install pve-firmware
aptitude install pve-kernel-5.0
apt install proxmox-default-kernel grub-efi-amd64 gdisk
</pre>
 
Supprimez les paquets suivant si vous n'avez pas besoin de secureboot :
<pre>apt purge grub-efi-amd64-signed mokutil shim-helpers-amd64-signed shim-signed shim-signed-common shim-unsigned</pre>
 
Normalement tout doit se faire avec des promps. Si ce n'était pas le cas :
<pre>grub-install --bootloader-id=proxmox</pre>
 
Si jamais vous utilisez un démarrage en PXE (c'est le cas sur un serveur OVH par exemple), utilisez l'argument <code>--no-nvram</code> pour empêcher grub de mettre à jour la NVRAM et casser votre mécanique de démarrage PXE :
<pre>grub-install --bootloader-id=proxmox --no-nvram</pre>
 
Etant donné que seul <code>/dev/sda1</code> est monté sur <code>/boot/efi</code>, il faut transférer manuellement les données sur <code>/dev/sdb1</code> :
<pre>
mount /dev/sdb1 /mnt
rsync -av /boot/efi/ /mnt/
umount /mnt
</pre>
</pre>


Si pour une raison quelconque, vous aviez besoin des headers du kernel :
Si pour une raison quelconque, vous aviez besoin des headers du kernel :
<pre>aptitude install pve-headers-5.0</pre>
<pre>apt install pve-headers-5.15</pre>
 
===Possibilité 2 : Partitions GPT pour BIOS OU Partitions MBR pour BIOS===
 
<pre>
apt install pve-firmware
apt install proxmox-default-kernel grub-pc gdisk
</pre>


'''Lorsqu'on vous demandera où installer grub, choisissez sda.'''
Lorsqu'on vous demandera où installer grub, choisissez <code>sda</code> ET <code>sdb</code>. Sinon :
<pre>
grub-install /dev/sda
grub-install /dev/sdb
</pre>


==Installation de proxmox - OpenSSH==
==Installation de proxmox - OpenSSH==
Ligne 191 : Ligne 299 :
Installez openssh et définissez un password root. Autorisez le login root par password temporairement.
Installez openssh et définissez un password root. Autorisez le login root par password temporairement.
<pre>
<pre>
aptitude install openssh-server
hostname -F /etc/hostname
apt install openssh-server
passwd
passwd
sed -i "s/PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config
</pre>
</pre>


==Installation de proxmox - Redémarrage sur le kernel proxmox==
==Installation de proxmox - Vérifications finales et redémarrage sur le kernel proxmox==


Forcez l'utilisation de l'ancien nommage des interfaces réseaux (ethX) dans /etc/default/grub :
Si vous avez une configuration particulière à entrer dans <code>/etc/default/grub</code>, faites le maintenant. Par exemple :
<pre>
<pre>
GRUB_CMDLINE_LINUX="biosdevname=0 net.ifnames=0"
GRUB_CMDLINE_LINUX="nomodeset iommu=pt"
</pre>
</pre>


Puis régénérer la configuration de grub :
Puis régénérez la configuration de grub :
<pre>update-grub</pre>
<pre>update-grub</pre>
Vous pouvez vérifier que votre fstab est valide avec :
<pre>findmnt --verify --verbose</pre>


Vous pouvez maintenant sortir de votre chroot et démonter le système de fichier
Vous pouvez maintenant sortir de votre chroot et démonter le système de fichier


<pre>
<pre>
umount /boot/efi/
exit
exit
umount /mnt/sys
umount /mnt/sys
umount /mnt/dev/pts
umount /mnt/dev
umount /mnt/dev
umount /mnt/proc
umount /mnt/proc
Ligne 216 : Ligne 330 :
</pre>
</pre>


puis rebootez sur le disque dur sur votre kernel pve
Enfin, redémarrez le serveur sur le disque dur.
 
==Installation de ifupdown2==
 
Le paquet <code>ifupdown2</code> est en voie de devenir le remplaçant officiel de <code>ifupdown</code> pour proxmox.
 
<pre>
apt install ifupdown2
apt purge ifupdown
systemctl enable networking
</pre>
 
Pour vérifier que votre configuration est fonctionnelle : lancez <code>ifquery -a</code>
 
Redémarrez à nouveau votre serveur


==Installation de proxmox - pve==
==Installation de proxmox - pve==


Une fois le reboot effectué, vérifiez que vous etes sur le bon kernel avec <code>uname -a</code>
Une fois le redémarrage effectué, vous allez enfin pouvoir installer pve :
<pre>apt install proxmox-ve ksm-control-daemon chrony</pre>
<pre>apt remove os-prober</pre>


Si c'est le cas, vous pouvez installer pve :
Editez la configuration réseau <code>/etc/network/interfaces</code> afin d'y créer votre bridge :
<pre>aptitude install ntp lvm2</pre>
<pre>aptitude install proxmox-ve ksm-control-daemon</pre>
 
Supprimez eth0 de votre fichier <code>/etc/network/interfaces</code> et ajoutez y ceci :
<pre>
<pre>
auto eth0
auto eno3
iface eth0 inet manual
iface eno3 inet manual


auto vmbr0
auto vmbr0
iface vmbr0 inet static
iface vmbr0 inet static
         address xxxxx
         address xxxxx/24
        netmask 255.255.255.0
        network xxxx
        broadcast xxxx
         gateway xxxx
         gateway xxxx
         bridge_ports eth0
        hwaddress AA:BB:CC:11:22:33
         bridge_ports eno3
         bridge_stp off
         bridge_stp off
         bridge_fd 0
         bridge_fd 0
</pre>
</pre>


Installez votre clé SSH et désactivez le login root par password de OpenSSH dans <code>/etc/ssh/sshd_config</code>
Définissez la ligne <code>hwaddress</code> avec l'adresse MAC de l'interface eno3.
 
Installez votre clé SSH dans <code>/root/.ssh/authorized_keys</code> puis désactivez le login root par password de OpenSSH dans <code>/etc/ssh/sshd_config</code>.
<br><br>
 
Une fois tout installé, je vous conseille de reconfigurer grub afin de mettre à jour la configuration interne de debian:
* Pour EFI : <code>dpkg-reconfigure grub-efi-amd64</code>
* Pour BIOS : <code>dpkg-reconfigure grub-pc</code>


Rebootez une dernière fois pour appliquer les changements.
<br>
Redémarrez une dernière fois pour appliquer les changements.


Votre proxmox sera accessible à l'adresse https://ip:8006
Votre proxmox sera accessible à l'adresse https://ip:8006
==Nettoyage des paquets==
Si vous ne comptez pas utiliser ZFS, vous pouvez supprimer les paquets suivantes :
<pre>apt purge zfs-zed libnvpair3linux libuutil3linux libzfs4linux libzpool5linux zfsutils-linux</pre>


==Configuration réseau avancée==
==Configuration réseau avancée==


===Ajout d'une IPv6 sur vmbr0===
===Ajout d'une IPv6 sur vmbr0===
Ajoutez les lignes suivantes dans /etc/network/interfaces
<pre>
iface vmbr0 inet6 static
        address <votreipv6>
        netmask <votre masque ipv6 (généralement 64)
</pre>
Il est aussi capital d'adapter votre fichier /etc/hosts en fonction de toutes les IPs (qu'elles soient ipv4 ou ipv6 que vous configurez sur votre hôte). En effet, proxmox se sert du fichier /etc/hosts pour déterminer des éléments de configuration locale.


===Ajout d'un réseau interne vmbr1===
===Ajout d'un réseau interne vmbr1===
Ligne 272 : Ligne 401 :
         address  192.168.0.1
         address  192.168.0.1
         netmask  255.255.255.0
         netmask  255.255.255.0
        broadcast 192.168.0.255
        bridge_ports dummy0
        bridge_stp off
        bridge_fd 0
</pre>
</pre>


Si vous voulez utiliser deux interfaces internes, ajoutez la ligne suivante dans <code>/etc/modprobe.d/local.conf</code> :
<pre>
options dummy numdummies=2
</pre>
Note : vous pouvez faire de même en ipv6 :
Note : vous pouvez faire de même en ipv6 :
* il faut utiliser le range fd00::/8 (http://en.wikipedia.org/wiki/Unique_Local_Address)
* il faut utiliser le range Unique Local Address (ULA) fd00::/8 (http://en.wikipedia.org/wiki/Unique_Local_Address)
* pour générer votre ula : http://pfoo.csnu.org/ula/gen-ula.html
* pour générer votre ULA : http://pfoo.unscdf.org/ula/gen-ula.html


==Sécurisation de base==
==Sécurisation de base==


Je vous conseil de commencer à sécuriser votre ssh :
Je vous conseil de commencer à sécuriser votre ssh :
* désactivez le login root (directive <code>PermitRootLogin no</code> dans <code>/etc/ssh/sshd_config</code>). Pensez à créer un utilisateur pour vous connecter en ssh avant de désactiver le login root.
* désactivez le login root (directive <code>PermitRootLogin no</code> dans <code>/etc/ssh/sshd_config</code>). Pensez néanmoins à créer un utilisateur pour vous connecter en ssh avant de désactiver le login root.
* utilisez la directive <code>allowusers <user></code> dans <code>/etc/ssh/sshd_config</code> pour n'autoriser que certains utilisateurs à se connecter en ssh
* utilisez la directive <code>allowusers <user></code> dans <code>/etc/ssh/sshd_config</code> pour n'autoriser que certains utilisateurs à se connecter en ssh.
 
===Protéger l'interface web avec fail2ban===
 
<pre>aptitude install fail2ban</pre>


Créez le fichier <code>/etc/fail2ban/jail.local</code> contenant :
Il est aussi préférable d'installer le serveur de temps NTP à la place de systemd-timesyncd:
<pre>
<pre>
[DEFAULT]
apt install chrony
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
apt purge systemd-timesyncd
ignoreip = 127.0.0.1
bantime  = 1800
maxretry = 3
 
#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = root@localhost
 
action = %(action_mwl)s
 
[ssh]
enabled = false
 
[sshd]
enabled  = false
 
[proxmox]
enabled = true
port = https,http,8006
filter = proxmox
logpath = /var/log/daemon.log
maxretry = 4
bantime = 3600 #1 heure
</pre>
 
Créez le fichier <code>/etc/fail2ban/filter.d/proxmox.conf</code> :
<pre>
[Definition]
failregex = pvedaemon\[.*authentication failure; rhost=<HOST> user=.* msg=.*
ignoreregex =
</pre>
</pre>
Vous pouvez tester votre configuration avec la commande <code>fail2ban-regex /var/log/daemon.log /etc/fail2ban/filter.d/proxmox4.conf</code>
Relancez fail2ban :
<pre>/etc/init.d/fail2ban restart</pre>


=Configurer le serveur mail postfix=
=Configurer le serveur mail postfix=


==Configuration==
==Configuration==
Par défaut, postfix fournit une configuration suffisante. Voici les modifications que j'y ai apporté :
<pre>
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
disable_vrfy_command = yes
smtpd_helo_required = yes
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
mydomain = proxmox.domain.tld
append_dot_mydomain = yes
myhostname = proxmox.domain.tld
myorigin = /etc/mailname
mydestination = proxmox.domain.tld, localhost.localdomain, localhost
relayhost =
smtp_sasl_password_maps =
mynetworks = 127.0.0.0/8, [::1], ipv4_de_votre_serveur, [ipv6_de_votre_serveur]
relay_domains =
relay_recipient_maps =
inet_interfaces = 127.0.0.1, [::1], ipv4_de_votre_serveur, [ipv6_de_votre_serveur]
inet_protocols = all
alias_maps = proxy:hash:/etc/aliases
smtpd_sasl_auth_enable = no
smtpd_sasl_local_domain = $myhostname
smtpd_sender_restrictions =
  reject_unknown_sender_domain,
  reject_non_fqdn_sender
smtpd_recipient_restrictions =
  permit_inet_interfaces,
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unauth_destination
smtpd_client_restrictions =
  permit_inet_interfaces,
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_pipelining
smtpd_helo_restrictions =
  permit_inet_interfaces,
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_invalid_helo_hostname,
  reject_non_fqdn_helo_hostname,
  reject_unknown_helo_hostname
smtpd_data_restrictions =
  permit_inet_interfaces,
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unauth_pipelining
</pre>
Il faudra évidemment configurer les directives <code>inet_interfaces</code> <code>myhostname</code> et <code>mydomain</code>


==Certificats SSL==
==Certificats SSL==
Si vous avez votre propre autorité ssl, vous pouvez générer votre propre certificat. Si ce n'est pas le cas, vous pouvez toujours aller lire [http://wiki.csnu.org/index.php?title=Installation_et_configuration_de_OpenSSL ceci] afin d'apprendre à créer votre autorité ssl.
Si vous avez votre propre autorité ssl, vous pouvez générer votre propre certificat. Si ce n'est pas le cas, vous pouvez toujours aller lire [http://wiki.unscdf.org/index.php?title=Installation_et_configuration_de_OpenSSL ceci] afin d'apprendre à créer votre autorité ssl.


Ajoutez les lignes suivantes dans <code>/etc/ssl/openssl.cnf</code> :
Ajoutez les lignes suivantes dans <code>/etc/ssl/openssl.cnf</code> :
Ligne 429 : Ligne 439 :
</pre>
</pre>


Puis générez la clé et le certificat, et signez le avec votre autorité (onyx_ca dans mon cas) :
Puis générez la clé et le certificat, et signez le avec votre autorité (int_ca dans mon cas) :
<pre>
<pre>
openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:2048 -keyout postfix.key -out postfix.req
openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:2048 -keyout postfix.key -out postfix.req
openssl ca -config /etc/ssl/openssl.cnf -name onyx_ca -extensions POSTFIX -in postfix.req -out postfix.pem
openssl ca -config /etc/ssl/openssl.cnf -name int_ca -extensions POSTFIX -in postfix.req -out postfix.pem
</pre>
</pre>


Déplacez les fichiers dans le répertoire <code>/etc/postfix/ssl</code>:
Déplacez les fichiers dans le répertoire <code>/etc/postfix/ssl</code> :
<pre>
<pre>
mkdir /etc/postfix/ssl
mkdir /etc/postfix/ssl
Ligne 441 : Ligne 451 :
mv postfix.pem /etc/postfix/ssl/
mv postfix.pem /etc/postfix/ssl/
chmod 600 /etc/postfix/ssl/*
chmod 600 /etc/postfix/ssl/*
cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/onyx_ca/onyx_ca.pem > /etc/postfix/ssl/ca_chain.pem
cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/int_ca/int_ca.pem > /etc/postfix/ssl/ca_chain.pem
</pre>
</pre>


Ligne 458 : Ligne 468 :
smtpd_tls_loglevel = 1
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1
smtp_tls_loglevel = 1


#smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
#smtp_tls_policy_maps = hash:/etc/postfix/tls_policy
</pre>
</pre>


=Utiliser son propre certificat SSL avec un signataire intermédiaire=
=Utiliser son propre certificat SSL proxmox avec un signataire intermédiaire=
 
Attention, pour que les consoles vnc fonctionnent, les fichiers .pem et .key ne doivent contenir rien d'autre que les données contenues entre <code>-----BEGIN CERTIFICATE-----</code> et <code>-----END CERTIFICATE-----</code> ou entre <code>-----BEGIN RSA PRIVATE KEY-----</code> et <code>-----END RSA PRIVATE KEY-----</code>.
 
<br/>Admettons que vous avez la chaine de certification suivante suivante :
* une CA : root_ca.pem
* une ca intermédiaire 1 int_ca.pem (signée par root_ca)
* un certificat serveur proxmox : proxmox.pem et proxmox.key (signé par proxmox_ca). Si vous êtes client d'une autorité de certification, c'est ces fichiers que l'autorité doit avoir signé.
 
<br/>La configuration de proxmox se fera de la manière suivante :
* Le fichier <code>proxmox.key</code> va dans <code>/etc/pve/local/pve-ssl.key</code>
** cp proxmox.key /etc/pve/local/pve-ssl.key
 
* Les fichiers <code>int_ca.pem</code> et <code>root_ca</code> vont dans <code>/etc/pve/pve-root-ca.pem</code> dans l'ordre leaf-to-root :
** cat int_ca.pem root.pem > /etc/pve/pve-root-ca.pem
 
* Les fichiers <code>proxmox.pem</code> et <code>int_ca.pem</code> vont dans <code>/etc/pve/local/pve-ssl.pem</code> dans l'ordre leaf-to-root :
** cat proxmox.pem int_ca.pem > /etc/pve/local/pve-ssl.pem
 
* <code>/etc/pve/priv/pve-root-ca.key</code> contient normalement la clé privé de la CA proxmox. Vous n'êtes pas obligé d'y placer la clé privé de votre CA, mais dans ce cas proxmox sera incapable de générer automatiquement un certificat lors de l'ajout d'un node si vous montez par la suite un cluster.


* Le fichier <code>/etc/pve/pve-www.key</code> est utilisé uniquement pour la protection CSRF.
Depuis Proxmox 5.2, il n'est plus recommandé d'adapter manuellement les fichiers contenant les certificats et clés privés de proxmox.<br>
 
Cependant, vous pouvez placer directement votre clé privé dans le fichier <code>/etc/pve/local/pveproxy-ssl.key</code> et la chaîne de certification dans le fichier <code>/etc/pve/local/pveproxy-ssl.pem</code>. Vous pouvez également déposer ces fichiers via la webui de proxmox au niveau de chaque serveur.
Notez que <code>root_ca.pem</code> devra être importé dans les certificats trusté de votre navigateur ainsi que dans votre configuration du plugin java de votre navigateur.
 
Notez que si vous créez un cluster, la CA utilisée sera *partagée* entre tous les nodes du cluster ! Si vous générez certains certificats manuellement dans votre cluster, veillez à maintenant le fichier /etc/pve/priv/pve-root-ca.srl à jour.
 
=Configurer les alertes raid software=
 
Une fois votre serveur mail configuré, éditez le fichier <code>/etc/mdadm/mdadm.conf</code> et définissez l'adresse à laquelle vous souhaitez recevoir les alertes à la ligne <code>MAILADDR</code>
 
Relancez mdadm :
<pre>/etc/init.d/mdadm restart</pre>


=Surveiller l'état des disques avec SMART=
=Surveiller l'état des disques avec SMART=


Commencez par installer le paquet smartmontools :
Commencez par installer le paquet smartmontools :
<pre>aptitude install smartmontools</pre>
<pre>apt install smartmontools</pre>


Vérifiez que vos disques gèrent smart et qu'il est activé :
Vérifiez que vos disques gèrent smart et qu'il est activé :
Ligne 510 : Ligne 490 :
Si smart n'est pas activé, essayez de l'activer comme ceci :
Si smart n'est pas activé, essayez de l'activer comme ceci :
<pre>
<pre>
smartctl -s on -d ata /dev/sda
smartctl -s on /dev/sda
smartctl -s on /dev/sdb
</pre>
</pre>


Ligne 528 : Ligne 509 :
Si vous voyez <code>No Errors Logged</code> ou quelques erreurs, c'est bon. S'il y eu a beaucoup, il faut envisager de changer le disque.
Si vous voyez <code>No Errors Logged</code> ou quelques erreurs, c'est bon. S'il y eu a beaucoup, il faut envisager de changer le disque.


Pour autoriser le lancement de smartd, éditez le fichier <code>/etc/default/smartmontools</code> ainsi :
Le fichier de configuration de smartd est <code>/etc/smartd.conf</code>. Commentez la ligne <code>DEVICESCAN</code> puis ajoutez les lignes suivantes pour surveiller les deux disques durs :
<pre>
<pre>
# uncomment to start smartd on system startup
/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03) -m vous@domain.tld
start_smartd=yes
/dev/sdb -a -o on -S on -s (S/../.././02|L/../../6/03) -m vous@domain.tld
</pre>
 
Nous activons la surveillance globale (<code>-a</code>), la vérification automatique offline, (<code>-o on</code>), la sauvegarde automatique des attributs (<code>-S on</code> et lançons un <code>short self test</code> tous les jours à 2h du matin, et un <code>long self test</code> tous les samedi à 3h du matin. Si des erreurs sont détectés, un email est envoyé à vous@domain.tld.<br>


# uncomment to pass additional options to smartd on startup
Relancez smartd :
smartd_opts="--interval=1800"
<pre>/etc/init.d/smartmontools restart</pre>
</pre>
 
Pour plus d'information sur SMART et ses arguments : [[Diagnostic smart d'un disque]]
 
=Protégez votre proxmox=
 
==Désactiver le login root sur l'interface proxmox==
Avant toute manipulation, n'oubliez pas de créer un utilisateur ayant les droits d'administration pour accéder à l'interface de proxmox
 
===Via l'interface proxmox===
Dans Datacenter > Permissions > Users : Editez l'utilisateur root et décochez la case <code>Enabled</code>
 
===Via les droits linux===
<pre>passwd --lock root</pre>
 
Attention, dans ce cas, vous ne pourrez plus vous loguer en root sur le serveur par ssh (sauf si vous avez une clé ssh défini), écran ou kvm !


Le fichier de configuration de smartd est <code>/etc/smartd.conf</code>. Commentez la ligne <code>DEVICESCAN</code> puis ajoutez les lignes suivantes pour surveiller les deux disques durs :
===Via PAM===
Vous pouvez désactiver le login pam en éditant <code>/etc/pam.d/other</code> et en y ajoutant, en début de fichier, les lignes suivantes :
<pre>
<pre>
/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03) -m mail@domain.tld
auth        required    pam_deny.so
/dev/sdb -a -o on -S on -s (S/../.././02|L/../../6/03) -m mail@domain.tld
auth        required    pam_warn.so
account    required    pam_deny.so
account    required    pam_warn.so
</pre>
</pre>


Nous activons la surveillance de tous les attributs (-a), et lançons un <code>short self test</code> tous les jours à 2h du matin, et un <code>long self test</code> tous les samedi à 3h du matin. Si des erreurs sont détectés, un email est envoyé à mail@domain.tld.
Attention, cette méthode peut avoir des effets de bord si d'autres programmes utilisent l'entité pam/other


Lancez smart :
==Désactiver rpcbind==
<pre>/etc/init.d/smartmontools restart</pre>
 
Si vous n'utilisez pas de montage NFS vous pouvez désactiver rpcbind.<br>
Editez <code>/etc/default/nfs-common</code> et passez l'argument suivant :
<pre>NEED_STATD=no</pre>


=Protéger votre proxmox=
Puis désactivez rpcbind :
<pre>
systemctl disable rpcbind.target
systemctl disable rpcbind.socket
systemctl disable rpcbind.service
systemctl stop rpcbind.target
systemctl stop rpcbind.socket
systemctl stop rpcbind.service
</pre>


==Eviter les reboots accidentels avec molly-gard==
==Eviter les reboots accidentels avec molly-gard==
<pre>aptitude install molly-guard</pre>
<pre>apt install molly-guard</pre>


==sshguard==
==Protection SSH avec sshguard==


[[Protéger SSH avec sshguard]]
[[Protéger SSH avec sshguard]]


==firewall iptables==
==Protéger l'interface web avec fail2ban==
 
<pre>aptitude install fail2ban</pre>
 
Créez le fichier <code>/etc/fail2ban/jail.local</code> contenant :
<pre>
[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1
bantime  = 1800
maxretry = 3
 
#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = root@localhost
 
action = %(action_mwl)s
 
[ssh]
enabled = false


Voici un petit script pour bloquer l'accès ssh, ftp et proxmox aux ips non française
[sshd]
enabled  = false


Attention, ce script doit être lancé APRÈS sshguard, sinon sshguard ne sera plus efficace
[proxmox]
enabled = true
port = https,http,8006
filter = proxmox
logpath = /var/log/daemon.log
maxretry = 4
bantime = 3600 #1 heure
</pre>


Créez le fichier <code>/etc/fail2ban/filter.d/proxmox.conf</code> :
<pre>
<pre>
#! /bin/bash
[Definition]
failregex = pvedaemon\[.*authentication failure; rhost=<HOST> user=.* msg=.*
ignoreregex =
</pre>


trusted_ipv6="blocipv6_1 blocipv6_2"
Vous pouvez tester votre configuration avec la commande <code>fail2ban-regex /var/log/daemon.log /etc/fail2ban/filter.d/proxmox.conf</code>
db=fr.zone
wget http://www.ipdeny.com/ipblocks/data/countries/fr.zone
trusted=$(egrep -v "^#|^$" $db)
rm $db


echo "clearing iptables"
Relancez fail2ban :
/sbin/iptables -t filter -D INPUT -p tcp -i vmbr0 -m multiport --dports 21,22,8006 -j firewall
<pre>/etc/init.d/fail2ban restart</pre>
/sbin/iptables -F firewall
/sbin/iptables -X firewall


echo "adding rules to iptables"
==firewall iptables==
/sbin/iptables -t filter -N firewall
/sbin/iptables -t filter -A INPUT -p tcp -i vmbr0 -m multiport --dports 21,22,8006 -j firewall


for ipblock in $trusted; do
=Création d'un stockage pour les VMs=
        /sbin/iptables -t filter -A firewall -s $ipblock -j ACCEPT
done
/sbin/iptables -t filter -A firewall -j DROP


echo "clearing ip6tables"
Créez les partitions sda4 et sdb4 au moyen de gdisk (EFI) ou parted (BIOS).
/sbin/ip6tables -t filter -D INPUT -p tcp -i vmbr0 -m multiport --dports 21,22,8006 -j firewall
/sbin/ip6tables -F firewall
/sbin/ip6tables -X firewall


echo "adding rules to ip6tables"
Créez sur ces partitions un raid :
/sbin/ip6tables -t filter -N firewall
<pre>mdadm --create --verbose /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4</pre>
/sbin/ip6tables -t filter -A INPUT -p tcp -i vmbr0 -m multiport --dports 21,22,8006 -j firewall


for ipv6 in $trusted_ipv6; do
Maintenez à jour <code>mdadm.conf</code> et votre initramfs afin de conserver le bon naming du raid après reboot :
        /sbin/ip6tables -t filter -A firewall -s $ipv6 -j ACCEPT
<pre>
done
mdadm --examine --scan >> /etc/mdadm/mdadm.conf
/sbin/ip6tables -t filter -A firewall -j DROP
update-initramfs -u
</pre>
</pre>


=VMs=
Puis initialisez-y un LVM :
<pre>
pvcreate /dev/md4
vgcreate main /dev/md4
</pre>
 
Il ne reste plus qu'a déclarer ce Volume Group LVM dans l'interface proxmox.
 
=VM qemu/kvm=


==Télécharger vos images==
==Télécharger vos images==


Vous pouvez placer les iso dans <code>/var/lib/vz/template/iso/</code> avec <code>wget</code> par exemple.
Vous pouvez placer les iso dans <code>/var/lib/vz/template/iso/</code> avec <code>wget</code> par exemple.
Notez que l'interface graphique de proxmox propose une fonction d'upload.
Notez que l'interface graphique de proxmox propose également une fonction d'upload.


==Créer votre première VM==
==Créer votre première VM==
Ligne 642 : Ligne 679 :
Vous pouvez faire de même pour l'ipv6. Dans l'exemple suivant, seul le bloc ipv6 <code>2a01:d4h:123b:100::/56</code> est utilisable par la vm :
Vous pouvez faire de même pour l'ipv6. Dans l'exemple suivant, seul le bloc ipv6 <code>2a01:d4h:123b:100::/56</code> est utilisable par la vm :
<pre>ebtables -A FORWARD -p IPv6 --ip6-src 2a01:d4h:123b:100::/56 -s ! 52:54:00:00:08:b1 -j DROP</pre>
<pre>ebtables -A FORWARD -p IPv6 --ip6-src 2a01:d4h:123b:100::/56 -s ! 52:54:00:00:08:b1 -j DROP</pre>
==Accéder a une VM avec un client vnc==
http://pve.proxmox.com/wiki/Vnc_2.0


==Importer une VM depuis vmware ESXi==
==Importer une VM depuis vmware ESXi==


==qm et modification des VMs en ligne de commande==
==qm et modification des VMs en ligne de commande==
==Protéger SSH dans une VM==
Reportez vous à [[Protéger SSH avec sshguard]]


==Monter les partitions d'une VM depuis l'host==
==Monter les partitions d'une VM depuis l'host==


<pre>
<pre>
~# losetup /dev/loop0 /dev/main/vm-101-disk-1
# losetup /dev/loop0 /dev/main/vm-101-disk-1
# fdisk -lu /dev/loop0  
# fdisk -lu /dev/loop0  


Ligne 673 : Ligne 702 :


pour la partition 1 : start*blocksize = offset
pour la partition 1 : start*blocksize = offset
donc 2048*512 = 1 048 576
donc 2048*512 = 1048576


<pre>losetup /dev/loop1 -o 1048576 /dev/main/vm-101-disk-1 </pre>
<pre>losetup /dev/loop1 -o 1048576 /dev/main/vm-101-disk-1 </pre>
Ligne 687 : Ligne 716 :
</pre>
</pre>


===Si la partition que vous voulez monter est un lvm===
===Si la partition que vous voulez monter est un LVM===


Scannez les nouveaux volumes :
Scannez les nouveaux volumes :
Ligne 731 : Ligne 760 :
Sur votre nouveau serveur, créez une VM identique à celle de votre premier serveur (surtout en qui concerne la taille de disque).
Sur votre nouveau serveur, créez une VM identique à celle de votre premier serveur (surtout en qui concerne la taille de disque).
Depuis server1, copiez avec un dd over ssh le disque d'origine de votre vm vers votre nouveau serveur.
Depuis server1, copiez avec un dd over ssh le disque d'origine de votre vm vers votre nouveau serveur.
<pre>dd if=/dev/main/vm-102-disk-1 | pv -ptrb | ssh -c blowfish -o "Compression no" root@server2.domain.tld "dd of=/dev/main/vm-102-disk-1 bs=100M"</pre>
<pre>dd if=/dev/main/vm-102-disk-1 | pv -ptrb | ssh -o "Compression no" root@server2.domain.tld "dd of=/dev/main/vm-102-disk-1 bs=100M"</pre>


Note : sur un réseauu 100Mbps utilisez plutôt <code>-o "Compressionlevel 1"</code>
Note : sur un réseauu 100Mbps utilisez plutôt <code>-o "Compressionlevel 1"</code>
Ligne 753 : Ligne 782 :


=Annexes=
=Annexes=
==Désactiver le login root sur l'interface proxmox==
Cela n'est malheureusement pas directement supporté par l'interface web, la meilleure solution reste de verrouiller le mot-de-passe de l'utilisateur root :
<pre>passwd --lock root</pre>
Attention vous ne pourrez plus vous loguer en root sur le serveur par ssh (sauf si vous avez une clé ssh défini), écran ou kvm !
N'oubliez pas de créer avant cela un utilisateur ayant les droits d'administration pour accéder à l'interface de proxmox
Une autre solution consiste à créer des utilisateurs pve au lieu de pam, et de désactiver le login pam en éditant <code>/etc/pam.d/other</code> et en y ajoutant, en début de fichier, les lignes suivantes :
<pre>
auth        required    pam_deny.so
auth        required    pam_warn.so
account    required    pam_deny.so
account    required    pam_warn.so
#password      required        pam_deny.so
#session            required    pam_deny.so
</pre>


==Problème de layout dans la console vnc==
==Problème de layout dans la console vnc==
Ligne 778 : Ligne 789 :


Cette erreur est typique sous linux si les routeurs de votre serveur annoncent des blocs IPv6 /56 alors que vous configurez des /64.
Cette erreur est typique sous linux si les routeurs de votre serveur annoncent des blocs IPv6 /56 alors que vous configurez des /64.
Ajouter les lignes suivantes dans votre fichier <code>/etc/sysctl.conf</code> :
Ajouter les lignes suivantes dans un fichier <code>/etc/sysctl.d/local.conf</code> :
<pre>
<pre>
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.lo.autoconf = 0
net.ipv6.conf.eno3.autoconf = 0
net.ipv6.conf.eth0.autoconf = 0
net.ipv6.conf.vmbr0.autoconf = 0
net.ipv6.conf.vmbr0.autoconf = 0
net.ipv6.conf.vmbr1.autoconf = 0
net.ipv6.conf.dummy0.autoconf = 0
</pre>
</pre>
Si vous avez créé d'autres interfaces réseau, il faudra faire selon le même modèle.


Terminez par relancer procps :
Terminez par relancer procps :
Ligne 805 : Ligne 811 :
</pre>
</pre>


==L'interface web ne fonctionne pas, apache n'est pas lancé, et la commande qm retourne une erreur ipcc_send_rec failed: Connection refused==
==L'interface web ne fonctionne pas et la commande qm retourne une erreur ipcc_send_rec failed: Connection refused==


Vérifiez la présence de fichiers et dossiers dans <code>/etc/pve/</code>. Si ce dossier est vide, c'est probablement que votre fichier <code>/etc/hosts</code> est mal configuré.
Vérifiez la présence de fichiers et dossiers dans <code>/etc/pve/</code>. Si ce dossier est vide, c'est probablement que votre fichier <code>/etc/hosts</code> est mal configuré.<br>
Essayez de relancer <code>pve-cluster</code> :
Essayez de relancer <code>pve-cluster</code> :
<pre>/etc/init.d/pve-cluster restart</pre>
<pre>/etc/init.d/pve-cluster restart</pre>
Ligne 821 : Ligne 827 :
Si par exemple <code>/etc/hostname</code> contient <code>proxmox.domain.tld</code> vous devriez avoir la ligne suivante dans <code>/etc/hosts</code> :
Si par exemple <code>/etc/hostname</code> contient <code>proxmox.domain.tld</code> vous devriez avoir la ligne suivante dans <code>/etc/hosts</code> :
<pre>VOTREIP proxmox.domain.tld proxmox</pre>
<pre>VOTREIP proxmox.domain.tld proxmox</pre>
==Gestion du raid virtuel avec mdadm==
<pre>
mdadm --detail /dev/md0
</pre>
<pre>
mdadm --manage /dev/md0 --set-faulty /dev/sdb1
mdadm --manage /dev/md0 --remove /dev/sdb1
mdadm --manage /dev/md0 --add /dev/sdb1
</pre>
Vous pouvez suivre la reconstruction avec
<pre>cat /proc/mdstat</pre>
==Surveillance des disques durs==
<pre>smartctl -t offline /dev/sda</pre>
Pour vérifier le journal d'erreur
<pre>smartctl -l error /dev/sda</pre>
Les selftests :
<pre>
smartctl -t short /dev/sda
smartctl -t long /dev/sda
smartctl -t conveyance /dev/sda
</pre>
Pour vérifier le journal d'erreur des selftests :
<pre>smartctl -l selftest /dev/sda</pre>


==Pas assez d'interfaces loopback==
==Pas assez d'interfaces loopback==

Dernière version du 8 mai 2024 à 18:02


Nous allons voir comment installer proxmox 7.x sur un raid 1 logiciel (md / mdadm) avec debootstrap.

Prérequis

Ce tutoriel se base sur l'utilisation de debootstrap pour installer une base de système d'exploitation debian. La plupart des hébergeurs proposent un système de "rescue" permettant l'installation de debian par ce moyen. Si vous ne disposez pas de mode rescue, vous pouvez toujours utiliser l'installeur proposé par votre hébergeur, ou encore passer par un kvm pour installer vous même le système avec l'iso de debian.

Pour les débutants

Si vous êtes débutant en administration linux, je vous conseil de sauvegarder quelque part les fichier suivant issu d'une précédente installation de debian ou de proxmox

  • /etc/networks
  • /etc/network/interfaces
  • /etc/resolv.conf
  • /etc/hosts
  • /etc/fstab
  • /etc/mdadm/mdadm.conf si vous disposez d'un raid logiciel
  • tout fichier de personnalisation de grub (/etc/grub.d/ par exemple)

Cela vous permettra de vous faire une idée plus précise de ce qui doit figurer dans ces différents fichiers.

Partitionnement et système de fichier

Voici le partitionnement que je vais utiliser :

  • Partition root (/) de 20 Go (/) en raid 1 sur les disques sda et sdb
  • Partitions swap de 4096 Go chacune réparties sur sda et sdb
  • Le reste de l'espace sera utilisé plus tard pour un LVM dédié aux VMs

Partitionnement

Possibilité 1 : Partitionnement GPT pour EFI / UEFI

Nous allons créer avec gdisk 3 partitions sur chaque disque :

  • sda1 et sdb1 : partitions EFI (ESP), obligatoire pour le démarrage EFI/UEFI. Il faudra leur attribuer le type EF00. Pour assurer une bonne compatibilité avec les multiples firmwares EFI, il est recommandé de leur attribuer une taille de 512 MiB (+512M au prompt gdisk).
  • sda2 et sdb2 : partitions pour le raid root (/). Il faudra leur attribuer le type FD00.
  • sda3 et sdb3 : partitions swap séparées. Il faudra leur attribuer le type 8200.


Pour les partitions EFI, nous créons un système de fichier FAT32 avec le label (nom) EFI_SYSPART :

mkfs.fat -F 32 -n EFI_SYSPART /dev/sda1
mkfs.fat -F 32 -n EFI_SYSPART /dev/sdb1

Possibilité 2 : Partitionnement GPT pour BIOS

Nous allons créer avec gdisk 3 partitions sur chaque disque :

  • sda1 et sdb1 : partitions pour le bootloader. Il faudra leur attribuer le type EF02. On peut la créer idéalement du secteur 34 au secteur 2047 du disque.
  • sda2 et sdb2 : partitions pour le raid root (/). Il faudra leur attribuer le type FD00.
  • sda3 et sdb3 : partitions swap séparées. Il faudra leur attribuer le type 8200.

Notez que la partition du bootloader ne doit pas être formatée.

Possibilité 3 : partitionnement MBR pour BIOS (non prise en charge dans ce wiki)

A titre informatif : création avec parted, sans nécessité de créer une partition dédiée au bootloader/grub.

Création du RAID

Pour des raisons esthétiques, définissez l'hostname de votre système de rescue :

hostname proxmox

Pour créer votre raid 1 avec 2 disques :

mdadm --create --verbose /dev/md2 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2

Notez que si vous souhaitez utiliser plus que 2 disques, il faut augmenter la valeur de --raid-devices et ajouter les partitions des disques à la suite.

Attendez que le raid soit synchronisé avant de continuer. Vous pouvez surveiller facilement cela avec la commande watch cat /proc/mdstat.

Création des systèmes de fichiers

Créez un système de fichier ext4 pour le raid du root :

mkfs.ext4 /dev/md2

Enfin, initialisez les swaps :

mkswap /dev/sda3
mkswap /dev/sdb3

Installation de proxmox

Installation du système de base

Nous débutons par installer le système de base de Debian avec debootstrap

Installez les paquets nécessaires dans votre rescue :

apt install debootstrap debian-keyring debian-archive-keyring

Montez votre partition raid root sur /mnt :

mount /dev/md2 /mnt

Installez le système de base debian, version bookworm :

debootstrap --arch=amd64 bookworm /mnt http://ftp.fr.debian.org/debian

Configuration de Debian

Montez les vfs suivants, puis chrootez dans votre nouveau système debian :

mount -o bind /proc /mnt/proc
mount -o bind /dev /mnt/dev
mount -o bind /dev/pts /mnt/dev/pts
mount -o bind /sys /mnt/sys
chroot /mnt

Configurez les archives apt : éditez le fichier /etc/apt/sources.list :

# main archive
deb http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main contrib non-free non-free-firmware

# security updates
deb http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main contrib non-free non-free-firmware

# bookworm-updates, previously known as 'volatile'
deb http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm-updates main contrib non-free non-free-firmware

# backports archive
deb http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware
deb-src http://deb.debian.org/debian bookworm-backports main contrib non-free non-free-firmware

Mettez à jour les paquets :

apt update
apt full-upgrade

Installez les locales et la configuration de console :

apt install locales 
dpkg-reconfigure locales
apt install console-data console-setup-linux console-setup wget
dpkg-reconfigure console-data # from arch > french > latin9)

Définissez la zone horaire :

tzselect
dpkg-reconfigure tzdata

Configurez votre fichier /etc/fstab.
Pour GPT pour EFI / UEFI :

# <file system> <mount point>   <type>  <options>                                 <dump>  <pass>
/dev/md2        /               ext4    defaults,errors=remount-ro,relatime       0       1
/dev/sda1       /boot/efi       vfat    defaults                                  0       1
/dev/sda3       swap    swap    sw,pri=1                                          0       0
/dev/sdb3       swap    swap    sw,pri=1                                          0       0

Pour GPT pour BIOS :

# <file system> <mount point>   <type>  <options>                                 <dump>  <pass>
/dev/md2        /               ext4    defaults,errors=remount-ro,relatime       0       1
/dev/sda3       swap    swap    sw,pri=1                                          0       0
/dev/sdb3       swap    swap    sw,pri=1                                          0       0

Montez la partition EFI / ESP dans le cas d'un partitionnement GPT pour EFI / UEFI :

mkdir /boot/efi
mount /boot/efi

Configurez les interfaces réseaux dans /etc/network/interfaces :

# The loopback network interface
auto lo
iface lo inet loopback

auto eno3
iface eno3 inet static
        address XXXX/24
        gateway XXXX

Configurez le fichier /etc/hosts :

# local
127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

# main
ipdelamachine   proxmox.domain.tld proxmox pvelocalhost

Définissez les hostnames dans ces fichiers :

# Pour celui la : non-fqdn
echo proxmox > /etc/hostname
# Pour celui la : fqdn
echo proxmox.domain.tld > /etc/mailname

ATTENTION Le fichier /etc/hosts DOIT être cohérent avec le fichier /etc/hostname.
Par exemple, si le contenu de /etc/hostname est proxmox et que l'ip de votre proxmox est 225.182.54.9 il faudra veiller a avoir les informations suivantes dans /etc/hosts :

127.0.0.1 localhost
225.182.54.9 proxmox.domain.tld proxmox pvelocalhost

Attention : n'utilisez pas 127.0.1.1 (comme le fait debian) mais bien la vrai ip (ici 225.182.54.9)

N'oubliez pas de configurer les dns (ceux de votre hébergeur dédié) dans /etc/resolv.conf :

nameserver XX.XX.XX.XX

Installez postfix :

hostname -F /etc/hostname
apt install postfix

Enfin, comme nous installons notre partition de boot sur un raid software, il faut installer madadm à ce stade :

apt install mdadm

Vérifiez si votre array root s'est bien défini automatiquement dans /etc/mdadm/mdadm.conf. Si ce n'est pas me cas, ajoutez la configuration de l'array manuellement :

mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Installation de proxmox - kernel

Ajoutez le dépot proxmox dans le fichier /etc/apt/source.list :

# PVE pve-no-subscription repository provided by proxmox.com, NOT recommended for production use
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription

Ajoutez la clé du dépôt proxmox :

wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg 

Mettez à jour le système :

apt update
apt full-upgrade

Possibilité 1 : Partitions GPT pour EFI / UEFI

Vérifiez que /boot/efi est bien monté. Si ce n'est pas le cas, faites le.

Installez le kernel proxmox :

apt install pve-firmware
apt install proxmox-default-kernel grub-efi-amd64 gdisk

Supprimez les paquets suivant si vous n'avez pas besoin de secureboot :

apt purge grub-efi-amd64-signed mokutil shim-helpers-amd64-signed shim-signed shim-signed-common shim-unsigned

Normalement tout doit se faire avec des promps. Si ce n'était pas le cas :

grub-install --bootloader-id=proxmox

Si jamais vous utilisez un démarrage en PXE (c'est le cas sur un serveur OVH par exemple), utilisez l'argument --no-nvram pour empêcher grub de mettre à jour la NVRAM et casser votre mécanique de démarrage PXE :

grub-install --bootloader-id=proxmox --no-nvram

Etant donné que seul /dev/sda1 est monté sur /boot/efi, il faut transférer manuellement les données sur /dev/sdb1 :

mount /dev/sdb1 /mnt
rsync -av /boot/efi/ /mnt/
umount /mnt

Si pour une raison quelconque, vous aviez besoin des headers du kernel :

apt install pve-headers-5.15

Possibilité 2 : Partitions GPT pour BIOS OU Partitions MBR pour BIOS

apt install pve-firmware
apt install proxmox-default-kernel grub-pc gdisk

Lorsqu'on vous demandera où installer grub, choisissez sda ET sdb. Sinon :

grub-install /dev/sda
grub-install /dev/sdb

Installation de proxmox - OpenSSH

Installez openssh et définissez un password root. Autorisez le login root par password temporairement.

hostname -F /etc/hostname
apt install openssh-server
passwd
sed -i "s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g" /etc/ssh/sshd_config

Installation de proxmox - Vérifications finales et redémarrage sur le kernel proxmox

Si vous avez une configuration particulière à entrer dans /etc/default/grub, faites le maintenant. Par exemple :

GRUB_CMDLINE_LINUX="nomodeset iommu=pt"

Puis régénérez la configuration de grub :

update-grub

Vous pouvez vérifier que votre fstab est valide avec :

findmnt --verify --verbose

Vous pouvez maintenant sortir de votre chroot et démonter le système de fichier

umount /boot/efi/
exit
umount /mnt/sys
umount /mnt/dev/pts
umount /mnt/dev
umount /mnt/proc
umount /mnt

Enfin, redémarrez le serveur sur le disque dur.

Installation de ifupdown2

Le paquet ifupdown2 est en voie de devenir le remplaçant officiel de ifupdown pour proxmox.

apt install ifupdown2
apt purge ifupdown
systemctl enable networking

Pour vérifier que votre configuration est fonctionnelle : lancez ifquery -a

Redémarrez à nouveau votre serveur

Installation de proxmox - pve

Une fois le redémarrage effectué, vous allez enfin pouvoir installer pve :

apt install proxmox-ve ksm-control-daemon chrony
apt remove os-prober

Editez la configuration réseau /etc/network/interfaces afin d'y créer votre bridge :

auto eno3
iface eno3 inet manual

auto vmbr0
iface vmbr0 inet static
        address xxxxx/24
        gateway xxxx
        hwaddress AA:BB:CC:11:22:33
        bridge_ports eno3
        bridge_stp off
        bridge_fd 0

Définissez la ligne hwaddress avec l'adresse MAC de l'interface eno3.

Installez votre clé SSH dans /root/.ssh/authorized_keys puis désactivez le login root par password de OpenSSH dans /etc/ssh/sshd_config.

Une fois tout installé, je vous conseille de reconfigurer grub afin de mettre à jour la configuration interne de debian:

  • Pour EFI : dpkg-reconfigure grub-efi-amd64
  • Pour BIOS : dpkg-reconfigure grub-pc


Redémarrez une dernière fois pour appliquer les changements.

Votre proxmox sera accessible à l'adresse https://ip:8006

Nettoyage des paquets

Si vous ne comptez pas utiliser ZFS, vous pouvez supprimer les paquets suivantes :

apt purge zfs-zed libnvpair3linux libuutil3linux libzfs4linux libzpool5linux zfsutils-linux

Configuration réseau avancée

Ajout d'une IPv6 sur vmbr0

Ajout d'un réseau interne vmbr1

Nous allons voir comment créer un réseau interne avec proxmox, c'est à dire, un réseau qui ne sera attaché à aucune interface réseau physique. L'intérêt est d'offrir un débit bien supérieur pour les communications entre les VMs.

Ajoutez les lignes suivantes dans /etc/network/interfaces :

auto vmbr1
iface vmbr1 inet static
        address  192.168.0.1
        netmask  255.255.255.0

Note : vous pouvez faire de même en ipv6 :

Sécurisation de base

Je vous conseil de commencer à sécuriser votre ssh :

  • désactivez le login root (directive PermitRootLogin no dans /etc/ssh/sshd_config). Pensez néanmoins à créer un utilisateur pour vous connecter en ssh avant de désactiver le login root.
  • utilisez la directive allowusers <user> dans /etc/ssh/sshd_config pour n'autoriser que certains utilisateurs à se connecter en ssh.

Il est aussi préférable d'installer le serveur de temps NTP à la place de systemd-timesyncd:

apt install chrony
apt purge systemd-timesyncd

Configurer le serveur mail postfix

Configuration

Certificats SSL

Si vous avez votre propre autorité ssl, vous pouvez générer votre propre certificat. Si ce n'est pas le cas, vous pouvez toujours aller lire ceci afin d'apprendre à créer votre autorité ssl.

Ajoutez les lignes suivantes dans /etc/ssl/openssl.cnf :

[POSTFIX]
nsComment                       = "SMTP Server Certificate"
subjectKeyIdentifier            = hash
authorityKeyIdentifier          = keyid,issuer:always
issuerAltName                   = issuer:copy
basicConstraints                = critical,CA:FALSE
keyUsage                        = critical, digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

Puis générez la clé et le certificat, et signez le avec votre autorité (int_ca dans mon cas) :

openssl req -config /etc/ssl/openssl.cnf -nodes -newkey rsa:2048 -keyout postfix.key -out postfix.req
openssl ca -config /etc/ssl/openssl.cnf -name int_ca -extensions POSTFIX -in postfix.req -out postfix.pem

Déplacez les fichiers dans le répertoire /etc/postfix/ssl :

mkdir /etc/postfix/ssl
mv postfix.key /etc/postfix/ssl/
mv postfix.pem /etc/postfix/ssl/
chmod 600 /etc/postfix/ssl/*
cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/int_ca/int_ca.pem > /etc/postfix/ssl/ca_chain.pem

Il faut encore modifier /etc/postfix/main.cf :

smtpd_tls_cert_file=/etc/postfix/ssl/postfix.pem
smtpd_tls_key_file=/etc/postfix/ssl/postfix.key
smtpd_tls_CAfile=/etc/postfix/ssl/ca_chain.pem
smtpd_use_tls=yes
smtp_tls_cert_file=/etc/postfix/ssl/postfix.pem
smtp_tls_key_file=/etc/postfix/ssl/postfix.key
smtp_tls_CAfile=/etc/postfix/ssl/ca_chain.pem

smtpd_tls_security_level=may
smtp_tls_security_level=may
smtpd_tls_loglevel = 1
smtp_tls_loglevel = 1

#smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

Utiliser son propre certificat SSL proxmox avec un signataire intermédiaire

Depuis Proxmox 5.2, il n'est plus recommandé d'adapter manuellement les fichiers contenant les certificats et clés privés de proxmox.
Cependant, vous pouvez placer directement votre clé privé dans le fichier /etc/pve/local/pveproxy-ssl.key et la chaîne de certification dans le fichier /etc/pve/local/pveproxy-ssl.pem. Vous pouvez également déposer ces fichiers via la webui de proxmox au niveau de chaque serveur.

Surveiller l'état des disques avec SMART

Commencez par installer le paquet smartmontools :

apt install smartmontools

Vérifiez que vos disques gèrent smart et qu'il est activé :

smartctl -i /dev/sda
smartctl -i /dev/sdb

Si smart n'est pas activé, essayez de l'activer comme ceci :

smartctl -s on /dev/sda
smartctl -s on /dev/sdb

Vérifiez le statut de santé de vos disques :

smartctl -H /dev/sda
smartctl -H /dev/sdb

S'il indique PASSED c'est bon de ce côté. S'il vous indique FAILED, sauvegardez immédiatement vos données !

Vérifiez la présence d'erreurs dans le log smart :

smartctl -l error /dev/sda
smartctl -l error /dev/sdb

Si vous voyez No Errors Logged ou quelques erreurs, c'est bon. S'il y eu a beaucoup, il faut envisager de changer le disque.

Le fichier de configuration de smartd est /etc/smartd.conf. Commentez la ligne DEVICESCAN puis ajoutez les lignes suivantes pour surveiller les deux disques durs :

/dev/sda -a -o on -S on -s (S/../.././02|L/../../6/03) -m vous@domain.tld
/dev/sdb -a -o on -S on -s (S/../.././02|L/../../6/03) -m vous@domain.tld

Nous activons la surveillance globale (-a), la vérification automatique offline, (-o on), la sauvegarde automatique des attributs (-S on et lançons un short self test tous les jours à 2h du matin, et un long self test tous les samedi à 3h du matin. Si des erreurs sont détectés, un email est envoyé à vous@domain.tld.

Relancez smartd :

/etc/init.d/smartmontools restart

Pour plus d'information sur SMART et ses arguments : Diagnostic smart d'un disque

Protégez votre proxmox

Désactiver le login root sur l'interface proxmox

Avant toute manipulation, n'oubliez pas de créer un utilisateur ayant les droits d'administration pour accéder à l'interface de proxmox

Via l'interface proxmox

Dans Datacenter > Permissions > Users : Editez l'utilisateur root et décochez la case Enabled

Via les droits linux

passwd --lock root

Attention, dans ce cas, vous ne pourrez plus vous loguer en root sur le serveur par ssh (sauf si vous avez une clé ssh défini), écran ou kvm !

Via PAM

Vous pouvez désactiver le login pam en éditant /etc/pam.d/other et en y ajoutant, en début de fichier, les lignes suivantes :

auth        required    pam_deny.so
auth        required    pam_warn.so
account     required    pam_deny.so
account     required    pam_warn.so

Attention, cette méthode peut avoir des effets de bord si d'autres programmes utilisent l'entité pam/other

Désactiver rpcbind

Si vous n'utilisez pas de montage NFS vous pouvez désactiver rpcbind.
Editez /etc/default/nfs-common et passez l'argument suivant :

NEED_STATD=no

Puis désactivez rpcbind :

systemctl disable rpcbind.target
systemctl disable rpcbind.socket
systemctl disable rpcbind.service
systemctl stop rpcbind.target
systemctl stop rpcbind.socket
systemctl stop rpcbind.service

Eviter les reboots accidentels avec molly-gard

apt install molly-guard

Protection SSH avec sshguard

Protéger SSH avec sshguard

Protéger l'interface web avec fail2ban

aptitude install fail2ban

Créez le fichier /etc/fail2ban/jail.local contenant :

[DEFAULT]
# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1
bantime  = 1800
maxretry = 3

#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = root@localhost

action = %(action_mwl)s

[ssh]
enabled = false

[sshd]
enabled  = false

[proxmox]
enabled = true
port = https,http,8006
filter = proxmox
logpath = /var/log/daemon.log
maxretry = 4
bantime = 3600 #1 heure

Créez le fichier /etc/fail2ban/filter.d/proxmox.conf :

[Definition]
failregex = pvedaemon\[.*authentication failure; rhost=<HOST> user=.* msg=.*
ignoreregex =

Vous pouvez tester votre configuration avec la commande fail2ban-regex /var/log/daemon.log /etc/fail2ban/filter.d/proxmox.conf

Relancez fail2ban :

/etc/init.d/fail2ban restart

firewall iptables

Création d'un stockage pour les VMs

Créez les partitions sda4 et sdb4 au moyen de gdisk (EFI) ou parted (BIOS).

Créez sur ces partitions un raid :

mdadm --create --verbose /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4

Maintenez à jour mdadm.conf et votre initramfs afin de conserver le bon naming du raid après reboot :

mdadm --examine --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u

Puis initialisez-y un LVM :

pvcreate /dev/md4
vgcreate main /dev/md4

Il ne reste plus qu'a déclarer ce Volume Group LVM dans l'interface proxmox.

VM qemu/kvm

Télécharger vos images

Vous pouvez placer les iso dans /var/lib/vz/template/iso/ avec wget par exemple. Notez que l'interface graphique de proxmox propose également une fonction d'upload.

Créer votre première VM

Une fois la VM crées dans l'interface proxmox, je vous recommande d'écrire des zero sur son disque afin de réduire la taille des futurs backups. Si votre vm porte le numéro 100 et possède un seul disque :

dd if=/dev/zero | pv -ptrb | dd of=/dev/main/vm-100-disk1 bs=1M

Configuration réseau en bridge vmbr0 (ip public)

Configuration réseau en bridge vmbr1 (ip locale)

Configuration réseau de la VM :

iface eth0 inet static
address 192.168.0.2
netmask 255.255.255.0
gateway 192.168.0.1

Règle iptables à ajouter sur l'hôte :

iptables -t nat -A POSTROUTING -s 192.168.0.2 -o vmbr0 -j SNAT --to IP-PUBLIC-DE-VOTRE-HOTE

Si vous souhaitez rendre accessible l'un des services de la VM depuis l'ip de l'hote sur un port sépcifique :

iptables -t nat -A PREROUTING -p tcp -d <ip de l'hote> --dport <port souhaité> -i vmbr0 -j DNAT --to-destination 192.168.0.2:port

Bloquer le spoofing d'adresse mac

Sur l'hyperviseur, installez ebtables :

aptitude install ebtables

Admettons ensuite que votre VM a comme adresse ip 84.93.26.3 et que son adresse mac doit être 52:54:00:00:98:b6 :

ebtables -A FORWARD -p IPv4 --ip-src 84.93.26.3 -s ! 52:54:00:00:98:b6 -j DROP

Vous pouvez faire de même pour l'ipv6. Dans l'exemple suivant, seul le bloc ipv6 2a01:d4h:123b:100::/56 est utilisable par la vm :

ebtables -A FORWARD -p IPv6 --ip6-src 2a01:d4h:123b:100::/56 -s ! 52:54:00:00:08:b1 -j DROP

Importer une VM depuis vmware ESXi

qm et modification des VMs en ligne de commande

Monter les partitions d'une VM depuis l'host

# losetup /dev/loop0 /dev/main/vm-101-disk-1
# fdisk -lu /dev/loop0 

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x0002f94d

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        2048    20013055    10005504   83  Linux
/dev/loop0p2        20015102    20969471      477185    5  Extended
/dev/loop0p5        20015104    20969471      477184   82  Linux swap / Solaris

pour la partition 1 : start*blocksize = offset donc 2048*512 = 1048576

losetup /dev/loop1 -o 1048576 /dev/main/vm-101-disk-1 

Et enfin :

mount /dev/loop1 /mnt

Quand vous avez terminé vos modifications :

umount /mnt
losetup -d /dev/loop1
losetup -d /dev/loop0

Si la partition que vous voulez monter est un LVM

Scannez les nouveaux volumes :

lvm pvscan

Activez les groupes :

lvm vgchange -ay

listez les lvms avec :

lvm lvs

Les LV devraient apparaître dans /dev/mapper/

Quand vous avez terminé :

  • démontez les LV
  • Désactivez le groupe avec vgchange -an
  • désactivez le loopback : losetup -d /dev/loop0

Augmenter la taille du disque d'une VM

Coupez la VM.

Sur l'host pour modifier la taille du disque 1 de la vm 110 ) 140G :

lvextend -L 140G /dev/main/vm-110-disk-1

Il faut ensuite, sur la vm lancée, utiliser resize2fs

Migrer une VM vers un autre serveur manuellement (pas de cluster) avec un downtime minimum

Nous allons voir comment migrer une VM proxmox stockée sur un LVM d'un serveur à un autre, et ce, en minimisant au maximum le downtime. Pour cela, nous allons coupler la fonctionnalité de snapshot de lvm avec un petit script (lvmsync) qui permet de ne transférer que les blocs modifiés d'un snapshot.

Installez dmsetup et ruby (1.8 minimum) sur le serveur d'origine et de destination :

aptitude install dmsetup ruby

Récupérez lvmsync sur https://github.com/mpalmer/lvmsync et placez le dans /sbin/ sur les serveurs d'origine et de destination.

Dans cet exemple, nous allons migrer la vm 102 disposant d'un seul disque virtuel nommé vm-102-disk-1 et stocké dans le vg main du serveur server1.domain.tld vers le serveur server2.domain.tld. Pour commencer, créez un snapshot de votre vm sur server1 :

lvcreate --snapshot -L200G -n 102-lvmsync main/vm-102-disk-1

Désormais, tous les io de cette vm seront stockés dans le snapshot 102-lvmsync.

Sur votre nouveau serveur, créez une VM identique à celle de votre premier serveur (surtout en qui concerne la taille de disque). Depuis server1, copiez avec un dd over ssh le disque d'origine de votre vm vers votre nouveau serveur.

dd if=/dev/main/vm-102-disk-1 | pv -ptrb | ssh -o "Compression no" root@server2.domain.tld "dd of=/dev/main/vm-102-disk-1 bs=100M"

Note : sur un réseauu 100Mbps utilisez plutôt -o "Compressionlevel 1"

Une fois la copie terminée, coupez la vm 102 sur server1, puis lancez lvmsync sur le snapshot (toujours sur server1) :

lvmsync /dev/main/102-lvmsync server2.domain.tld:/dev/main/vm-102-disk-1

Une fois le travail de lvmsync achevé, il ne nous reste plus qu'a relancer la vm sur server2

A titre d'information, si vous voulez merger le snapshot de la vm 102 sur server 1, tapez :

lvconvert --merge /dev/main/102-lvmsync

Conteneur LXC

Empêcher la mise à jour automatique de certains fichiers de configuration système du conteneur

Certains fichiers de configuration du conteneur sont mis à jour automatiquement à chaque démarrage (voir https://pve.proxmox.com/pve-docs/pve-admin-guide.html#_guest_operating_system_configuration)

On peut empêcher la mise à jour de ces fichiers en créant un fichier .pve-ignore.NOM
Par exemple, /etc/.pve-ignore.resolv.conf empêchera le fichier /etc/resolv.conf d'être mis à jour à chaque démarrage.

Annexes

Problème de layout dans la console vnc

Dans l'interface web de proxmox : datacenter > option > passez Keyboard de default à French.

Erreurs du type IPv6 addrconf: prefix with wrong length 56

Cette erreur est typique sous linux si les routeurs de votre serveur annoncent des blocs IPv6 /56 alors que vous configurez des /64. Ajouter les lignes suivantes dans un fichier /etc/sysctl.d/local.conf :

net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.eno3.autoconf = 0
net.ipv6.conf.vmbr0.autoconf = 0

Terminez par relancer procps :

/etc/init.d/procps restart

paramètre sysctl ipv6 non appliqué au boot

Ajoutez le module ipv6 dans /etc/modules afin d'assurer le chargement d'ipv6 avant l’exécution de sysctl :

echo ipv6 >> /etc/modules

LVM inaccessible depuis l'host

lvm pvscan
lvm vgchange -ay

L'interface web ne fonctionne pas et la commande qm retourne une erreur ipcc_send_rec failed: Connection refused

Vérifiez la présence de fichiers et dossiers dans /etc/pve/. Si ce dossier est vide, c'est probablement que votre fichier /etc/hosts est mal configuré.
Essayez de relancer pve-cluster :

/etc/init.d/pve-cluster restart

Si vous avez une erreur ou un warning, lancez la commande pmxcfs. Vous devriez obtenir ceci :

$# pmxcfs 
Jan 21 15:28:19 proxmox pmxcfs[1846]: Unable to get local IP address (pmxcfs.c:721:main)

Vérifiez alors que le contenu de /etc/hostname est défini dans /etc/hosts.

Si par exemple /etc/hostname contient proxmox.domain.tld vous devriez avoir la ligne suivante dans /etc/hosts :

VOTREIP proxmox.domain.tld proxmox

Pas assez d'interfaces loopback

Créer le fichier /etc/modprobe.d/local-loop.conf contenant :

options loop max_loop=64

Vous pouvez ensuite redémarrer ou recharger le module loop :

 rmmod loop && modprobe loop

Défragmentation LVM : exemple

hub:~# pvdisplay --maps
  --- Physical volume ---
  PV Name               /dev/sda4
  VG Name               main
  PV Size               1.76 TB / not usable 456.00 KB
  Allocatable           yes 
  PE Size (KByte)       4096
  Total PE              461649
  Free PE               208721
  Allocated PE          252928
  PV UUID               PUqV5Q-WRW2-n20t-eFVM-CA1r-RhDl-2RTJHq
   
  --- Physical Segments ---
  Physical extent 0 to 7935:
    Logical volume      /dev/main/vm-101-disk-1
    Logical extents     0 to 7935
  Physical extent 7936 to 72191:
    Logical volume      /dev/main/vm-101-disk-2
    Logical extents     0 to 64255
  Physical extent 72192 to 136703:
    Logical volume      /dev/main/vm-102-disk-1
    Logical extents     0 to 64511
  Physical extent 136704 to 144895:
    Logical volume      /dev/main/vm-103-disk-1
    Logical extents     0 to 8191
  Physical extent 144896 to 209151:
    Logical volume      /dev/main/vm-103-disk-2
    Logical extents     0 to 64255
  Physical extent 209152 to 214271:
    Logical volume      /dev/main/vm-104-disk-1
    Logical extents     0 to 5119
  Physical extent 214272 to 227327:
    Logical volume      /dev/main/vm-104-disk-2
    Logical extents     0 to 13055
  Physical extent 227328 to 282111:
    FREE
  Physical extent 282112 to 307711:
    Logical volume      /dev/main/vm-108-disk-1
    Logical extents     0 to 25599
  Physical extent 307712 to 461648:
    FREE

Comme vous pouvez le voir, on a un trou "vide" entre l'extent 227328 et 282111, puis à nouveau des données entre l'extent 282112 et 307711.

Pour combler ce trou, nous allons déplacer les données des /dev/main/vm-108-disk-1 situés entre les extents 282112 et 307711 (soit 25599 extents au total) vers l'espace libre avec pvmove :
pvmove /dev/sda4:282112-307711 /dev/sda4:227328-252927 --alloc anywhere

Notez qu'il faut attribuer exactement le même nombre d'extents à la destination qu'à l'origine : 227328 + 25599 = 252927

Oups: j'ai supprimé le mauvais lvm

Pas de panique, mais ne bougez plus ! Pour l'instant, seul les métadonnées du lvm sont impactés. Et comme c'est bien foutu, lvm conserve un backup des anciennes metadonnées après chaque modification. Ces archives sont situés dans /etc/lvm/archive/. Les fichiers y sont nommés sous la forme vg_XXXX-YYYYYYY.vg. Normalement, le fichier ayant le XXXX le plus élevé sera celui de l'état précédent votre erreur. Pour vérifier que vous avez sélectionné le bon fichier, vous pouvez l'ouvrir avec nano et regarder si l'état du lvm dans cette archive correspond a ce que vous attendez.

Pour restaurer l'archive des métadonnées main_00007-587941649.vg pour le vg main :

vgcfgrestore -f /etc/lvm/archive/main_00007-587941649.vg main
lvm vgchange -ay

Votre volume devrait être de retour.

Il faut encore vérifier que la table de partition contenu sur ce lvm n'a pas morphlé. En admettant que /dev/main/vm-101-disk-1 est la lvm que vous venez de restaurer :

# losetup /dev/loop0 /dev/main/vm-101-disk-1
# fdisk -lu /dev/loop0 

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x0002f94d

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        2048    20013055    10005504   83  Linux
/dev/loop0p2        20015102    20969471      477185    5  Extended
/dev/loop0p5        20015104    20969471      477184   82  Linux swap / Solaris

Si vous voyez ça, c'est bon, vous êtes sauvés ! Si ce n'est pas le cas, continuez à lire ;)

Récupération de la table de partition

Si fdisk vous envois chier avec un message du style Disk /dev/loop0 doesn't contain a valid partition table, il va falloir récupérer la table de partition.

Installez testdisk :

aptitude install testdisk

Lancez le:

# losetup /dev/loop0 /dev/main/vm-101-disk-1
# testdisk /dev/loop0

Selectionez le media /dev/loop0 et validez avec enter. Au menu suivant, sélectionnez intel comme type de table de partition. Au menu suivant, sélectionnez analyse A l'écran suivant, tapez enter. Avec de la chance, testdisk retrouvera vos partitions. Une fois qu'il aura terminé de travailler, il ne restera plus qu'à taper sur enter encore une fois, puis demander à testdisk de sauvegarder la table de partition

L'interface proxmox n'affiche pas les disques de certaines VMs

Ceci arrive typiquement si vous avez créé un volume logique à la main sans y ajouter le bon tag. Vérifiez la présence des tags sur vos LV avec la commande lvs --options 'vg_name,lv_name,lv_size,tags' :

~# lvs --options 'vg_name,lv_name,lv_size,tags'
  VG   LV            LSize   LV Tags   
  main vm-100-disk-1   2.00g pve-vm-100
  main vm-101-disk-1  20.00g 

Comme vous le voyez, le lv de la vm 101 n'est pas tagué. Vous pouvez ajouter le tag avec lvchange --addtag pve-vm-101 /dev/main/vm-101-disk-1 :

~# lvchange --addtag pve-vm-101 /dev/main/vm-101-disk-1
~# lvs --options 'vg_name,lv_name,lv_size,tags'
  VG   LV            LSize   LV Tags   
  main vm-100-disk-1   2.00g pve-vm-100
  main vm-101-disk-1  16.00g pve-vm-101

Si cela ne fonctionne pas, essayez de passer un petit coup de qm rescan