Proxmox et OpenVZ

De Linux Server Wiki
Aller à : navigation, rechercher


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


Sommaire

1 Partitionnement du disque dur

Pour commencer, partitionnez votre disque. Faites une partition / de 15Go, un swap, et enfin, une partition LVM2 avec l'espace restant.

Créez les systèmes de fichiers pour les partitions / et swap :

mkswap /dev/sda2
mkfs.ext3 /dev/sda1

Nous allons maintenant créer notre architecture LVM puis le système de fichier de la dernière partition.

Pour commencer, créez le volume physique :

$ pvcreate /dev/sda3
    Physical volume "/dev/sda3" successfully created

Créez ensuite le groupe pve :

$ vgcreate pve /dev/sda3
    Volume group "pve" successfully created

Vous pouvez vérifier les informations du groupe avec la commande vgdisplay:

$ vgdisplay -v pve
      Using volume group(s) on command line
      Finding volume group "pve"
    --- Volume group ---
    VG Name               pve
    System ID             
    Format                lvm2
    Metadata Areas        1
    Metadata Sequence No  1
    VG Access             read/write
    VG Status             resizable
    MAX LV                0
    Cur LV                0
    Open LV               0
    Max PV                0
    Cur PV                1
    Act PV                1
    VG Size               215.09 GB
    PE Size               4.00 MB
    Total PE              55064
    Alloc PE / Size       0 / 0   
    Free  PE / Size       55064 / 215.09 GB
    VG UUID               AenAEU-jdG2-RUh1-4khe-R990-MInR-cdRIe0
   
    --- Physical volumes ---
    PV Name               /dev/sda3     
    PV UUID               CsIxAk-xa18-1W2q-jm1Y-fVqg-VSnW-KMaXvx
    PV Status             allocatable
    Total PE / Free PE    55064 / 55064

Nous pouvons maintenant créer le volume logique data dans le groupe pve. Notez que la commande vgdisplay nous a permit d'identifier la dimension du volume (Total PE) que nous préciseront via l'argument -l :

$ lvcreate -l55064 -n data pve
    Logical volume "data" created

Vous pouvez vérifier les informations du volume avec la commande lvdisplay:

$ lvdisplay -v /dev/pve/data
      Using logical volume(s) on command line
    --- Logical volume ---
    LV Name                /dev/pve/data
    VG Name                pve
    LV UUID                KlFCb8-yE7K-NYCN-RNnN-LEV3-maIw-mDtZZq
    LV Write Access        read/write
    LV Status              available
    # open                 0
    LV Size                215.09 GB
    Current LE             55064
    Segments               1
    Allocation             inherit
    Read ahead sectors     auto
    - currently set to     256
    Block device           253:0

Enfin, créez le système de fichier dans votre volume logique :

mkfs.ext3 /dev/pve/data

2 Installation du système de base

$ mount /dev/sda1 /mnt
$ debootstrap --arch=amd64 lenny /mnt
...
I: Base system installed successfully.

3 Configuration de debian et installation de proxmox

Afin d'avoir accès au réseau et au matériel, montez /proc, /dev et /sys dans votre nouveau système puis chrootez y:

mount -o bind /proc /mnt/proc
mount -o bind /dev /mnt/dev
mount -o bind /sys /mnt/sys
mount /dev/pve/data /mnt/var/lib/vz
chroot /mnt

Modifiez le fichier sysctl.conf afin de permettre le forwarding ipv4 :

net.ipv4.ip_forward=1

Mettez les paquets à jour, puis installez les locales :

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

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

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

aptitude install pve-kernel-2.6.32-4-pve

Si vous n'aviez pas grub d'installé :

mkdir /boot/grub
grub-install /dev/sda

Créez et configurez le fichier /boot/grub/menu.lst. Il devrait ressembler à ceci :

timeout 10
default 0

title proxmox
root (hd0,0)
kernel /boot/vmlinuz-2.6.32-4-pve root=/dev/sda1 read-only
initrd /boot/initrd.img-2.6.32-4-pve

Installez les headers du kernel (optionnel) :

aptitude install pve-headers-2.6.32-4-pve

Mettez votre serveur sur la bonne timezone :

tzselect
dpkg-reconfigure tzdata

Pensez à installer openssh puis à modifier le password root

aptitude install openssh-server
passwd

Editez le fichier /etc/fstab :

/dev/sda1       /       ext3    errors=remount-ro       0       1
/dev/sda2       swap    swap    defaults        0       0
/dev/pve/data   /var/lib/vz     ext3    defaults        1       2
proc            /proc   proc    defaults        0       0
sysfs           /sys    sysfs   defaults        0       0
echo proxmox.domain.tld > /etc/hostname
echo proxmox.domain.tld  > /etc/mailname

