Réseau caché par redirection de port et IP masquerading

Rédacteur : Trance

Date de création : 02/11/2006

Section : Sécurité > Réseaux

Cet article explique de façon détaillée comment créer un petit réseau à l'intérieur d'un réseau classique, ce petit réseau ayant une particularité intéressente : il est invisible du reste du réseau. L'intérêt ? Imaginez que la politique de l'administrateur du grand réseau vous interdit de posséder plus d'un PC par un moyen quelconque (vérification d'adresse MAC par tables ARP statiques par exemple) ; or vous aimeriez bien en disposer d'un peu plus, sans que cela soit visible. Mieux encore, vous voudriez partager votre connexion internet que vous offre le réseau (par proxy par exemple) avec votre petit réseau, toujours de manière invisible.

Les avantages sont multiples. Nous verrons quelques techniques, de la plus simple (la plus minimale en terme de performances) à la plus complète, qui rendra à vos PC du petit réseau un accès au grand réseau totalement transparent, ce qui vous simplifiera énormément la tâche de configuration de vos machines.

Sommaire

  1. Le décor
  2. Redirection de port(s)
    1. Le principe
    2. Passerelle sous Windows
    3. Passerelle sous Linux
  3. Firewalling & IP Masquerading
    1. Installation de Shorewall
    2. Passerelle sous Windows
    3. Passerelle sous Linux

Introduction - Motivations

Je me trouve dans une chambre "universitaire" disposant d'une prise réseau murale. Je peux donc me connecter au réseau interne de l'école à partir de ma chambre, et disposer d'un certain nombre de ressources qu'il m'offre, comme par exemple une connexion internet gratuite.

Le petit bémol, c'est qu'avant de pouvoir se connecter, il faut faire activer sa prise auprès des administrateurs. Cela consiste à leur donner l'adresse MAC de son PC afin qu'ils nous autorise l'accès depuis notre chambre. Ainsi, seuls les PC possédant une adresse MAC référencée peuvent se connecter. Les autres ne sont pas reconnus par le réseau.

Je ramène un deuxième PC dans ma chambre. Je peux le connecter sans problème au premier, pusique celui-ci dispose de deux cartes réseaux, une reliée au réseau, l'autre à ce deuxième PC. Mais le problème se pose lorsqu'il s'agit de vouloir accéder à internet avec ce deuxième PC... En effet, son adresse MAC n'est pas reconnue par le réseau, il ne peut donc pas s'y connecter de manière simple. Inutile donc de brancher un switch à la prise murale sui redistribue le réseau dans ma chambre, cela ne ferait qu'amplifier le problème.

Mais je suis motivé. Je veux à tout prix avoir Internet sur mes deux bécanes. Mais je veux faire ca discrètement afin d'éviter de me faire repérer car les admins n'apprécient pas forcément ce tour de passe-passe...

Au final, j'élabore une technique très simple permettant de partager la connexion entre les deux : la redirection de ports. Mais celle-ci est limitée et pas très optimale. Je continue donc de me documenter et de m'acharner pour finalement mettre en place un firewall qui agira, avec des règles adéquates et des programmes qui vont bien, comme une passerelle. Cette solution fait intervenir de l'IP Masquerading. Enfin, je souhaite disposer de serveurs sur le PC invisible, et y accéder depuis l'extérieur (le grand réseau). J'utilise une nouvelle fois la redirection de port, plus un peu de firewalling afin de laisser passer tout cela. Le plus intéressent est que cette technique est généralisable à un nombre plus grand de PC, consitituant un véritable réseau et qui restera "invisible" du reste du réseau. La seule limite en terme de nombre de PC est... le volume de votre chambre :)

Je vous propose de décrire l'ensemble de ces techniques dans l'ordre cité ci-dessus, c'est à dire dans l'ordre chronologique de mes "découvertes"...

1. Le décor

Avant toute chose, décrivons la scène. Comme dit et répété, le but est de se constituer un petit réseau (dans la chambre) à l'intérieur d'un réseau "fliqué". La motivation principale est de pouvoir partager la connexion internet avec ce réseau.

