Devoir de vacances : un routeur léger pour Hyper-V

Les congés sont faits pour changer d’air. Et, si le temps le permet, creuser quelques petits sujets mis de côté. C’est le cas de celui-ci, qui peut intéresser tous ceux qui utilisent la virtualisation pour monter des maquettes un peu conséquentes. Prenons par exemple ce que je viens de mettre en œuvre : un réseau géré par SBS (Small Business Server) 2008. Pour plus d’infos sur SBS 2008, jetez un œil chez mon collègue Pierre ou sur Technet. Pour une telle maquette, il faut un réseau privé isolé, derrière un routeur NAT avec des fonctions de redirection de port (port forwarding) : dans mon cas, il est nécessaire de rediriger un certain nombre de ports vers le serveur SBS.

Hyper-V ne fournit pas de fonction de routeur, ni de NAT, ni de redirection de port. Il est donc nécessaire d’ajouter à notre maquette une machine virtuelle dédiée à la fonction de routage, configurée avec une carte réseau externe (sur le réseau physique) et une carte réseau interne (sur le réseau privé dédié à la maquette). Une machine Windows avec le service RRAS, ou le produit ISA Server, ferait l’affaire. Mais à quel prix sur les ressources du serveur Hyper-V ?

Voici un schéma de principe (notez mes talents de graphiste), dans lequel Routeur 2 est mon objectif :

       Internet
          |
      ____|____
     |         |
     |Routeur 1|
     |_________|
          |
      ____|___________réseau_physique__
               |
     _ _ _ _ _ | _ _ _ _ _ _ _ _Hyper-V_
    |      ____|____                    |
          |Routeur 2|
    |     | virtuel |                   |
          |_________|
    |          |                        |
      _________|_________réseau_privé__
    |      |           |                |
       ____|____   ____|____
    | |         | |  Autre  |           |
      | Serveur | | machine |
    | | virtuel | |virtuelle|           |
      | interne | | interne |
    | |_________| |_________|           |

    |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|

Il existe plusieurs solutions à base d’autres OS (c'est-à-dire Linux) et j’ai choisi pour cet usage bien précis le « firewall sur une disquette » : floppyfw. Ses caractéristiques intéressantes sont :

  • Il tient sur une disquette (donc une disquette virtuelle) en lecture seule et fonctionne en RAM : pas d’état à maintenir, il est possible de l’arrêter brutalement sans l’endommager.
  • Il fonctionne avec 12 Mo de RAM ! Qui dit mieux ? D’autant qu’avec un serveur SBS demandant au moins 4 Go, on économise la RAM comme on peut (Vista fonctionne très bien avec 384, voire 256 Mo.)
  • Configuration simple depuis une machine Windows : la disquette est formatée en FAT et les fichiers de configuration sont éditables depuis Windows.
  • Il assure le routage, le NAT, un serveur DHCP optionnel et la redirection de ports vers un serveur interne.

Voici comment procéder :

Commencez par télécharger la dernière version de l’image de floppyfw (fichier .img) et parcourir la documentation disponible. Renommer ou copier le fichier floppyfw-version.img en quelquechose.vfd (vfd est l’extension des images de disquettes pour Hyper-V, mais le format est le même.)

Chargez la disquette virtuelle dans une machine virtuelle Windows. Il y a deux fichiers à éditer : config et firewall.ini. Le second doit être édité uniquement s’il doit y avoir redirection de port vers une machine interne. Les fichiers sont au format Unix : le bloc-note (notepad.exe) de Windows ne sera pas adapté car il ne reconnaît pas les fins de lignes de type Unix (CR). Utilisez plutôt Wordpad, ou un éditeur de texte comme Notepad++.

En supposant que vous n’ayez pas besoin du serveur DHCP puisque vous utilisez le votre dans le réseau interne, et si la carte externe du routeur est cliente DHCP, alors il y a une seule modification à faire dans le fichier config. Dans la section INSIDE settings, modifiez l’adresse IP de la carte interne : INSIDE_IP=<adresse interne>. Le fichier est assez clair si votre configuration est différente.

S’il y a besoin de rediriger des ports vers un serveur interne, alors il faut éditer le fichier firewall.ini : en premier lieu l’adresse IP du serveur interne est à placer dans la ligne SERVER_IP=<adresse IP>.

Toujours dans firewall.ini, chercher la section Forwarding outside ports to an internal server. Cette section contient des exemples en commentaire. Il suffit de s’inspirer de ces exemples pour construire vos propres règles de redirection avec iptables. Par exemple dans mon cas pour SBS j’avais besoin de rediriger les ports 25, 80, 443 et 987 vers le serveur interne 192.168.20.2.

Vers le début du fichier :

SERVER_IP=192.168.20.2

Et un peu plus loin, ce n’est qu’un peu de copier-coller, pour chaque port à rediriger :

# SMTP (Internal mail server): iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 25 -j DNAT --to ${SERVER_IP}:25 iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 25 -o ${INSIDE_DEVICE} -j ACCEPT iptables -A POSTROUTING -t nat -p tcp -d ${SERVER_IP} --dport 25 -s ${INSIDE_NETWORK}/${INSIDE_NETMASK} -j SNAT --to ${OUTSIDE_IP} # Web: iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 80 -j DNAT --to ${SERVER_IP}:80 iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 80 -o ${INSIDE_DEVICE} -j ACCEPT iptables -A POSTROUTING -t nat -p tcp -d ${SERVER_IP} --dport 80 -s ${INSIDE_NETWORK}/${INSIDE_NETMASK} -j SNAT --to ${OUTSIDE_IP} # Port 443: HTTPS Web traffic iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 443 -j DNAT --to ${SERVER_IP}:443 iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 443 -o ${INSIDE_DEVICE} -j ACCEPT iptables -A POSTROUTING -t nat -p tcp -d ${SERVER_IP} --dport 443 -s ${INSIDE_NETWORK}/${INSIDE_NETMASK} -j SNAT --to ${OUTSIDE_IP} # Port 987: HTTPS Web traffic for Windows SharePoint Services through Remote Web Workplace iptables -A PREROUTING -t nat -p tcp -d ${OUTSIDE_IP} --dport 987 -j DNAT --to ${SERVER_IP}:987 iptables -A FORWARD -p tcp -d ${SERVER_IP} --dport 987 -o ${INSIDE_DEVICE} -j ACCEPT iptables -A POSTROUTING -t nat -p tcp -d ${SERVER_IP} --dport 987 -s ${INSIDE_NETWORK}/${INSIDE_NETMASK} -j SNAT --to ${OUTSIDE_IP}

Pour finir, il s’agit de construire le routeur. La VM doit avoir deux cartes réseaux de type Legacy Network Adapter, la première sur le réseau externe (physique) et la seconde sur le réseau interne (privée). Pour le reste : 12 Mo de RAM, aucun disque dur, et la disquette virtuelle chargée, sans oublier la configuration du BIOS pour que la VM démarre sur la disquette :

floppyfw settings

Pour vérifier que le routeur est correctement configuré, démarrez et connectez-vous à la VM. Ouvrez une session avec root, sans mot de passe (ce n’est pas un article sécurité !)

La commande ifconfig eth0 vous donnera l’IP externe, et ifconfig eth1 l’IP interne :

floppyfw console

Fermez la session (Ctrl+D).

Une fois la VM du routeur prête, vous pouvez la démarrer et l’arrêter (turn off) à volonté, sans risquer de compromettre sa disquette virtuelle. Et à 12 Mo de RAM le routeur, pourquoi se priver ?

Bon test !