Enfin, installez ntp, lvm2 ainsi que l'interface de proxmox :

aptitude install proxmox-ve-2.6.32 ntp lvm2

Gardez en considération que si vous créez des VEs avec openvz, vous n'aurez pas besoin d'installer de client ntp sur vos VEs étant donné que les VEs openvz partagent le même kernel que l'host.

Pour simplifier l'administration, créez un lien virtuel de /vz vers /var/lib/vz :

ln -s /var/lib/vz /vz

4 Configuration réseau de proxmox

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

# network interface settings
auto lo
iface lo inet loopback

iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
        address  91.121.141.220
        netmask  255.255.255.0
        gateway  91.121.141.254
        broadcast  91.121.141.255
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        network 91.121.141.0
        post-up ifconfig vmbr0 inet6 add 2001:41d0:1:bcdc::220/64
        pre-down ifconfig vmbr0 inet6 del 2001:41d0:1:bcdc::220/64

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

5 Reboot et post-installation

Rebootez votre serveur

reboot

Créez un utilisateur :

adduser pfoo

Puis sécurisez ssh :

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

6 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é proxmox_ca :

openssl req -newkey rsa:2048 -keyout proxmox.key -out proxmox.req
openssl ca -name proxmox_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/proxmox_ca/proxmox_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>

7 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

8 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 = proxmox.domain.tld
mydomain = proxmox.domain.tld 
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = proxmox.domain.tld , 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