Matériel requis :

Quelque soit votre config, notez bien que le PC principal (qui servira de passerelle) doit avoir DEUX cartes réseau... Si vous n'en avez qu'une, je vous conseille d'aller en acheter/récupérer une autre car cette situation déborde du cadre de l'article.

L'architecture du réseau ne nous intéresse à priori pas. D'une part dans mon cas je ne la connais pas... et d'autre part, nous allons voir que nous pouvons nous passer de cette information et considérer le réseau comme une "boite noire". Le point important est tout de même le proxy. Vous n'êtes pas sans savoir que le proxy est une méthode pour partager la connexion au sein d'un réseau. C'est une machine qui dispose d'un programme (serveur) qui reçoit des demandes de connexion vers des sites de la part des PC du réseau, qui les transmet vers l'extérieur, et reçoit les réponses et les retourne aux PC demandeurs.

Au final, voici un schéma rassemblant toutes ces infos :

+--------------------------------------------------------------+
|                                                              |
|   +------------------------+                                 |
|   |                        |    +-----+         +-------+    |
|   |       +------> PC1 <------> |  ?  | <-----> | Proxy | <--------> Internet
|   |       |                |    +-----+         +-------+    |
|   |       V                |                                 |
|   |      PC2               |                                 |
|   |                        |                                 |
|   +------------------------+                                 |
|          Petit réseau                                        |
|           (chambre)                                          |
|                                                              |
|                                                              |
+--------------------------------------------------------------+
                        Réseau global

Ici, j'ai volontairement simplifié en prenant un réseau avec uniquement mes 2 PC, mais l'idée est généralisable sans problème à N PC, avec N >= 2. Il faudra alors un (ou plusieurs) switch(es) reliant PC1 au reste des PC :

            +-------------+
            | switch(es)  | <-------> PC1 <-----------> Reste du réseau
            +-------------+
     _______/ / |  |  | \ \_______
    /    ____/ /   |  \  \___     \
   /    /     /    |   \     \     \
 PC2   PC3   PC4  PC5  PC6   PC7   PC8 ...
 

Toute la difficulté réside dans la mise au point (du point de vue configuration) de ce réseau, et surtout de la passerelle PC1... et c'est ce que nous allons maintenant voir en détails.

2. Redirection de port(s)

2.i. Le principe

Une redirection de port, comme son nom l'indique, consiste à rediriger les données échangées au travers d'un port, vers un autre port. ainsi, on ouvre un port sur une machine, et toutes les données recues par ce port seront automatiquement reroutées vers un autre port, soit de cette même machine, soit d'une autre machine. Et c'est justement cette dernière option qui est intéressente.

Finalement, que voulons-nous ? Pour le moment, juste faire en sorte que PC2 (et éventuellement les PCx avec x > 2) puisse(nt) accéder à Internet. Autrement dit, qu'ils aient accès au proxy et puissent échanger des données avec lui.

La solution est donc toute simple : Il va falloir emettre en place une redirection de ports sur PC1. Nous alons choisir un port arbitraire sur PC1 que nous allons ouvrir, et toutes les données qu'il recevra dessus seront reroutées vers le proxy ! Il ne restera plus qu'à configurer les machines PCx (x >= 2) afin qu'elles aient comme proxy par défaut PC1, avec le port associé...

Je m'intéresserai à la configuration suivante, en supposant au préalable que vous avez configuré les bonnes IP pour chaque PC et que ces PC puissent se voir entre eux (répondent aux ping). Vous pouvez désactiver vos pare-feu pour faire des tests.

Dans mon exemple, PC1 est directement connecté au gros réseau et obtient son IP par DHCP sur l'interface n°1. Son interface n°2 a pour IP 192.168.0.1, et tous les PC du (petit) réseau ont une IP du type 192.168.0.x avec x>=2.

Machine      PC2 <-----------------> PC1 <---------------------> Proxy <----------------> [WEB]
IP        192.168.0.2            192.168.0.1              proxy.res.school            www.google.fr
                                  10.x.y.z
