P24 Annexe

De Wiki de Projets IMA


Cette page est un guide pas à pas pour reconstruire l'architecture de notre projet sur une machine Debian (Jessie 8) avec un noyau Linux 3.16.0-4-amd64.


Sur la machine hôte

Mise à jour et outils pratiques

Sur une machine Debian Jessie, il est nécessaire d'installer les outils suivants :

apt-get update -y; apt-get upgrade -y; \
apt-get install -y xen-hypervisor-4.4-amd64 xen-tools sqlite3 nginx ssh xen-utils-common bridge-utils

Les outils suivants sont également conseillés :

apt-get install -y vim python curl lynx nmap

Création du bridge général

Nous créons une interface tap dédiée à la connexion des interfaces du bridge. L'interface eth0 est dédiée au support. Pour que la configuration soit identique si la machine redémarre, nous éditons le fichier /etc/network/interfaces comme suit :

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
 address 172.26.64.13
 netmask 255.255.240.0
 gateway 172.26.79.254

auto tap0
iface tap0 inet manual
#MASQUERADE
 pre-up iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j MASQUERADE
 pre-up ip tuntap add mode tap dev $IFACE
 pre-up ip addr add 172.26.79.230/20 dev $IFACE
 up ip link set dev $IFACE up
#post-up ip route add 172.26.79.230/32 dev $IFACE
 down ip link set $IFACE down
 post-down ip link del dev $IFACE

#Bridge réunissant les conteneurs 
auto Summoners
iface Summoners inet static
 bridge-ports tap0
 address 10.0.0.1
 netmask 255.0.0.0

La mascarade doit s'effectuer manuellement plutôt que l'option iptables-restore. En effet nous risquons d'écraser les nouvelles règles de routages de machines virtuelles Xen. La commande qui gère le routage est commentée, elle n'est à utiliser que si le routage ne se fait pas automatiquement.

Création des machines virtuelles Xen

Une fois les outils Xen installé, on créée autant de vm que nécessaire

xen-create-image --hostname=teemo --ip=10.2.0.1 --netmask=255.0.0.0 --gateway=10.0.0.1 \
--dir=/usr/local/xen --mirror=http://debian.polytech-lille.fr/debian/ --dist=jessie --passwd

Puis on lance la VM ainsi créée:

xl create /etc/xen/teemo.cfg

Sur la machine Xen

On se connecte à la machine Xen via la commande xl console teemo

Mise a jour et outils pratiques

Une fois reconnecté, nous devrions avoir une connexion internet valide.

apt-get update -y; apt-get upgrade -y; \
apt-get install -y vim curl nmap ssh bridge-utils

Pour activer le ssh :

sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config; \
service ssh restart

Architecture réseau

Dans une premier temps il est nécessaire d'établir les bons paramètres réseaux. La création d'un bridge personnalisé nous servira par la suite pour y mettre tous les conteneurs. Il faut éditer le fichier /etc/network/interfaces comme suit :

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
 pre-up ip link set $IFACE up
 post-down ip link set $IFACE down

# The primary network interface
auto br0
iface br0 inet static
 bridge_ports eth0
 address 10.2.0.1
 netmask 255.0.0.0
 gateway 10.0.0.1
reboot


Installation de Docker

Ajout des dépôts docker de jessie où se trouve le paquet nécessaire.

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D; \
echo -e "deb http://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list; \
apt-get update -y

Installation proprement dite de Docker.

apt-get install -y docker-engine

Ajout du proxy dans l’environnement Docker.

mkdir /etc/systemd/system/docker.service.d; \
echo -e "[Service]\nEnvironment=HTTP_PROXY=http://proxy.polytech-lille.fr:3128/" > /etc/systemd/system/docker.service.d/http-proxy.conf; \
systemctl daemon-reload ;\
systemctl restart docker

Création d'un bridge personnalisé pour Docker

Pour changer le réseau par défaut de Docker, on doit dans un premier temps détruire toute la configuration existante.