8.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é (proxmox_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 proxmox_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/proxmox_ca/proxmox_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/ssl/csnu.org/ca.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

9 Ajouter des templates manuellement

Il suffit de télécharger directement les archives dans /var/lib/vz/template/cache/. Vous pouvez trouver des templates sur http://download.proxmox.com/appliances/ et http://wiki.openvz.org/Download/template/precreated

10 Créer son template Debian 'Squeeze' 6.0

aptitude install debootstrap
debootstrap --arch i386 squeeze /vz/private/777
ou
debootstrap --arch amd64 squeeze /vz/private/777

Configuration de base du VE :

vzctl set 777 --applyconfig basic --save
echo OSTEMPLATE=\"debian-6.0\" >> /etc/vz/conf/777.conf

Attribuez l'ip 192.168.0.2 à votre VE puis nattez la :

vzctl set 777 --ipadd 192.168.0.2 --save
iptables -t nat -A POSTROUTING -s 192.168.0.2 -o vmbr0 -j SNAT --to 91.121.141.220

vzctl set 777 --nameserver 192.168.0.1 --save

Lancez votre VE et entrez y :

vzctl start 777
vzctl enter 777

Configurez les dépôts debian dans /etc/apt/sources.list

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

deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free

#anciennement debian-volatile
deb http://ftp.fr.debian.org/debian squeeze-updates main contrib non-free
deb-src http://ftp.fr.debian.org/debian squeeze-updates main contrib non-free
aptitude update
aptitude safe-upgrade
aptitude install locate bzip2 locales
dpkg-reconfigure locales
chmod 700 /root
dpkg-reconfigure tzdata

/root/.bashrc :

 umask 027
 export LS_OPTIONS='--color=auto --group-directories-first'
 eval "`dircolors`"
 alias ls='ls $LS_OPTIONS'

Vous pouvez faire de même pour /etc/skel/.profile et /etc/skel/.bashrc (umask, couleurs, ...)

Désactiver getty (absent sur les VEs) :

sed -i -e '/getty/d' /etc/inittab

Améliorer les IO en évitant de spliter les fichiers de logs :

sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /etc/*syslog.conf

Faites un lien virtuel entre /etc/mtab et /proc/mounts

rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab

Supprimez les paquets inutiles :

aptitude purge isc-dhcp-common isc-dhcp-client module-init-tools 

Vous pouvez voir la liste des paquets installés avec

aptitude search '~i'

Installez ssh :

aptitude install openssh-server

Générez automatiquement une nouvelle clé ssh au premier boot (sécurité) :

rm -f /etc/ssh/ssh_host_*
cat << EOF > /etc/init.d/ssh_gen_host_keys
#!/bin/sh
### BEGIN INIT INFO
# Provides:          Generates new ssh host keys on first boot
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Generates new ssh host keys on first boot
# Description:       Generates new ssh host keys on first boot
### END INIT INFO
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ''
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ''
insserv -r /etc/init.d/ssh_gen_host_keys
rm -f \$0
EOF
chmod a+x /etc/init.d/ssh_gen_host_keys
insserv /etc/init.d/ssh_gen_host_keys

Nettoyez votre liste de paquets :

aptitude clean

Quittez le VE :

exit

10.1 finalisation

Supprimez l'ip de votre VE

 vzctl set 777 --ipdel all --save

Videz le fichier resolv.conf et le fichier hostname (ils seront créés automatiquement pour chaque VE)

echo "" > /vz/private/777/etc/resolv.conf
rm -f /vz/private/777/etc/hostname
vzctl stop 777
cd /vz/private/777
tar --numeric-owner -zcf /vz/template/cache/debian-6.0-minimal_1.0_amd64.tar.gz .
ls -lh /vz/template/cache


Attention à respecter la convention de nommage des templates pour qu'elles soient détectés par proxmox : <OS>-<OSVERSION>-<NAME>_<VERSION>_<ARCH>.tar.gz.

10.2 test du template

vzctl create 123456 --ostemplate debian-6.0-minimal_1.0_amd64
vzctl start 123456
vzctl exec 123456 ps ax

10.3 Nettoyage

vzctl stop 123456
vzctl destroy 123456
rm /etc/vz/conf/123456.conf.destroyed
vzctl destroy 777
rm /etc/vz/conf/777.conf.destroyed

11 Créer son template Ubuntu 11.04

aptitude install debootstrap
wget http://wiki.csnu.org/images/2/2c/Natty.txt
mv Natty.txt natty
debootstrap --arch=amd64 natty /vz/private/777 http://fr.archive.ubuntu.com/ubuntu /root/debootstrap/natty

Si vous avez une erreur, désinstallez la version debian de debootstrap, récupérez celle de ubuntu sur http://packages.ubuntu.com/natty/all/debootstrap et installez la avec dpkg :

rm -rf /vz/private/777/
aptitude remove debootstrap
wget http://de.archive.ubuntu.com/ubuntu/pool/main/d/debootstrap/debootstrap_1.0.29ubuntu1_all.de
dpkg -i debootstrap_1.0.29ubuntu1_all.deb
debootstrap --arch=amd64 natty /vz/private/777
dpkg -r debootstrap

Créez le fichier /vz/private/777/etc/init/openvz.conf afin de fixer la séquence de boot de ubuntu pour openvz et ajoutez y le contenu suivant :

# OpenVZ - Fix init sequence to have OpenVZ working with upstart

description "Fix OpenVZ"

start on startup

task
pre-start script
mount -t devpts devpts /dev/pts
mount -t tmpfs varrun /var/run
mount -t tmpfs varlock /var/lock
mkdir -p /var/run/network
if [ ! -e /etc/mtab ]; then
cat /proc/mounts > /etc/mtab
fi
touch /var/run/utmp
chmod 664 /var/run/utmp
chown root.utmp /var/run/utmp
if [ "$(find /etc/network/ -name upstart -type f)" ]; then
chmod -x /etc/network/*/upstart || true
fi
end script

script
start networking
initctl emit filesystem --no-wait
initctl emit local-filesystems --no-wait
initctl emit virtual-filesystems --no-wait
init 2
end script

Configuration de base du VE :

vzctl set 777 --applyconfig basic --save

echo OSTEMPLATE=\"ubuntu-11.04\" >> /etc/vz/conf/777.conf

vzctl set 777 --ipadd 192.168.0.2 --save
iptables -t nat -A POSTROUTING -s 192.168.0.2 -o vmbr0 -j SNAT --to 91.121.141.220

vzctl set 777 --nameserver 192.168.0.1 --save

Lancez le VE et entrez y :

vzctl start 777
vzctl enter 777

Commencez par mettre à jour la liste des paquets puis installez l'éditeur texte nano si vous n'êtes pas fan de vi qui lui est installé par défaut, ainsi qu'aptitude :

apt-get update
apt-get install aptitude nano

Configurez les dépôts debian dans /etc/apt/sources.list :

deb http://fr.archive.ubuntu.com/ubuntu/ natty main restricted universe multiverse
deb-src http://fr.archive.ubuntu.com/ubuntu/ natty main restricted universe multiverse

deb http://fr.archive.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse
deb-src http://fr.archive.ubuntu.com/ubuntu/ natty-updates main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu natty-security main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu natty-security main restricted universe multiverse

#deb http://extras.ubuntu.com/ubuntu natty main
#deb-src http://extras.ubuntu.com/ubuntu natty main

Empêchez le lancement des services inutiles :

update-rc.d -f ondemand remove

Vous pouvez supprimer directement les scripts d'inits inutiles :

rm /etc/init/mountall-shell.conf
rm -f /etc/init/mount*
rm -f /etc/init/plymouth*
rm -f /etc/init/upstart*
rm -f /etc/init/udev*

Mettez à jour vos paquets :

aptitude update
aptitude safe-upgrade

Supprimez les paquets inutiles :

aptitude purge ubuntu-minimal eject isc-dhcp-client isc-dhcp-common ntpdate console-setup kbd

Vous pouvez voir la liste des paquets installés avec

aptitude search '~i'

Remplacez rsyslog par sysklogd :

aptitude purge rsyslog
aptitude install sysklogd

Sécurisez votre environnement root :

chmod 700 /root

Configurez le fuseau horaire et générez les locales françaises :

dpkg-reconfigure tzdata
locale-gen fr_FR.UTF-8
aptitude install language-pack-fr
echo "LANG=\"fr_FR.UTF-8\"" > /etc/default/locale
chmod o+r /etc/default/locale

Editez /root/.bashrc afin de personnaliser votre le shell de votre utilisateur root :

umask 027
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto --group-directories-first'
    alias dir='dir --color=auto'
    alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

Vous pouvez faire de même dans /etc/skel/.profile et /etc/skel/.bashrc (umask, couleurs, ...) pour les futurs utilisateurs du VE.

Désactivez getty (inutile sur les VEs) :

initctl stop tty1
initctl stop tty2
initctl stop tty3
initctl stop tty4
initctl stop tty5
initctl stop tty6
rm -f /etc/init/tty*

Améliorez les IO en évitant de spliter les fichiers de logs :

sed -i -e 's@\([[:space:]]\)\(/var/log/\)@\1-\2@' /etc/*syslog.conf

Faites un lien virtuel entre /etc/mtab et /proc/mounts

rm -f /etc/mtab
ln -s /proc/mounts /etc/mtab
update-rc.d -f mtab.sh remove

Installez ssh :

aptitude install openssh-server locate

Générez automatiquement une nouvelle clé ssh au premier boot (sécurité) :

rm -f /etc/ssh/ssh_host_*
cat << EOF > /etc/rc2.d/S15ssh_gen_host_keys
#!/bin/sh
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ''
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ''
ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key -t ecdsa -N ''
rm -f \$0
EOF
chmod a+x /etc/rc2.d/S15ssh_gen_host_keys

Nettoyez votre liste de paquets :

aptitude clean

Quittez le VE :

exit

11.1 finalisation

Supprimez l'ip de votre VE :

vzctl set 777 --ipdel all --save

Videz le fichier resolv.conf et le fichier hostname (ils seront créés automatiquement par proxmox pour chaque VE issu de ce template).

echo "" > /vz/private/777/etc/resolv.conf
rm -f /vz/private/777/etc/hostname

Stoppez la VE:

vzctl stop 777


cd /vz/private/777
tar --numeric-owner -zcf /vz/template/cache/ubuntu-11.04-minimal_1.0_amd64.tar.gz .

Attention à respecter la convention de nommage des templates pour qu'elles soient détectés par proxmox :

<OS>-<OSVERSION>-<NAME>_<VERSION>_<ARCH>.tar.gz.

11.2 test du template

vzctl create 123456 --ostemplate ubuntu-11.04-minimal_1.0_amd64
vzctl start 123456
vzctl exec 123456 ps ax

11.3 Nettoyage

vzctl stop 123456
vzctl destroy 123456
rm /etc/vz/conf/123456.conf.destroyed
vzctl destroy 777
rm /etc/vz/conf/777.conf.destroyed

12 Créer son template Archlinux 2010.05

12.1 Prérequis

Si vous souhaitez utiliser des VEs archlinux en veth, vous constaterez rapidement qu'openvz ajoutera forcément une interface venet0 malgré que vous n'ayez configuré aucune ip venet sur votre VE. Voici une version légèrement modifiée du script d'ajout d'ip pour archlinux que vous pouvez utiliser pour régler ce problème :

wget http://wiki.csnu.org/images/5/50/Arch-add_ip.sh
mv /etc/vz/dists/scripts/arch-add_ip.sh /etc/vz/dists/scripts/arch-add_ip.sh.bak
mv Arch-add_ip.sh /etc/vz/dists/scripts/arch-add_ip.sh

12.2 installation

Commencez par ajouter les dépôts backports de debian lenny, puis installez le paquet xz-utils :

echo "deb http://backports.debian.org/debian-backports lenny-backports main" >> /etc/apt/sources.list
aptitude update
aptitude install xz-utils

Vous trouverez un script archbootstrap similaire à debootstrap sur le wiki de archlinux.

wget http://tokland.googlecode.com/svn/trunk/archlinux/arch-bootstrap.sh

Lancez le script. La syntaxe est ./arch-bootstrap.sh destination architecture. Les architectures possibles sont i686 (32bits) et x86_64 (64bits).

chmod +x arch-bootstrap.sh
./arch-bootstrap.sh /vz/private/777 x86_64

Nous allons maintenant installer quelques paquets nécessaires avant d'initialiser le VE :

chroot /vz/private/777
pacman -S sed initscripts net-tools iputils nano iproute gzip
exit

Appliquez une configuration de base à votre VE :

vzctl set 777 --applyconfig basic --save
echo OSTEMPLATE=\"arch\" >> /etc/vz/conf/777.conf

Attribuez lui une adresse ip locale, puis nattez cette ip afin de permettre à la VE d'accéder à internet :

vzctl set 777 --ipadd 192.168.0.10 --save
iptables -t nat -A POSTROUTING -s 192.168.0.10 -o vmbr0 -j SNAT --to 91.121.141.220

Biens sur, définissez le serveur dns :

vzctl set 777 --nameserver 192.168.0.1 --save

Lancez votre VE puis entrez y :

vzctl start 777
vzctl enter 777

Commencez par dé-commenter les miroirs français de /etc/pacman.d/mirrorlist :

## France
Server = http://mir.archlinux.fr/$repo/os/$arch
Server = ftp://distrib-coffee.ipsl.jussieu.fr/pub/linux/archlinux/$repo/os/$arch
Server = http://distrib-coffee.ipsl.jussieu.fr/pub/linux/archlinux/$repo/os/$arch
Server = ftp://mir1.archlinux.fr/archlinux/$repo/os/$arch
Server = http://mir1.archlinux.fr/archlinux/$repo/os/$arch
Server = ftp://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
Server = http://archlinux.mirrors.ovh.net/archlinux/$repo/os/$arch
Server = ftp://ftp.rez-gif.supelec.fr/Linux/archlinux/$repo/os/$arch

Vous pouvez ensuite mettre à jour pacman :

pacman -Suy

Puis installez les paquets manquants :

pacman -S procps dnsutils mlocate

Sécurisez votre root :

chmod 700 /root

Créez le fichier /root/.bashrc :

#
# ~/.bashrc
#

umask 0027

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

alias ls='ls --color=auto --group-directories-first'
#PS1='[\u@\h \W]\$ '

Créez le fichier /root/.profile :

# ~/.profile: executed by Bourne-compatible login shells.

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    . ~/.bashrc
  fi
fi

mesg n

Vous pouvez éditer /etc/skel/.bashrc (umask, couleurs, ...) afin de définir des paramètres par défaut pour vos futurs utilisateurs.

Éditez le fichier /etc/locale.gen et dé-commentez les locales fr_FR.

fr_FR ISO-8859-1
fr_FR.UTF-8 UTF-8
fr_FR@euro ISO-8859-15

Lancez ensuite locale-gen pour générer les locales :

locale-gen

Créez un lien entre /proc/mounts et /etc/mtab, supprimez les getty :

rm /etc/mtab
ln -s /proc/mounts /etc/mtab
sed -i -e '/getty/d' /etc/inittab

Installez openssh et autorisez l'accès de l'extérieur :

pacman -S openssh
echo "sshd: ALL : ALLOW" >> /etc/hosts.allow
echo "nobody:x:99:99:nobody:/:/sbin/nologin" >> /etc/passwd

Ne lancez sous aucun prétexte ssh maintenant ! En effet, le script de lancement de archlinux se chargera de générer les clés ssh au premier lancement. Pour s'assurer que chaque VE ait ses propres clés, il ne faut pas lancer ssh lors de la création du template.

12.3 /etc/rc.conf

LOCALE="fr_FR.UTF-8"
DAEMON_LOCALE="no"
HARDWARECLOCK="localtime"
TIMEZONE="Europe/Paris"
KEYMAP="fr"
DAEMONS=(hwclock syslog-ng network netfs crond sshd)

Quittez votre VE :

exit

12.4 finalisation

Supprimez l'ip de votre VE :

vzctl set 777 --ipdel all --save

Créez un fichier d'exclusion contenant les différents fichiers et dossiers qui ne devront pas se retrouver dans le template définitif :

cd /vz/private/777/
echo "etc/resolv.conf" >> ../exclude.list
echo "etc/hostname" >> ../exclude.list
find ./var/cache/ -name '*.tar.gz' >> ../exclude.list
find ./root/.bash_history >> ../exclude.list

Stoppez le VE :

vzctl stop 777

Supprimez les lignes suivantes du fichier /vz/private/777/etc/rc.conf :

lo="lo 127.0.0.1"
INTERFACES=(   "lo"  "venet0"   )
venet0="venet0 127.0.0.1 netmask 255.255.255.255 broadcast 0.0.0.0"
rt_venet0="-net 191.255.255.1 netmask 255.255.255.255 dev venet0"
rt_default="default gw 191.255.255.1"
ROUTES=(  "rt_venet0"  "rt_default" )

créez l'archive du template :

tar --numeric-owner -X ../exclude.list -czf /vz/template/cache/arch-2010.05-minimal_1.0_amd64.tar.gz ./
rm ../exclude.list

Attention à respecter la convention de nommage des templates pour qu'elles soient détectés par proxmox : <OS>-<OSVERSION>-<NAME>_<VERSION>_<ARCH>.tar.gz.

12.5 test du template

vzctl create 123456 --ostemplate arch-2010.05-minimal_1.0_amd64
vzctl start 123456
vzctl exec 123456 ps ax

12.6 Nettoyage

vzctl stop 123456
vzctl destroy 123456
rm /etc/vz/conf/123456.conf.destroyed
vzctl destroy 777
rm /etc/vz/conf/777.conf.destroyed

13 Créer et configurer un VE Debian 6.0

13.1 Généralités

Connectez vous à votre interface proxmox. Cliquez sur Virtual Machines puis sur Create. Sélectionnez le type de VE à créer (OpenVZ dans mon cas étant donné que mon CPU ne supporte pas la technologie intel VT). Dans Templates, selectionnez la version voulue de debian. Remplissez le champ hostname, ainsi que password (ce sera le mot-de-passe root par défaut).

Pour la configuration réseau, deux choix s'offrent à vous :

  • venet : il s'agit de créer un réseau virtuel, donc avec des adresses virtuelles que vous devrez ensuite natter ou router au niveau de l'host. Cette technologie est basée sur la couche 3 du model OSI. Le principal intérêt de venet est qu'il suffit de sécuriser (firewall, ...) l'host et non pas chaque VE.
  • veth : il s'agit de créer une interface réseau virtuelle à laquelle il faudra attribuer une adresse MAC virtuelle et une adresse IP générée dans la console de gestion de votre provider dédié. Dans ce cas, il faudra faire attention à sécuriser (firewall, ...) chaque VE.

Si vous choisissez veth, veillez à bien entrer l'adresse MAC virtuelle fournit par la console de votre provider. De plus, si vous avez suivi ce wiki, selectionnez vmbr0 à la ligne bridge.

Cliquez enfin sur create afin de lancer la génération du VE. Attendez quelques dizaines de secondes puis retournez à la liste des VEs. Cliquez sur la VE fraîchement créée, localisez le bouton Start et cliquez dessus. Votre VE démarre, reste à le configurer.

13.2 Configuration réseau en veth

Connectez vous en ssh sur l'host en utilisateur root puis entrez :

vzctl enter 101

101 est le numéro de votre VE (VMID) disponible dans le status de la VE sur l'interface web de proxmox. Éditez le fichier /etc/network/interfaces comme suit :

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address <ip-fail-over>
        netmask 255.255.255.255
        up route add -host <gateway> dev eth0
        up route add default gw <gateway>
        post-up ifconfig eth0 inet6 add <ipv6>
        pre-down ifconfig eth0 inet6 del <ipv6>

La gateway est la même que celle que vous avez indiqué lors de la configuration du fichier interfaces de l'host.

Relancez votre réseau :

/etc/init.d/networking restart

Attention, si vous n'avez pas de serveur dns installé, vous ne pourrez pas résoudre les dns et il vous faudra essayer de pinger internet directement via l'ip !

Pour resortir de votre VE, tapez

exit

13.2.1 Ajouter une interface réseau virtuelle locale

Comme vous avez pu le voir, j'ai créé sur l'host une interface vmbr1 bridgé sur dummy0. Ceci est parfait pour créer un réseau interne pour ses VEs. Il ne reste plus qu'à ajouter une interface réseau virtuelle sur chaque VE. L'intérêt principal d'un réseau interne pour vos VEs est d'offrir un débit bien supérieur à celui du bridge sur l'interface principale.

Sur l'host, utilisez vzctl pour créer une nouvelle interface réseau virtuelle :

vzctl set <VMID> --netif_add eth<N>,,,,vmbr<M> --save

Par exemple, pour ajouter une interface virtuelle eth1 bridgé sur vmbr1 :

vzctl set 101 --netif_add eth1,,,,vmbr1 --save

Vous pouvez supprimer cette interface avec :

vzctl set <VMID> --netif_del eth<N> --save

Ensuite, il ne vous reste plus qu'à configurer l'interface sur votre VE. Editez le fichier /etc/network/interfaces et ajoutez y :

auto eth1
iface eth1 inet static
        address 192.168.0.2
        netmask 255.255.255.0

Redémarrez votre VE. Vous pouvez désormais pinguer 192.168.0.1, qui est l'adresse ip locale de votre host.

Vous pouvez utiliser iperf pour tester le débit entre deux VEs. Sur une VE lancez iperf en mode serveur :

iperf -s

Sur l'autre, lancez iperf en mode client :

iperf -c 192.168.0.3

13.3 Configuration réseau en venet

Nous allons supposer que vous avez défini l'adresse IP 192.168.0.2 à votre VE lors de sa création.

Sur l'host, tapez simplement :

iptables -t nat -A POSTROUTING -s 192.168.0.2 -o vmbr0 -j SNAT --to 91.121.141.220

13.4 Régénérer les clés ssh

Si vous ne faites pas confiance dans le template que vous avez utilisé (ce qui commence mal ...), vous pouvez régénérer les clés host de ssh :

rm -f /etc/ssh/ssh_host_*
ssh-keygen -f /etc/ssh/ssh_host_rsa_key -t rsa -N ''
ssh-keygen -f /etc/ssh/ssh_host_dsa_key -t dsa -N ''

Dans le doute, créez votre propre template =)

14 Créer et configurer un VE Archlinux 2010.05

14.1 Généralités

Reportez vous à la section sur la création d'un VE Debian 6.0

14.2 Configuration du réseau en veth

Connectez vous en ssh sur l'host en utilisateur root puis entrez dans votre VE :

vzctl enter 101

101 est le numéro de votre VE (VMID) disponible dans le status de la VE sur l'interface web de proxmox. Créez le fichier /etc/rc.d/openvz_net contenant :

#! /bin/bash
#echo 0 > /proc/sys/net/ipv6/conf/all/autoconf
ifconfig eth0 <ipfailover> netmask 255.255.255.255
ifconfig eth0 inet6 add ipv6failover/64
#route del default
route add -host 91.121.141.254 dev eth0
route add default gw 91.121.141.254

Rendez ce fichier exécutable :

chmod +x /etc/rc.d/openvz_net

Modifiez ensuite la ligne DAEMONS du fichier /etc/rc.conf afin d'y ajouter openvz_net :

DAEMONS=(hwclock syslog-ng network openvz_net netfs crond sshd)

Pour resortir de votre VE, tapez :

exit

14.2.1 Ajouter une interface réseau virtuelle locale

Sur l'host, ajoutez l'interface virtuelle eth1 bridgé sur vmbr1 à votre VE :

vzctl set 101 --netif_add eth1,,,,vmbr1 --save

Ensuite, il ne vous reste plus qu'à configurer l'interface sur votre VE. Ajoutez la ligne suivante dans le fichier /etc/rc.d/openvz_net :

ifconfig eth1 192.168.0.4 netmask 255.255.255.0

Redémarrez votre VE. Vous pouvez désormais pinguer 192.168.0.1, qui est l'adresse ip locale de votre host.

14.3 Configuration du réseau en veneth

Nous allons supposer que vous avez défini l'adresse IP 192.168.0.4 à votre VE lors de sa création.

Sur l'host, tapez simplement :

iptables -t nat -A POSTROUTING -s 192.168.0.4 -o vmbr0 -j SNAT --to 91.121.141.220

15 vzctl, modification des VEs en ligne de commande

  • Définir les serveurs DNS d'un VE :
vzctl set <VEID> --nameserver ip1 --nameserver ip2 --nameserver ip3 --searchdomain domain.tld --save

Vous pouvez ajouter autant de directive --nameserver ip* que vous le souhaitez. Vous pouvez entrer des IPv6, mais elles ne seront pas affichés correctement dans le panel de gestion de proxmox.

16 Protéger SSH dans un VE

aptitude purge module-init-tools 

Puis reportez vous à Protéger SSH avec sshguard

17 Partager des fichiers d'un VE à un autre VE

OpenVZ, de part son architecture, permet de partager des fichiers d'un VE à un autre très facilement. Pour cela, connectez vous en ssh à votre host proxmox (pas à votre VE) et utilisez la commande mount :

mount --bind /vz/private/102/directory /vz/root/101/directory

Pour que ce partage reste actif même en cas de reboot créez le fichier /etc/vz/conf/101.mount:

#!/bin/bash
source /etc/vz/vz.conf
source ${VE_CONFFILE}
mount -n --bind /vz/private/102/directory /vz/root/101/directory

N'oubliez pas de rendre ce fichier executable :

chmod +x /etc/vz/conf/101.mount

18 Installer une interface graphique avec NX server sur un VE OpenVZ Debian/Ubuntu

aptitude install xorg xdm
aptitude install xfce4

Téléchargez NX Free Edition client, node et server sur http://www.nomachine.com/select-package.php?os=linux&id=1

aptitude install libaudiofile0
dpkg -i nxclient_3.5.0-6_amd64.deb
dpkg -i nxnode_3.5.0-3_amd64.deb
dpkg -i nxserver_3.5.0-4_amd64.deb

18.1 Configuration de X

Dans /etc/X11/xdm/xdm-config, commentez la ligne DisplayManager.requestPort: 0

Dans /etc/X11/xdm/Xservers, commentez la ligne :0 local /usr/bin/X :0 vt7

Dans /etc/X11/xdm/Xaccess, décommentez la ligne * #any host can get a login window (Please keep in mind the security implications by the above line. Read the comments found in the file and set it appropriately)

18.2 Configuration de NX Server

Éditez /etc/X11/xorg.conf :

Section "Files"
        # path to defoma fonts
        FontPath     "/usr/share/fonts/X11/misc"
        FontPath     "/usr/share/fonts/X11/100dpi/:unscaled"
        FontPath     "/usr/share/fonts/X11/75dpi/:unscaled"
        FontPath     "/usr/share/fonts/X11/Type1"
        FontPath     "/usr/share/fonts/X11/100dpi"
        FontPath     "/usr/share/fonts/X11/75dpi"
EndSection

Enfin, créez un utilisateur afin de ne pas avoir à vous connecter en root.

18.3 Configuration de NX Client

A faire sur votre machine. Téléchargez et installez http://www.nomachine.com/download-client-linux.php

Configurez l'hostname et le ort. Dans la section Desktop, selectionnez Unix and custom. Cliquez sur Settings et selectionnez Run the default X client script on server ainsi que New virtual Desktop Si ça ne fonctionne pas, essayez de forcer le lancement de /usr/bin/xfce4-session dans les settings de nx

S'il vous manque des icones après vous être logué, essayez d'installer le paquet gnome-icon-theme sur le serveur.

18.4 Configuration de OpenNX

OpenNX est une alternative libre au client nx de nomachine. Vous trouverez les informations de téléchargement et d'installation pour différents OS et distributions linux sur http://opennx.net/. La configuration est la même que celle du NX Client de nomachine, et il est compatible avec les fichiers de configuration de NXclient.

Attention cependant : il semble mal supporter les ipv6. Veillez donc a :

  • utiliser une adresse ipv4 uniquement dans la session de connexion
  • ne pas faire écouter votre serveur ssh sur l'adresse ipv6 ::1

18.5 Utiliser VNC en plus de NX

Sous gnome / xfce installez vino :

aptitude install vino

Changez les préférences avec vino-preferences

Lancez le serveur vino :

/usr/lib/vino/vino-server

19 Installer une interface graphique avec NX server sur un VE OpenVZ Archlinux

pacman -S xfce4

Téléchargez NX Free Edition client, node et server sur http://www.nomachine.com/select-package.php?os=linux&id=1

mv nx*.tar.gz /usr
cd /usr
tar zxvf nxclient-3.5.0-6.x86_64.tar.gz
tar zxvf nxnode-3.5.0-3.x86_64.tar.gz
tar zxvf nxserver-3.5.0-4.x86_64.tar.gz
mkdir /etc/init.d
/usr/NX/scripts/setup/nxnode --install suse
/usr/NX/scripts/setup/nxserver --install suse
mv /etc/init.d/* /etc/rc.d/
/etc/rc.d/nxserver start

20 issue

20.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
net.ipv6.conf.venet0.autoconf = 0

De plus, si vous configurez vos VEs en veth, vous devrez :

  • Ajouter une ligne similaire aux précédentes pour chaque interface réseau du VE dans le fichier /etc/sysctl.conf du VE. Typiquement :
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.eth1.autoconf = 0
  • Ajouter une ligne similaire aux précédentes pour chaque interface réseau virtuelle veth sur l'host (net.ipv6.conf.vethXXX/Y.autoconf où XXX est le VEID est Y un numéro d'interface).

Pour repérer facilement les lignes à ajouter, utiliser sysctl -a et grep :

sysctl -a | grep net.ipv6.conf.*.autoconf

20.2 Cacher les processus des VEs sur l'host

sysctl kernel.pid_ns_hide_child=1