Port         * <-------------------> 8080 <---------------------> 8080 <-----------------> 80
Solution          proxy par défaut               redirection            échange classique

Ainsi, lorsqu'un PC du sous réseau (PC2 par exmeple) veut se connecter sur Google, il envoie une requête à PC1 pusique c'est son proxy par défaut. PC1 recoit la requête sur son port 8080 (ce port est arbitraire, vous pouvez le changer). Grâce à notre processus de redirection, PC1 transfert l'intégralité de la requête au vrai proxy du réseau, proxy.res.school. Le proxy interprète la requête et fait son boulot de proxy, à savoir interroger Google. Il récupère les informations HTTP et les transfère en retour à PC1 sur son port 8080, pusique c'est lui le demandeur. PC1 reçoit les données sur son port 8080, et comme PC2 est déja connecté dessus, il les reçoit aussi ! Il a donc Google qui s'affiche sur son navigateur...

Bien entendu, je ne vous ferai pas l'affront de vous apprendre comment configurer un proxy par défaut dans un navigateur... La tâche la plus "complexe" est plutôt la mise en place de la passerelle. Nous allons distinguer deux cas : La passerelle (PC1) est sous Windows, ou sous Linux. Il existe certainement des solutions génériques, notamment avec Netcat, mais je n'ai pas réussi pour le moment à les faire fonctionner...

2.ii. Passerelle sous Windows

Nous allons utiliser un soft gratuit, Pmapper, développé par AnalogX. Téléchargez donc le logiciel, installez-le, puis lancez-le. Il est logé par défaut dans le system tray, pour une utilisation plus transparente. Faites un clic droit sur son icone, et allez dans le menu Configure > Configure Mappings.

Cliquer sur Add et rentrer 8080 dans Port, http://proxy.res.school:8080/ (le proxy du réseau) dans Target. Validez trois fois pour réduire le programme et rendre votre redirection opérationnelle.

C'est tout pour PC1. Pour les autres, il ne vous reste plus qu'à configurer dans Firefox ou votre navigateur préféré le proxy par défaut, et de mettre l'adresse IP de PC1 et 8080 comme port...

2.iii. Passerelle sous Linux

C'est encore plus simple que sous Windows ! Vous avez juste à taper une ligne de commande... pour peu que vous possédiez le bon programme. Nous allons utiliser l'outil Redir, mais je crois que Bind a des fonctionnalités équivalentes.

Pour installer redir, utilisez le système d'installation classique de votre distrib, à la apt-get install sous les Debian-like, ou emerge sous Gentoo. Ensuite, vous avez juste à taper dans un shell :

redir --lport 8080 --cport 8080 --caddr proxy.res.school

Et c'est tout ! Vous pouvez ajouter un petit & a la fin de la ligne afin d'avoir le prog qui tourne en tâche de fond, c'est toujours pratique. Pour l'utilisation plus complexe de Redir, je vous rapporte au man :)


Attention : il est probable que, pour que la redirection de ports marche, vous ayez à activer l'Ip Forwarding. Pour le faire, tapez ceci sous Linux (en root) :

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

Sous Windows, il faut modifier une clé du registre. La clé à modifier est :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

Vous devez rajouter la valeur REG_DWORD de nom IPEnableRouter, avec pour contenu 1. Redémarrez pour activer l'IP Forwarding.

Et voila, comme quoi la redirection de port est bien une technique simple... Si vous voulez autoriser davantage de traffic entre les PC du petit réseau et ceux du grand réseau, vous pouvez définir d'autres règles de redirection de ports. C'est assez utile si par exemple vous disposez d'un serveur dans votre petit réseau et que vous souhaitez que d'autres PC externes puissent y accéder. Il vous suffit d'ouvrir un port sur PC1 et de rediriger (avec Pmapper ou redir) tout ce qui arrive dessus sur le port ouvert où écoute le serveur sur la bonne machine...

3. Firewalling & IP Masquerading

