Proxmox et KVM

De Linux Server Wiki
Sauter à la navigation Sauter à la recherche


  • Cette page n'est plus maintenue, les informations contenues ici sont potentiellement obsolètes


1 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.

2 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:

  • /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/06_OVHkernel par exemple)

3 Partitionnement

Commencer par partitionner ainsi vos deux disques (avec fdisk ou cfdisk) :

  • /dev/sd*1 200 Mo (/boot) (type de partition : FD)
  • /dev/sd*2 15 Go (/) (type de partition : FD)
  • /dev/sd*3 4096 Go (swap) (type de partition : 82)
  • /dev/sd*4 partition étendue (invisible sous cfdisk)
  • /dev/sd*5 20 Go (/var) (type de partition : FD)
  • /dev/sd*6 reste de l'espace disque (lvm) (type de partition : FD)

Nous allons créer le RAID software (raid 1) :

  • /dev/md0 regroupant /dev/sda1 et /dev/sdb1 (/boot)
  • /dev/md1 regroupant /dev/sda2 et /dev/sdb2 (/)
  • /dev/md2 regroupant /dev/sda5 et /dev/sdb5 (/var)
  • /dev/md3 regroupant /dev/sda6 et /dev/sdb6 (lvm)
mdadm --create /dev/md0 --level=1 --assume-clean --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm --create /dev/md1 --level=1 --assume-clean --raid-devices=2 /dev/sda2 /dev/sdb2
#sd*4 est la partition étendue
mdadm --create /dev/md2 --level=1 --assume-clean --raid-devices=2 /dev/sda5 /dev/sdb5
mdadm --create /dev/md3 --level=1 --assume-clean --raid-devices=2 /dev/sda6 /dev/sdb6

3.1 Création des systèmes de fichiers

mkfs.ext3 /dev/md0
mkfs.ext3 /dev/md1
mkfs.ext3 /dev/md2
mkswap /dev/sda3
mkswap /dev/sdb3

3.2 Création du LVM

pvcreate /dev/md3
vgcreate main /dev/md3

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.

4 Installation de proxmox

4.1 Installation du système de base

mount /dev/md1 /mnt
mkdir /mnt/boot
mkdir /mnt/var
mount /dev/md0 /mnt/boot
mount /dev/md2 /mnt/var
debootstrap --arch=amd64 lenny /mnt http://ftp.fr.debian.org/debian

4.2 Configuration de Debian

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

Editez le fichier /etc/apt/sources.list :

deb http://ftp.fr.debian.org/debian lenny main contrib non-free
deb-src http://ftp.fr.debian.org/debian lenny main contrib non-free

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

deb http://volatile.debian.org/debian-volatile lenny/volatile main contrib non-free

Mettez à jour les paquets :

aptitude update
aptitude safe-upgrade

Installez les locales et la configuration de console :

aptitude install locales 
dpkg-reconfigure locales
aptitude install console-data
dpkg-reconfigure console-data # from arch > french > latin9)

Définissez la zone horaire :

tzselect
dpkg-reconfigure tzdata

Installez mdadm pour gérer le raid software :

aptitude install mdadm

Configurez votre /etc/fstab :

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0

/dev/md1        /       ext3    defaults,errors=remount-ro      0       1
/dev/md0        /boot   ext3    defaults        0       2
/dev/sda3       none    swap    sw      0       0
/dev/sdb3       none    swap    sw      0       0
/dev/md2        /var    ext3    defaults        0       2

/etc/network/interfaces :

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto vmbr0
iface vmbr0 inet static
        address <IP>
        netmask 255.255.255.0
        gateway <GW>
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0

/etc/hosts :

127.0.0.1       localhost                                                                                                                                                           
::1             localhost ip6-localhost ip6-loopback                                                                                                                                
fe00::0         ip6-localnet                                                                                                                                                        
ff00::0         ip6-mcastprefix                                                                                                                                                     
ff02::1         ip6-allnodes                                                                                                                                                        
ff02::2         ip6-allrouters                                                                                                                                                      

<IP>   <hostname>
echo votrehostname > /etc/hostname
echo votrehostname > /etc/mailname

N'oubliez pas de configurer les dns (ceux de votre hébergeur dédié) :

nameserver XX.XX.XX.XX

4.3 Installation de proxmox

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

# PVE packages provided by proxmox.com
deb ftp://download.proxmox.com/debian lenny pve

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

