Introduction
Pour pouvoir imaginer faire un relais sur mon serveur (je parlerais de serveur quand je parle de ma station ubuntu car c’est ça son rôle) il faut mettre en place plusieurs choses :
- configurer l’interface wifi du serveur
- créer un serveur DHCP sur le serveur de manière à pouvoir se connecter sur cette interface automatiquement (en obtenant une IP)
- créer un serveur DNS sur le serveur de manière à pouvoir répondre aux résolutions de noms
- créer un NAT sur le réseau wifi de manière à ce qu’il puisse se connecter au réseau extérieur
Une fois que ces choses là seront faites ça devrais fonctionner.
Configurer l’interface wifi du serveur
Alors y et allons sur le serveur.Pour commencer il est nécessaire de désinstaller le « network-manager » sinon vous allez avoir tous les problèmes du monde. En effet, ce network manager vous empêchera de configurer votre réseau comme vous le souhaitez et voudra chaque fois reconfigurer les fichiers systèmes à sa manière. Evitez dans la mesure du possible de passer par les menus d’administration graphique qui ne sont pas assez complets pour avoir les mains libres. Ces menus ont tendance à modifier les fichiers trop facilement et tous vos efforts s’avèreraient vains.
Commencez donc par
[bash] sudo apt-get remove network-manager
Faites ensuite un petit backup de votre fichier de configuration réseau au cas où :
[bash] sudo cp /etc/network/interfaces /etc/network/interfaces.back
Avant de mettre les mains à la pâte je tiens à préciser que ma configuration est la suivante :
- eth0 : l’interface qui se connecte vers internet
- ra0 : l’interface wifi sur laquelle je veux connecter un « sous-réseau »
Ma carte réseau wifi est la suivante :
[bash] $ lspci |grep 'Network controller' 0000:02:09.0 Network controller: RaLink Ralink RT2500 802.11 Cardbus Reference Card (rev 01)
Allez maintenant configurer votre connection internet. Allez dans le fichier /etc/network/interface :
[bash] # l interface loopback doit rester ainsi, inutile de la modifier auto lo iface lo inet loopback # Primary network interface : dans mon cas eth0 (interface vers internet) # cette interface sera demarree par le script iptables # donc elle est exempte de la ligne"auto" iface eth0 inet dhcp # Second network interface : dans mon cas ra0 # interface de relais qui se connectera au portable wifi iface ra0 inet static address 192.168.157.1 network 192.168.157.0 netmask 255.255.255.0 broadcast 192.168.157.255 pre-up ifconfig ra0 up pre-up ifconfig ra0 down pre-up ifconfig ra0 up pre-up ifconfig ra0 down pre-up iwconfig ra0 essid "TUX-wifi" pre-up iwconfig ra0 mode ad-hoc pre-up ifconfig ra0 up auto ra0
Comme vous voyez, les lignes de paramètrage pour mon interface ra0 sont un peu bizarres, mais je me suis strictement basé sur la configuration proposée dans la documentation ubuntu concernant mon matériel
Autre information importante, je configure ici mon interface ra0 en mode ad-hoc. Nous fonctionneront donc toujours dans le mode ad-hoc dans notre cas.
Créer un serveur DHCP
Alors ici y’a plusieurs possibilités. On peut le faire avec dnsmasq ou avec dhcp3. Je n’y suis pas parvenu avec dnsmasq, donc je parlerais de dhcp3.
Installez d’abord dhcp3 :
[bash] sudo apt-get install dhcp3-server
Configurons maintenant dhcp3-server en modifiant le fichier /etc/dhcp3/dhcpd.conf :
[bash] # The ddns-updates-style parameter controls whether or not the server will # attempt to do a DNS update when a lease is confirmed. We default to the # behavior of the version 2 packages ('none', since DHCP v2 didn t # have support for DDNS.) ddns-update-style ad-hoc; # option definitions common to all supported networks... option domain-name "tux-master.lan"; option domain-name-servers 192.168.157.1; log-facility local7; # Configuration of specific interface subnet 192.168.157.0 netmask 255.255.255.0 { range 192.168.157.50 192.168.157.200; option domain-name-servers 192.168.157.1; option domain-name "tux-master.lan"; option routers 192.168.157.1; option broadcast-address 192.168.157.255; default-lease-time 600; max-lease-time 7200; }
C’est bon, on est en bon chemin. Maintenant votre connexion wifi peut accepter des connexions et les parametrer automatiquement en leur fournissant une adresse IP. C’est bien beau me direz vous, mais avec cette IP appartenant à un autre sous-réseau impossible de se connecter sur internet. De plus, impossible de résoudre les noms dans ce sous-domaine car aucun serveur DNS n’est encore configuré.
Pas de panique, ça vient …
Créer un serveur DNS
Cette fois-ci nous avons besoin d’un logiciel qui s’appelle « bind ». Les versions de bind sont nombreuses, mais ici je me base du bind9 :
[bash] sudo apt-get install bind9
Une fois de plus il est question de configuration personalisée. Commencons par configurer le fichier de base /etc/bind/named.conf. Voici les sections importantes que vous devez avoir :
zone "tux-master.lan" { type master; file "/etc/bind/db.tux-master.lan"; }; zone "157.168.192.in-addr.arpa" { type master; file "/etc/bind/db.192.168.157"; };
Un serveur DNS fonctionne par zones. Ici les zones sont définies sur un nom de domaine tux-master.lan arbitrairement choisi par moi et son adresse IP correspondante (c’est bien ça le rôle d’un serveur DNS). Notez bien que pour la zone in-addr.arpa on ne met que les 3 premiers chiffres de l’adresse IP dans leur ordre inverse !!
Nous faisons référence dans ce dernier fichier à deux fichiers : /etc/bind/db.tux-master.lan et /etc/bind/db.192.168.157. Nous allons donc créer ces deux fichiers de la manière suivante :
/etc/bind/db.tux-master.lan:
$TTL 604800 @ IN SOA ns.tux-master.lan. hostmaster.tux-master.lan. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns.tux-master.lan. @ IN A 127.0.0.1 ns IN A 192.168.157.1 tux-master IN A 192.168.157.1 macbook IN A 192.168.157.200
Ici comme vous pouvez le constater j’associe à un nom de domaine des adresses IP
Dans le fichier suivant nous allons associer à des adresses IP un nom de domaine, Soit la configuration inverse :
$TTL 604800 @ IN SOA ns.tux-master.lan. hostmaster.tux-master.lan. ( 1 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS ns.tux-master.lan. 1 IN PTR ns.tux-master.lan. 1 IN PTR tux-master.tux-master.lan. 200 IN PTR macbook.tux-master.lan.
Créer un NAT
Nous sommes maintenant arrivé à la dernière étape de notre tutorial, créer un NAT qui devra gérer toutes les connexions du réseau et forwarder les paquets vers l’extérieur ou l’intérieur de notre sous-réseau.
Alors voilà, c’est pas très compliqué. Je me base essentiellement sur le programme iptables :
sudo apt-get install iptables
Normalement vous ne disposez pas encore d’un fichier /etc/init.d/iptables. Il faudra donc le créer. Alors voici un exemple de ce que vous devez mettre dedans (attention de corriger le nom des interfaces réseau que vous avez si c’est nécessaire)
[bash] #!/bin/sh start() { # init du la périphérique internet (ici derriere un modem ADSL ethernet, DHCP client) /sbin/ifup eth0 # (Effacez les règles en cours) iptables -F iptables -t nat -F # (Configurez les règles par défaut pour s occuper du traffic restant) iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # (Copiez et collez ces exemples...) LAN=ra0 WAN=eth0 # (Rendez les services accessibles uniquement à nos machines locales) iptables -I INPUT 1 -i ${LAN} -j ACCEPT iptables -I INPUT 1 -i lo -j ACCEPT iptables -A INPUT -p UDP --dport bootps -i ! ${LAN} -j REJECT iptables -A INPUT -p UDP --dport domain -i ! ${LAN} -j REJECT # (Facultatif : autoriser l accès au serveur ssh depuis l extérieur) iptables -A INPUT -p TCP --dport ssh -i ${WAN} -j ACCEPT # (Éliminez les paquets destinés aux ports privilégiés) iptables -A INPUT -p TCP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP iptables -A INPUT -p UDP -i ! ${LAN} -d 0/0 --dport 0:1023 -j DROP # (Ajoutez les règles pour le NAT) iptables -I FORWARD -i ${LAN} -d 192.168.0.0/255.255.0.0 -j DROP iptables -A FORWARD -i ${LAN} -s 192.168.0.0/255.255.0.0 -j ACCEPT iptables -A FORWARD -i ${WAN} -d 192.168.0.0/255.255.0.0 -j ACCEPT iptables -t nat -A POSTROUTING -o ${WAN} -j MASQUERADE # (Indiquez au noyau d effectuer le transfert IP) echo 1 > /proc/sys/net/ipv4/ip_forward for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done # (Enregistrez les règles ci-dessus pour le prochain démarrage) # /etc/init.d/iptables save # rc-update add iptables default # nano /etc/sysctl.conf # (Ajoutez ou décommentez les lignes ci-dessous) # net.ipv4.ip_forward = 1 # net.ipv4.conf.default.rp_filter = 1 # (Si vous avez une adresse internet dynamique, vous désirez probablement # activer l option suivante : # net.ipv4.ip_dynaddr = 1 ) } stop() { echo 0 >/proc/sys/net/ipv4/ip_forward ifdown ethO } case "$1" in start) start ;; stop) stop ;; restart) stop && start ;; *) echo "Usage $0 {start|stop|restart}" exit 1 esac exit 0
Rendez le fichier exécutable :
[bash] sudo chmod +x /etc/init.d/iptables
Et maintenant arrangez vous pour que le script soit chargé à chaque démarrage :
[bash] sudo update-rc.d /etc/init.d/iptables defaults
Encore une dernière petite chose doit être configurée. Il s’agit du fichier /etc/sysctl.conf :
net/ipv4/conf/all/rp_filter=1 net/ipv4/ip_dynaddr=1 # Uncomment the next line to enable TCP/IP SYN cookies #net/ipv4/tcp_syncookies=1 # Uncomment the next line to enable packet forwarding for IPv4 net/ipv4/ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 #net/ipv6/ip_forward=1
En gros il faut activer le forward des paquets IPV4 (principe du NAT).
Test
Passons à la pratique et voyons si ça marche :
- Rechargez l’interface réseau :
[bash] sudo /etc/init.d/networking restart
- Rechargez l’interface de routage iptables:
[bash] sudo /etc/init.d/iptables restart
- Rechargez votre serveur DHCP :
[bash] sudo /etc/init.d/dhcp3-server restart
- Rechargez votre serveur DNS :
[bash] sudo /etc/init.d/bind9 reload
Essayez de vous connectez à votre réseau local ad-hoc. Normallement ça devrais fonctionner !!
Je l’espère du moins car j’ai décrit ici ma manière de m’y prendre, mais j’espère que je n’ai pas oublié l’un ou l’autre détail qui pourrait poser problème. Donc si vous avez un problème après ce tutorial, n’hésitez pas à poster un commentaire ici, je me ferais un plaisir de vous répondre ASAP (as soon as possible) 😉
Quelques améliorations à apporter
Il faudrait ensuite encore sécuriser ce réseau de plusieurs manières, mais ici je ne m’en occupe pas, je reste très basique. Mais on pourrait :
- protéger la connexion wifi avec une clé
- limiter l’accès à quelques adresses MAC
- limiter les pages accessibles en dehors du réseau local (grâce au script iptables)
- …
Notes de mise à jour pour Ubuntu 9.04
Ce tutoriel a déjà été écrit il y a quelques temps. Merci à L’Ankou pour ses remarques constructives pour remettre à jour ce tutorial :
Pour mettre iptables en démarrage auto, il ne faut pas entrer :
sudo update-rc.d /etc/init.d/iptables defaults
mais :
sudo update-rc.d iptables defaults
Quelques autres sites d’aide
Voici quelques autres sites sur lesquels je me suis basé pour faire ma configuration. Peut-être que ça peut aussi vous être utile :