Cette technique est nettement plus complète que la précédente. En effet, pour les PC du réseau caché, cette méthode paraîtra totalement transparente ; ils ne verront pas la différence et "croiront" qu'ils font partie du réseau plus gros.

Cependant, nous ne verrons l'application de cette technique que sous Linux. Simplement parce que pour le moment je ne me suis pas documenté pour Windows... J'ai juste trouvé une solution qui me convenait :-)

La solution consiste à installer un firewall (pare-feu) sur PC1. En fait, il jouera plus le rôle de passerelle que de firewall puisque nous allons utiliser une option bien pratique : l'IP Masquerading. Cette option permet au pare-feu de transférer tous les paquets qu'il reçoit d'une interface vers une autre en changeant à la volée l'IP source des paquets et en mettant la sienne à la place. Lorsqu'il reçoit les réponses, il effectue une opération similaire pour transmettre les paquets aux PC du réseau caché. Ainsi, il faudra juste configurer tous les PC du réseau caché pour qu'ils passent par la passerelle PC1. Et c'est tout ! Pas besoin de configurer de proxy... l'avantage est qu'avec cette technique, si l'accès à Internet dans le grand réseau nécessite de passer par un proxy, vous n'avez pas à changer la config de vos PC du réseau caché : ils passeront tous seuls par PC1 qui redirigera les requêtes vers le proxy. Enfin, afin d'acheminer correctement les paquets, il faudra juste installer un serveur cache DNS sur PC1 afin que les PC du réseau caché sachent faire la correspondance entre noms de domaines et IP.

3.i. Installation de Shorewall

Nous allons utiliser Shorewall. C'est un pare-feu qui se configure en ligne de commande (à la Linux, quoi), en modifiant ses fichiers de configuration. Il utilsie iptables, mais permet d'utilsier une syntaxe beaucoup plus simple, plus haut niveau, bref, plus pratique :)

Pour l'installation, je suppose que vous maîtrisez un minium votre distrib et que vous savez installer un logiciel à partir du système propre à votre distrib. Par exmeple, si vous êtes sous Debian/Ubuntu :

apt-get install shorewall

Sous Gentoo :

emerge shorewall

Etc... Je vous conseille de vous rapporter à la doc officielle de Shorewall et de votre distrib. Ceci devrait vous installer Shorewall, mais avant de l'utiliser il va falloir le configurer.

A partir de maintenant, les choses se compliquent. En effet, tout dépend de votre situation. Personnellement, mon interface eth0 est reliée au sous réseau caché (en fait, un unique PC, mais comme je l'ai dit cette solution est extensible à tout un petit réseau), et eth1 est reliée au grand réseau. Il va donc falloir adapter la configuration suivant votre situation.

La première chose à configurer est la notion de Zone. Une zone, pour shorewall, est (plus ou moins) un ensemble d'ordinateurs. Il y a forcément la zone "fw" de définie, qui correspond au pare-feu. Mais vous pouvez (et devez) définir les autres. Pour nous, ce sera "loc" pour le réseau local, caché, et "net", pour le gros réseau. Les deux sont chez moi en IPv4. Le fichier à configurer est /etc/shorewall/zones. Attention, il faut être root pour le modifier (et même pour le voir, d'ailleurs). Voici à qui ressemble le mien :

# pas mal de commentaires... à lire si vous voulez en savoir plus

fw      firewall
net     ipv4
loc     ipv4

#LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE

Comme vous le voyez, c'est simple : on définit juste le nom des zones. C'est dans le fichier /etc/shorewall/interfaces qu'il faut indiquer le lien ente ces zones et les interfaces :

#eth1 : gros réseau
#eth0 : réseau local caché
net     eth1            detect          dhcp,tcpflags,routefilter,nosmurfs,logmartians
loc     eth0            detect          tcpflags,detectnets,nosmurfs


#LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE

Adaptez si besoin. Remarquez que j'ai mi DHCP pour le réseau général car c'est comme ça que j'obtiens mon IP, mais cela peut ne pas être vote cas. Pour une liste des options, référez vous à la doc officielle.

