Un Skype isolé grâce à VServer

Je suis obligé d'utiliser Skype régulièrement. Et oui, on ne peut pas toujours faire ce que l'on veut. Problème, Skype est propriétaire. Et comme tout logiciel propriétaire, nous ne savons pas ce que le programme fait réellement (exemple). De plus, tout le trafic de Skype est chiffré : impossible pour l'utilisateur de savoir ce que Skype transmet exactement à ses serveurs. Tout cela fait que j'appréhende particulièrement ce logiciel, représentant parfait du logiciel propriétaire agréable à utiliser mais potentiellement très dangereux. Il faut aussi savoir qu'il existe de nombreuses alternatives à Skype, notamment via les protocoles XMPP/Jingle ou SIP.

Pour ne pas être affecté par les côtés spyware de Skype, je l'utilisais sur une machine virtuelle Windows 7. Pas des plus pratique, sachant qu'il est porté sur GNU/Linux. Première idée donc, installer Skype sur un Linux virtuel. Pourquoi pas, mais il y a mieux. Je trouve en effet que dédier une machine virtuelle uniquement à une application, c'est gâcher beaucoup de ressources. Nous allons faire de l'isolation.

L’intérêt d'utiliser un isolateur plutôt qu'un hyperviseur classique est que nous gagnons énormément en performances, de par l'utilisation du vrai matériel d'une part, et de la gestion des différents OS isolés par un seul noyau d'autre part (on réduit l'overhead). Voici comment nous pourrions schématiser le principe de l'isolation :

Il existe plusieurs isolateurs. Mon choix s'est porté sur VServer car, comme vous allez le voir, il est très simple à mettre en place.

Installation de VServer



VServer n'étant pas intégré aux sources officielles du noyau Linux, il faudrait normalement appliquer un patch. Ce n'est pas la peine sous Debian, car un noyau pré-compilé VServer-ready est disponible dans les dépôts. Il n'y a donc qu'à installer les paquets suivants : (je suis sur du 64 bit. Bien sur à vous de changer la version du noyau si besoin)

# aptitude install linux-headers-2.6.32-5-common-vserver
linux-image-2.6.32-5-vserver-amd64 util-vserver vserver-debiantools


Préparation de l'hôte



Les systèmes invités sont stockés par défaut dans /var/lib/vservers/. Si comme moi vous ne trouvez pas cela judicieux, vous pouvez modifier ce chemin de destination en modifiant le lien symbolique /etc/vservers/.defaults/vdirbase.

# cd /etc/vservers/.default/
# rm vdirbase
# ln -s /le/chemin/voulu vdirbase

Ensuite, nous allons nous occuper de la partie réseau. Notre système invité étant isolé, il va falloir lui créer une interface factice sur notre hôte, sur laquelle nous allons forwarder la connexion via du NAT.

Pour créer la "fausse" interface, le plus simple est d'ajouter les lignes suivantes dans /etc/network/interfaces :

# Dummy interface for Vservers
auto dummy0
iface dummy0 inet static
address 10.1.1.1
netmask 255.255.255.0

On relance le script réseau init :

# /etc/init.d/networking

Notre interface dummy est bien à présent disponible.

# ip a s dev dummy0
4: dummy0:  mtu 1500 qdisc noqueue state UNKNOWN
link/ether a2:59:08:71:42:3d brd ff:ff:ff:ff:ff:ff
inet 10.1.1.1/24 brd 10.1.1.255 scope global dummy0
inet6 fe80::a059:8ff:fe71:423d/64 scope link
valid_lft forever preferred_lft forever

Nous pouvons maintenant configurer le forwarding. Premièrement, on active le forwarding au niveau du kernel :

# echo 1 >/proc/sys/net/ipv4/ip_forward

