Il y a quelques semaines, un client me laisse un message pour une question relative à NAT sur de l'IOS Cisco. Théoriquement, c'était pas spécialement compliqué, j'avais mon idée, il fallait simplement le vérifier par l'expérience. J'avais environ deux heures d'attente pour un train et je me suis dit que ce serait un beau challenge de faire tourner un lab virtuel avec un accès réel sur Internet pour vérifier la réponse que je voulais laisser à mon client. Chiche ! Croyez-le ou non, ça m'a pris un peu plus d'une heure grâce à notre ami Google. Voilà pour l'histoire derrière cet article :-)
Je sais qu'il y a quelques fans de GNS3 sur ce forum, il y en a peut-être qui l'utilisent sous Unix, d'où l'intérêt de partager les quelques notes que j'avais compilées suite à cette manip 
Quand j'accède à Internet au travers de mon Blackberry, mon laptop monte une interface ppp. Le fait que mon laptop accède au net par un lien ppp n'a pas d'importance, ça pourrait être une interface Ethernet. A vous d'adapter ! L'hypothèse de base, c'est que vous ayez accès à Internet depuis votre machine Linux, quelle que soit l'interface, et bien évidemment que vous soyez root de votre machine.
1) Faisons le point sur les interfaces.
1 2 3 4 5 6 7 8 9 10 11 12 13
| root@steph-ThinkPad-T400:~# ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
link/ether 00:24:7e:6e:5a:e8 brd ff:ff:ff:ff:ff:ff
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN qlen 1000
link/ether 00:1e:65:41:fc:94 brd ff:ff:ff:ff:ff:ff
4: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 3
link/ppp
inet 10.167.241.66 peer 169.254.1.1/32 scope global ppp0 |
J'accède donc à l'Internet au travers de l'interface ppp0.
2) Si ça n'est pas déjà fait, il faut maintenant importer le package uml-utilities pour pouvoir créer une interface tap. Vous faites ça avec votre packet manager favori ou bien avec un 'apt-get install uml-utilities'.
3) Maintenant, c'est le moment de faire un petit schéma de ce qu'on veut faire. On va créer un réseau d'interconnexion entre GNS3 et l'interface tap0 de votre machine Linux. Supposons que ce soit 1.1.1.0/24 :
1 2 3
| +-------+
INTERNET ------- ppp0 | Linux | tap0 --- 1.1.1.0/24 --- Routeur R1 GNS3
+-------+ .1 .2 |
4) Création de l'interface tap0.
1 2 3
| root@steph-ThinkPad-T400:~#modprobe tun
root@steph-ThinkPad-T400:~#tunctl
root@steph-ThinkPad-T400:~#ifconfig tap0 1.1.1.1 netmask 255.255.255.0 up |
On vérifie que ça répond bien :
1 2 3 4
| root@steph-ThinkPad-T400:~# ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_req=1 ttl=64 time=0.042 ms
64 bytes from 1.1.1.1: icmp_req=2 ttl=64 time=0.029 ms |
So far, so good...
5) On active le routage entre les interfaces up :
root@steph-ThinkPad-T400:~#sysctl -w net.ipv4.ip_forward=1
6) Puis on ouvre les flux entrant/sortant qui traversent l'interface tap0. Après, à vous de régler un peu plus finement si besoin est avec des ipchains et tout le bazar qui va avec 
1 2
| root@steph-ThinkPad-T400:~#sudo iptables -I INPUT -j ACCEPT -i tap0
root@steph-ThinkPad-T400:~#sudo iptables -I OUTPUT -j ACCEPT -o tap0 |
7) Enfin, on active NAT en sortie sur l'interface ppp0.
root@steph-ThinkPad-T400:~#iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
C'est l'équivalent d'un 'nat overload' dans l'IOS Cisco configuré sur ppp0 !
Si l'interface qui connecte votre Linux à Internet est par exemple eth0, la commande serait bien sûr
iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE
8) Il ne reste plus qu'à configurer GNS3.
Ouvrir GNS3 et glisser un nuage dans la map.
Clic droit, Configurer et aller dans l'onglet NIO TAP.
Saisir tap0, puis Ajouter.
Glisser un routeur Cisco dans la map. Dans mon cas, c'est un 3600.
Créer un lien manuel Ethernet entre le nuage et le Cisco, dans mon cas, c'est entre l'interface fa0/0 du 3600 et l'interface nio_tap:tap0 du nuage.
Enfin, on configure le routeur avec le DNS Google par exemple, l'adresse IP de l'interface fa0/0 et surtout la default route qui doit pointer vers tap0 :
1 2 3 4 5 6 7
| R1#conf t
R1(config)#ip name-server 8.8.8.8
R1(config)#ip route 0.0.0.0 0.0.0.0 1.1.1.1
R1(config)#int fa0/0
R1(config-if)#ip add 1.1.1.2 255.255.255.0
R1(config-if)#no shut
R1(config-if)#^Z |
Bien, voilà où nous en sommes :

Depuis votre lab virtuel, R1 a maintenant accès à Internet !
1 2 3 4 5 6 7 8
| R1#ping <a href="http://www.developpez.com" target="_blank">www.developpez.com</a>
Translating "www.developpez.com"...domain server (8.8.8.8) [OK]
Type escape sequence to abort.
Sending 5, 100-bytes ICMP Echos to 87.98.130.52, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 224/236/240 ms |
Voilà, vous avez mis en œuvre ce que certains appellent un "chock network" (R1 est le "chock router").
Maintenant, rien ne m'empêche de configurer R1 pour faire un nouveau point de translation (suffit de faire du NAT overload sur l'interface fa0/0), voire le remplacer par un ASA dans GNS3.
Autre intérêt, si vous avez bien suivi toutes les étapes, il est très facile de monter un script. Il suffit ensuite d'éditer le script avec les bonnes interfaces et les bonnes adresses IP si vous voulez changer le "chock network". Inutile de réinventer la roue...
Bonne config sous GNS3 
Steph
Partager