Il faut ensuite configurer les politiques, c'est à dire les règles générale à suivre, hors cas particuliers. Là, cela dépend complétement de ce que vous voulez faire. Personnellement, je n'utilsie Shorewall que comme passerelle, j'ai donc une utilisation en tant que pare-feu très très limitée. Voici mon /etc/shorewall/policy :

# Autorise le réseau local à se connecter à l'extérieur
loc             net             ACCEPT

# Autorise le firewall à se connecter au réseau local
$FW             loc             ACCEPT

# Autorise le réseau local à se connecter au firewall
loc             $FW             ACCEPT

# If you want open access to the Internet from your Firewall
# remove the comment from the following line.
$FW             net             ACCEPT

# Refuse les demandes de connexion venant de l'extérieur
net             all             DROP            info

# AUTORISE LE RESEAU GLOBAL A SE CONNECTER AU FIREWALL
net             $FW             ACCEPT

# Refuse tout le reste
# THE FOLLOWING POLICY MUST BE LAST
all             all             REJECT          info

#LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE

Notez que $FW désigne la zone du firewall. Adaptez encore une fois selon vos besoins.

La configuration s'arrête là si vous avez configuré comme moi votre pare-feu en mode "gentil". Sinon, il vous reste les règles à configurer, dans le fichier /etc/shorewall/rules. Les exemples fournis avec le programme sont assez parlant, sinon, référez-vous aux commentaires ou à la doc.

Il ne reste plsu qu'à lancer Shorewall. Cela se fait en tapant en root :

shorewall start

Vous aurez compris que shorewall stop et shorewall restart servent respectivement à stopper et à redémarrer le firewall...

3.ii Installation du cache DNS

Maintenant, il faut installer un cache DNS sur PC1 pour qu'il effectue les requêtes DNS vers le réseau global, et que le réseau caché puisse y accéder.

Il y a plusieurs programmes qui font ca travail. Nous allons utiliser Dnsmasq, mais Blind peut aussi convenir. Pour l'installer, utilisez votre commande habituelle. Pour moi qui suis sous Ubuntu :

sudo apt-get install dnsmasq

Ensuite, editez /etc/dnsmasq.conf. Chez moi, toutes les lignes sont commentées sauf les deux suivantes :

domain-needed
bogus-priv

Sachez que Dnsmasq fait aussi serveur DHCP, si vous spécifiez quelques options comme dhcp-range. Mais pour ma config avec un seul PC dans le petit réseau, pas besoin ;-). Il ne vous reste plsu qu'à redémarrer dnsmasq (en root) :

/etc/init.d/dnsmasq restart

Et voila ! Vous avez une passerelle fonctionnelle. Si jamais vous avez configuré Shorewall en agressif, assurez-vous qu'il laisse passer les requêtes DNS ! Il ne reste plus qu'à configurer les PC clients pour qu'ils passent par PC1 en passerelle et en serveur DNS. Sous Windows, cela se fait dans les propriétés de la connexion, en graphique ; sous Linux, modifiez /etc/networking/interfaces. C'est tout !

Conclusion

Les deux techniques que nous venons de voir permetent donc d'avoir un petit réseau chez soi caché au sein d'un réseau "hostile" aux nouvelles connexions. Attention, caché ne veut pas dire complétement invisible. En effet, je n'ai pas sniffé en sortie ce qui se passe, mais il est tout à fait possible que des adresses mac de vos PC du réseau "caché" traînent dans les en-têtes des paquets... C'est donc une bonne solution, mais qui a ses limites. Et pour le moment, elle m'a montré ses preuves vu que je n'ai jamais eu de problèmes avec :)

Références

La doc de Shorewall m'a été infiniment utile. Elle est très bien faite, et est disponible en français pour ceux qui ont du mal. Sinon, je ne me suis basé sur aucun tutorial ou article pour mettre au point cette technique vu que je n'en ai pas trouvé (bien qu'il soit probable que je sois loin d'être le seul à l'avoir trouvé). Je remercie quand même Julek qui m'a incité à installer Shorewall et sans qui je n'aurais certainement pas pensé à cette technique...