wget -O- "http://download.proxmox.com/debian/key.asc" | apt-key add -
aptitude update
aptitude install grub-pc
grub-install /dev/sda
grub-install /dev/sdb

http://pve.proxmox.com/wiki/Proxmox_VE_Kernel

Pour profiter d'openVZ, installez le kernel 2.6.32* :

aptitude install pve-kernel-2.6.32-4-pve
update-grub

Sinon, installez le kernel pve-kernel-2.6.35-1-pve qui permet de profiter de KSM :

aptitude install pve-kernel-2.6.35-1-pve
update-grub

Attention ! Vérifiez votre fichier /boot/grub/grub.cfg ! En particulier les directives menuentry update-grub avait configuré la ligne de boot suivante sur mon installation :

linux   /vmlinuz-2.6.35-1-pve root=/dev/md/1 ro

a corriger en

linux   /vmlinuz-2.6.35-1-pve root=/dev/md1 ro


Accesoirement installez les headers

aptitude install pve-headers-2.6.35-1-pve
aptitude install openssh-server
passwd

Si vous avez installé le kernel pve-kernel-2.6.35-1-pve installez proxmox-ve-2.6.35. Sinon, adaptez en fonction de votre kernel.

aptitude install proxmox-ve-2.6.35 ntp lvm2


4.4 configuration réseau avancée

4.4.1 Ajout d'une IPv6 sur vmbr0

Ajoutez les lignes suivantes dans /etc/network/interfaces

iface vmbr0 inet6 static
        address <votreipv6>
        netmask <votre masque ipv6 (généralement 64)

4.4.2 Ajout d'un réseau interne

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
        broadcast 192.168.0.255
        bridge_ports dummy0
        bridge_stp off
        bridge_fd 0
        #post-up /etc/pve/kvm-networking.sh

Si vous voulez utiliser deux interfaces internes, ajoutez la ligne suivante dans /etc/modprobe.d/local :

options dummy numdummies=2

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

4.5 reboot et postinstallation

exit
umount /mnt/boot
umount /mnt/var
umount /mnt/proc
umount /mnt/sys
umount /mnt/dev
umount /mnt

Rebootez votre serveur en mode normal :

reboot

Créez votre utilisateur :

adduser pfoo

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

  • désactivez le login root (directive PermitRootLogin no dans /etc/ssh/sshd_config)
  • ajoutez la directive allowusers pfoo dans /etc/ssh/sshd_config

5 Utiliser son propre certificat ssl pour l'interface web

Je vous renvoi sur http://wiki.csnu.org/index.php?title=Installation_et_configuration_de_OpenSSL pour la mise en place d'une autorité de certification. Dans l'exemple suivant, je créé un certificat proxmox et le signe avec l'autorité onyx_ca :

openssl req -newkey rsa:2048 -keyout proxmox.key -out proxmox.req
openssl ca -name onyx_ca -extensions PROXMOX -in proxmox.req -out proxmox.pem
mkdir /etc/apache2/ssl/
mv proxmox.* /etc/apache2/ssl/
cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/onyx_ca/onyx_ca.pem > /etc/apache2/ssl/cachain.pem

Modifiez le fichier /etc/apache2/sites-enabled/pve.conf comme suit :

<VirtualHost *:443>
    SSLEngine on
    SSLProtocol all -SSLv2
    #SSLCertificateFile /etc/pve/pve-ssl.pem
    #SSLCertificateKeyFile /etc/pve/pve-ssl.key
    SSLCertificateFile /etc/apache2/ssl/proxmox.pem
    SSLCertificateKeyFile /etc/apache2/ssl/proxmox.key
    SSLCertificateChainFile /etc/apache2/ssl/cachain.pem

    RewriteEngine on
    RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)
    RewriteRule .* - [F]
 </VirtualHost>

6 Installer un serveur dns pour ses VEs

Commencez par installer le serveur bind9 :

aptitude install bind9 bind9-host dnsutils

Éditez le fichier /etc/bind/named.conf.options et ajoutez y les lignes suivantes :

