L’objectif
Un ami m’a soumis la problématique suivante: Il souhaite louer un serveur hébergé chez OVH (donc avec une seule interface réseau) avec vmware server pour héberger plusieurs machines virtuelles, dont une devant faire office de serveur pptp. Il comptait s’appuyer sur le « NAT Networking » de vmware server pour gérer la translation d’adresses, ce qui ne pose pas de problèmes pour le port TCP/1723 (PPTP) mais ne fonctionne pas avec le protocole 47 (GRE).
La solution est simple: Linux sachant parfaitement remplir ce rôle, il suffit de lui confier et de reléguer le « vm network » sur une interface virtuelle.
Voici donc un guide pas à pas concernant vmware server 2.0 sur une Debian 5.0.2.
Les paramètres sont les suivants:
- IP « publique » de l’hôte: 192.168.3.1 (oui je sais, c’est une maquette)
- Réseau privé: 172.16.0.0/24
- IP privée de l’hôte: 172.16.0.1
- IP serveur virtuel PPTP: 172.16.0.2
Ajout de l’interface virtuelle tap1
Installer le paquet contenant le binaire tunctl
apt-get install uml-utilities
Ajouter dans /etc/network/interfaces:
auto tap1
iface tap1 inet static
pre-up tunctl -u root -t tap1
pre-up ifconfig tap1 up
post-down tunctl -d tap1
address 172.16.0.1
netmask 255.255.255.0
puis activer tap1
ifup tap1
vérifier le tout
#ifconfig tap1
tap1 Link encap:Ethernet HWaddr 00:ff:c0:7f:c8:83
inet adr:172.16.0.1 Bcast:172.16.0.255 Masque:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:3805 overruns:0 carrier:0
collisions:0 lg file transmission:500
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Configuration vmware
Nous avons donc une nouvelle interface réseau, nous allons maintenant dire à vmware server de se « bridger » sur cette interface, et non pas une autre.
Pour cela, lancer la commande
vmware-config.pl
et modifier la partie concernant les bridges, soit en ajoutant un nouveau brigde, soit en modifiant le bridge actuel pour qu’il utilise tap1. Dans notre cas, la deuxième solution semble la plus appropriée, les vm n’ayant plus à être connectées directements via l’interface « publique ».
Les machines virtuelles peut maintenant être connectées à ce bridge, et se voir affecter une adresse IP en 172.16.0.x avec comme passerelle 172.16.0.1
Configuration iptables
Désormais, il n’y a plus qu’à paramétrer netfilter afin qu’il route correctement les paquets pptp.
Tout d’abord on active le routage:
echo 1 > /proc/sys/net/ipv4/ip_forward
Puis on natte le réseau privé:
iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -j MASQUERADE
En renvoyant le port pptp et le protocole GRE vers notre VM:
iptables -t nat -A PREROUTING -d 192.168.3.9 -p 47 -j DNAT --to-destination 172.16.0.2
iptables -t nat -A PREROUTING -d 192.168.3.9 -p tcp --dport 1723 -j DNAT --to-destination 172.16.0.2
Si ça ne fonctionne pas, penser à charger le module « Netfilter NAT helper module for PPTP »:
modprobe nf_nat_pptp
Conclusion
Cette astuce peut-être appliquée dans d’autres cas, par exemple pour simplement profiter de réseaux virtuels supplémentaires avec vmware server (ou encore kvm), ces réseaux contenant l’hôte et les invités.