Faire un relais wifi sur Ubuntu

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 :