allow-query {
        127.0.0.1;
        91.121.141.220;
        ::1;
        2001:41d0:1:bcdc::220;
        192.168.0.0/24;
};
allow-recursion {
        127.0.0.1;
        91.121.141.220;
        ::1;
        2001:41d0:1:bcdc::220;
        192.168.0.0/24;
};
allow-query-cache {
        127.0.0.1;
        91.121.141.220;
        ::1;
        2001:41d0:1:bcdc::220;
        192.168.0.0/24;
};
version "[SECURED]";
allow-notify {
        127.0.0.1;
        91.121.141.220;
        ::1;
        2001:41d0:1:bcdc::220;
        192.168.0.0/24;
};
//interdiction du transfère complet de zones
allow-transfer {"none";};
listen-on    { 127.0.0.1; 192.168.0.0/24; 91.121.141.220; };
listen-on-v6 { ::1; 2001:41d0:1:bcdc::220; };
transfer-source 91.121.141.220;
transfer-source-v6 2001:41d0:1:bcdc::220;
notify-source 91.121.141.220;
notify-source-v6 2001:41d0:1:bcdc::220;

Vous pouvez noter que j'ai autorité toutes les IPs 192.168.0.0 à interroger le serveur dns étant donné que je me servirais de cette classe pour créer un réseau interne pour mes VEs.

Ajoutez les lignes suivantes dans /etc/resolv.conf :

nameserver ::1
nameserver 127.0.0.1
nameserver 192.168.0.1
nameserver 2001:41d0:1:bcdc::220
nameserver 91.121.141.220

7 Sécuriser et configurer le serveur mail de son host

Lors de l'installation de l'interface proxmox, postfix a été automatiquement installé. Modifiez la configuration de postfix dans /etc/postfix/main.cf comme suit :

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
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

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = onyx.csnu.org
mydomain = onyx.csnu.org
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = onyx.csnu.org, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.0.0/24
mailbox_size_limit = 0
recipient_delimiter = +

inet_protocols = all
inet_interfaces = 127.0.0.1, [::1], 192.168.0.1, 91.121.141.220, [2001:41d0:1:bcdc::220]

smtpd_sender_restrictions =
  reject_unknown_sender_domain,
  reject_non_fqdn_sender

smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_non_fqdn_hostname,
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unauth_destination,
  reject_unauth_pipelining,
  reject_invalid_hostname

7.1 SSL

Si vous avez votre propre autorité ssl, vous pouvez générer votre propre certificat.

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                        = digitalSignature, nonRepudiation, keyEncipherment
nsCertType                      = server
extendedKeyUsage                = serverAuth

Puis générez la clé et le certificat, et signez le avec votre autorité (onyx_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 onyx_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/onyx_ca/onyx_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

8 Protéger votre proxmox

8.1 sshguard

http://wiki.csnu.org/index.php?title=Prot%C3%A9ger_SSH_avec_sshguard

8.2 iptables

9 Télécharger vos images

Téléchargez les iso des OS que vous souhaitez utiliser dans /var/lib/vz/template/iso

10 Créer votre première VM

Utilisez votre navigateur web pour accéder à https://ip_de_votre_serveur. C'est l'interface web de proxmox. Cliquez sur Storage puis ajoutez un storage de type "lvm group" Sur la page d'ajout, sélectionnez le groupe lvm que vous avez créé durant l'installation (ici, je l'avais appelé "main") puis sauvegardez.

Cliquez sur Virtual Machines puis sur create Dans Installation Media: sélectionnez l'iso que vous avez téléchargé au préalable. Dans Disk Storage: selectionnez votre LVM. Configurez l'espace disque et la ram, et nommez votre VM. Dans la partie Network selectionnez vmbr0 comme bridge et précisez l'adresse mac fournie par votre prestataire de service

Cliquez sur create pour créer votre VM

Sélectionnez ensuite votre VM et cliquez sur le bouton Start

11 Accéder a une VM avec un client vnc

Lorsque la VM est lancée, loguez vous en ssh sur votre proxmox et tapez :

nc -l -p 5900 -c "qm vncproxy VMID PASSWORD"

VMID étant le numéro de la VM, et password le mot-de-passe pour accéder au vnc. Il ne vous reste plus qu'à lancer votre client vnc préféré.

Souvenez vous que dans le cas présent, la connexion vnc n'est pas chiffrée ! Il serait bon d'envisager de se connecter au travers d'un tunnel ssh.

12 Importer une VM depuis vmware ESXi

13 qm et modification des VMs en ligne de commande

14 Protéger SSH dans une VM

Reportez vous à Protéger SSH avec sshguard

15 Annexes

15.1 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 votre fichier /etc/sysctl.conf :

net.ipv6.conf.all.autoconf = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.lo.autoconf = 0
net.ipv6.conf.eth0.autoconf = 0
net.ipv6.conf.vmbr0.autoconf = 0
net.ipv6.conf.vmbr1.autoconf = 0
net.ipv6.conf.dummy0.autoconf = 0