service docker stop; \
ip link set docker0 down; \
brctl delbr docker0; \
iptables -t nat -F POSTROUTING

On doit ensuite indiquer au démon de Docker d'utiliser notre bridge br0 précédemment créée. On édite pour cela /lib/systemd/system/docker.service. On y indique aussi que l'on souhaite que les conteneurs prennent leurs adresses dans la plage donnée par l'option fixed-cidr. Par défaut, la passerelle par défaut est construite en fonction de l'adresse de l'hôte du conteneur (ici 10.2.0.1 au lieu de 10.0.0.1). Nous devons également la préciser ici. Voici la à exécuter pour modifier le fichier :

sed -i 's/ExecStart=\/usr\/bin\/docker daemon -H fd:\/\//ExecStart=\/usr\/bin\/docker daemon -H fd:\/\/ --fixed-cidr=10.2.0.1\/16 -b=br0 --default-gateway=10.0.0.1/' /lib/systemd/system/docker.service;


On recharge le démon pour prendre en compte la configuration.

systemctl daemon-reload; \
service docker restart

On peut alors vérifier que notre configuration a bien été prise en compte avec les commandes suivantes.

ifconfig; \
iptables -t nat -L -n

Mise en place des scripts

SSH

Sur la VM

On doit dans un premier temps établir une connexion sécurisée en ssh entre l'hyperviseur et la vm Xen. Sur la VM xen, il faut créer :

mkdir /root/.ssh/; \
touch /root/.ssh/authorized_keys

Sur l'hyperviseur

ssh-keygen -t rsa -b 4096; \
cat /root/.ssh/id_rsa.pub | ssh root@10.2.0.1 "cat - >> /root/.ssh/authorized_keys"; \
exec ssh-agent bash; \
ssh-add;

Si la clé est déja crée (si ce n'est pas la première VM), seulement la commande :

cat /root/.ssh/id_rsa.pub | ssh root@10.2.0.1 "cat - >> /root/.ssh/authorized_keys"

Base de données

Une base de données est nécessaire pour stocker les associations entre conteneur, adresse ip, nom de domaine et login.
On crée cette base sur l'hyperviseur :

sqlite3 /root/projet.db "PRAGMA foreign_keys=OFF;BEGIN TRANSACTION \
CREATE TABLE users(login varchar(10), vlan int, docker_ip varchar(15),domain varchar(50) primary key);COMMIT;"

Scripts

Nous avons ensuite besoin transférer sur l'hyperviseur nos trois scripts principaux disponibles aux URL suivants :



Pour récupérer les fichiers, nous conseillons un copier-coller, le wget insert un caractère non reconnu qui empêche le bon fonctionnement. Les variables de chaque scripts sont à adapter au contexte d’exécution. (e.g. HOST=jinx à remplacer par le nom de la vm). Il faut également penser à donner les droits d'exécution aux scripts:

chmod u+x *.sh

De plus, le script suivant est également nécessaire sur la machine xen :

Ce script permet de récupérer l'adresse IP d'un domaine donné grâce aux commandes natives de docker.

Tests

Voici une archive qui réunit le nécessaire pour construire des conteneurs avec un site web nginx autonome, accessible en ssh.

Après extraction dans la machine virtuelle, on construit l'image personnalisée en indiquant le dossier décompressé:

docker build -t IMAGE_NAME /path/to/webserv

Le nom de l'image est à indiquer dans le script de création create.sh. Voici ensuite quelques commandes qui permettent de tester nos outils depuis l'hyperviseur.

./create.sh rex 2 domain.name.tld
./checkIP.sh

On peut alors vérifier que la ligne a correctement été insérée dans la base de données.

squilte3 /root/projet.db "SELECT * FROM users;"

On peut ensuite construire le proxy inverse et tester l'accessibilité de notre conteneur.

./proxyBuild.sh
 wget --header "Host: domain.name.tld" http://hypervisor-address/