Ensuite, on "nate" les paquets sortants ($IP = l'adresse IP de l'interface connectée au réseau, l'interface externe):

# iptables -t nat -A POSTROUTING -s 10.1.1.1/24 -j SNAT --to-source $IP

La même chose pour les paquets entrants. Ceci va nous permettre de mapper un service du client à un port (dans notre cas, ce sera ssh). $EXTPORT et $INTPORT les ports externes et internes de votre choix, $VHOST l'adresse IP locale du client.

# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -m tcp -p tcp
--dport $EXTPORT -j DNAT --to-destination $VHOST:$INTPORT

Par exemple, voici ce que ça donne pour mon cas, avec wlan0 à 192.168.0.15, dummy0 à 10.1.1.1, et la future adresse locale du client à 10.1.1.2 :

# iptables -t nat -A POSTROUTING -s 10.1.1.1/24 -j SNAT --to-source 192.168.0.15
# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -m tcp -p tcp
--dport 2222 -j DNAT --to-destination 10.1.1.2:2222

Il est bon de noter que ces commandes sont à entrer à chaque reboot du host. Nous verrons plus tard comment automatiser tout cela.

Préparation du client VServer



Nous pouvons maintenant créer notre client VServer.

# newserver --hostname skype --domain exemple.com --ip 10.1.1.2/24
--interface dummy0 --dist lenny --arch i386

Notre Debian Lenny isolé s'installe via debootstrap (c'est toujours magique si c'est votre première fois). Une fois cela fait, on le lance et on s'y connecte :

# vserver skype start
# vserver skype enter

Et voilà ! Préparons à présent le terrain pour Skype. Nous allons en premier lieu créer un compte utilisateur pour Skype.

À partir de maintenant, sauf mention contraire, toutes les manipulations sont à faire sur le client VServer.

# adduser skype
Adding user `skype' ...
Adding new group `skype' (1001) ...
Adding new user `skype' (1001) with group `skype' ...
Creating home directory `/home/skype' ...
Copying files from `/etc/skel' ...
Entrez le nouveau mot de passe UNIX :
Retapez le nouveau mot de passe UNIX :
passwd : le mot de passe a été mis à jour avec succès
Modification des informations relatives à l'utilisateur skype
Entrez la nouvelle valeur ou « Entrée » pour conserver la valeur proposée
Nom complet []:
N° de bureau []:
Téléphone professionnel []:
Téléphone personnel []:
Autre []:
Is the information correct? [Y/n] y

Ajoutons cet utilisateur au groupe audio pour qu'il puisse accéder aux périphériques audio (assez utile pour utiliser Skype).

# adduser skype audio

Ces périphériques audio d'ailleurs, notre Debian isolé n'en a pas connaissance. Pour remédier à cela, il suffit de copier nos périphériques hôtes vers le client. Par exemple avec rsync :

Donc si vous suivez, ceci est à taper depuis l'hôte.

# rsync -av /dev/snd /var/lib/vservers/skype/dev/
sending incremental file list
snd/
snd/controlC0
snd/hwC0D0
snd/hwC0D1
snd/pcmC0D0c
snd/pcmC0D0p
snd/pcmC0D1p
snd/seq
snd/timer
snd/by-path/
snd/by-path/pci-0000:00:1b.0 -> ../controlC0

sent 254 bytes  received 47 bytes  602.00 bytes/sec
total size is 12  speedup is 0.04

Nous allons aussi avoir besoin d'ssh pour X forwarder Skype vers notre hôte.

# aptitude install openssh-server

Vu qu'on a mappé le port 2222 tout à l'heure, on modifie le port d'écoute de ssh en 2222 dans /etc/ssh/sshd_config.

# What ports, IPs and protocols we listen for
Port 2222

Tant que nous y sommes, configurons une authentification par clés pour ne pas avoir à entrer le mot de passe à chaque connexion. On génère les clés (sans passphrase. Ce n'est pas optimal, mais l'article commence à être assez long, je n'ai pas envie d'expliquer en plus ssh-agent.) :

On génère la paire de clés depuis l'hôte.

$ ssh-keygen -t rsa -b 1024 -C skype@10.1.1.2
Generating public/private rsa key pair.
Enter file in which to save the key (/home/$USER/.ssh/id_rsa): /home/$USER/ssh_key_example/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/$USER/ssh_key_example/id_rsa.
Your public key has been saved in /home/$USER/ssh_key_example/id_rsa.pub.
The key fingerprint is:
a0:65:8e:9b:83:3c:f0:cf:51:1a:d7:2c:c1:38:cf:f6 skype@10.1.1.2
The key's randomart image is:
+--[ RSA 1024]----+
|                 |
|     o           |
|    o *          |
|     X =         |
|.   + O S        |
| + . O o         |
|  = *   E        |
|   + o           |
|    o            |
+-----------------+

Puis on copie la clé sur le client VServeur :

$ ssh-copy-id -i ~/.ssh/id_rsa "-p 2222 skype@10.1.1.2"
skype@10.1.1.2's password:
Now try logging into the machine, with "ssh '-p 2222 skype@10.1.1.2'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

Il ne reste plus qu'à supprimer l'authentification par mot de passe et activer celle par clés, sur notre client VServer dans /etc/ssh/sshd_config.

PasswordAuthentication no
PubkeyAuthentication yes

On vérifie également que la directive X11Forwarding est à yes.

Enfin, on redémarre le serveur SSH.

# /etc/init.d/ssh restart


Installation de Skype



Il ne nous reste plus qu'à installer Skype, sur notre client. On installe d'abord les dépendances :

# aptitude install libasound2 libqt4-gui libxss?1 libxv1

On télécharge et on installe le paquet Skype.

# wget http://www.skype.com/go/getskype-linux-beta-deb -O skype.deb
# dpkg -i skype.deb

Enfin, pour le lancer, il suffit de taper depuis notre host :

$ ssh -Xp 2222 skype@10.1.1.2 skype

Notre fenêtre Skype apparaît, ce fut long mais le résultat est là !

Automatisons tout cela avec un script



Si l'on récapitule, pour lancer Skype, il faut, à chaque reboot : réactiver le forwarding au niveau du kernel, réécrire les règles de NAT iptables, relancer le VServer skype, et enfin se connecter en ssh pour X Forwarder Skype. Ce n'est pas des plus pratique. Nous allons donc écrire un petit script qui initialisera notre VServer. Pour le lancement de Skype, nous nous contenterons d'un alias.

vservers-up.sh

#! /bin/bash

echo 1 >/proc/sys/net/ipv4/ip_forward

ip=$(/sbin/ifconfig wlan0 | grep "inet adr" | cut -d: -f2 | awk '{print $1}')

iptables -t nat -A POSTROUTING -s 10.1.1.1/24 -j SNAT --to-source $ip
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -m tcp -p tcp --dport 2222 -j DNAT --to-destination 10.1.1.2:2222

vserver skype start

Ici, je pars du principe que vous utilisez l'interface wlan0, à vous d'ajuster, bien sur, tout comme les adresses IP, comme nous l'avons vu plus haut.

Alias Skype, à ajouter dans ~/.bashrc

alias skype='ssh -Xp 2222 skype@10.1.1.2 skype'

vservers-up.sh est à lancer en root, l'alias skype en tant qu'utilisateur courant. Et voilà, lancer Skype est désormais beaucoup plus simple et rapide.

Bien entendu, je me suis penché spécifiquement sur le cas de Skype, mais vous pouvez utiliser du VServer pour n'importe quelle autre application que vous souhaitez isoler.

Vus : 1039
Publié par Jeyg : 33