Passerelle ADSL-Wifi

La page Speedtouch & Debian expliquait comment connecter votre PC à Internet. Mais si vous voulez vous connecter avec un 2nd PC sans débrancher le 1er, il faut transformer ce dernier en passerelle. Et pour peu que le 2nd PC soit un laptop, ce serait bien pratique de le relier en Wifi ! Cette page vous explique comment faire tout ça avec une debian (sarge), un noyau 2.4 ou 2.6, une carte WLAN NetGear WG311 (802.11g) et les drivers madwifi. On peut sans doute l’adapter facilement à d’autres configurations.

Matériel nécessaire :


Rappels réseau

On va monter un petit réseau ; c’est pas très compliqué mais ce sera encore plus agréable si vous avez les idées claires sur les notions réseau de base. Pour cela n’hésitez pas à jeter un oeil sur cette excellente page. Pour ce qui est du principe d’une passerelle, j’ai pour ma part vu la lumière grâce à ces schémas (merci alexis !).

Configuration du noyau

En root dans le répertoire où l’on a décompressé les sources d’un noyau 2.4 (en 2.6 Networking options est sous Device Drivers > Networking support > Networking support, et il n’y a plus de Socket Filtering à activer), faire un make xconfig et choisir les options suivantes.

Networking options

        [y] Packet socket: mmapped IO
        [y] Network packet filtering (replaces ipchains)
        [y] Socket Filtering
        IP: Netfilter Configuration
            [m] Connection tracking (required for masq/NAT)
            [m] FTP protocol support
            [m] IRC protocol support
            [m] IP tables support (required for filtering/masq/NAT)
            [m] netfilter MARK match support
            [m] Multiple port match support
            [m] Connection state match support
            [m] Packet filtering
            [m] REJECT target support
            [m] Full NAT
            [m] MASQUERADE target support
            [m] Packet mangling
            [m] LOG target support
            [m] TCPMSS target support

Network device support

        Wireless LAN (non-hamradio)
            [y] Wireless LAN (non-hamradio)

Cela fait, compiler le noyau et les modules, et les installer (make dep clean bzImage modules modules_install, ou bien en 2.6 make; make modules_install et copie des fichiers bzImage, voire System.map et .config, enfin lilo ou équivalent).

Rebooter avec ce beau noyau.

Installation des drivers madwifi

La carte doit être insérée dans un port PCI et apparaître avec un lspci (pour ma part j’ai alors une ligne 0000:00:09.0 Ethernet controller: Atheros Communications, Inc. AR5212 802.11abg NIC (rev 01)).

Le Wifi 802.11g (qui permet un débit théorique de 54 Mbps, contre 11 Mbps avec la norme 802.11b) n’est pas encore supporté en natif dans le noyau linux ; heureusement des projets parallèles permettent néanmoins d’exploiter les chipsets haut débit. Les deux principaux sont madwifi (chipsets Atheros) et Prism54 (chipsets Prism). Une recherche sur Google montre que des gens sont parvenus à faire fonctionner la WG311 avec les deux drivers, mais le plus adapté est le madwifi (et il permet le mode Master, cf. plus loin).

En root dans un répertoire où les sources des drivers seront stockés sous madwifi/ (par exemple ~root), faire :

cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/madwifi co madwifi
cd madwifi
make
make install
modprobe ath_pci

Pour que la prochaine fois le chargement du module soit automatique, rajouter dans /etc/modutils/aliases une ligne alias ath0 ath_pci puis exécuter update-modules pour mettre à jour /etc/modules.conf.

Configuration de l’interface Wifi ath0

Il faut tout d’abord installer les utilitaires wireless (not. iwpriv et iwconfig) : apt-get install wireless-tools

Ensuite on complète le /etc/network/interfaces :

# Interface WLAN : cf. iwconfig(8)
auto ath0
iface ath0 inet static
	address		192.168.0.1
	netmask		255.255.255.0
	pre-up /sbin/iwpriv ath0 mode 3
	# Mode 3 = 802.11g / 2 = 802.11b / 1 = 802.11a
	wireless_essid	Nom-du-reseau
	wireless_mode	Master
	wireless_channel	9
	wireless_key	off

NB :

On peut maintenant monter l’interface : ifup ath0

iwconfig ath0 permet d’avoir des infos sur l’état de la carte Wifi. Et si le 2nd poste scanne les fréquences il doit voir apparaître le réseau Nom-du- reseau, sans encryption, utilisant le canal 9. On doit même pouvoir s’y connecter et faire un ping 192.168.0.1. Mais on ne peut pas encore aller sur Internet…

Installation de la passerelle

Notre passerelle utilisera le mécanisme de translation d’adresse réseau (NAT en Anglais, masquerading en Linuxien), qui est implémenté par le programme iptables (qui est aussi ze firewall de référence, mais on ne s’attardera pas ici sur cette partie). On installe donc iptables : apt-get install iptables. Puis on fait un fichier d’initialisation des tables de filtrage que l’on place sous /etc/network/if-pre-up.d/ sans lui donner de suffixe .sh, de sorte qu’il sera appelé par le run-parts avant le montage de l’interface lo (mais si on veut tester sans rebooter on peut très bien le lancer à la main, voire faire un /etc/init.d/networking restart) :

#!/bin/sh
# /etc/network/if-pre-up.d/iptables-start
#
# Initialise les règles de filtrage iptables
# D'après http://people.via.ecp.fr/~alexis/formation-linux/config/iptables-start.sh
#####

# Remise à zéro des règles
iptables -F
iptables -t nat -F

#
# Politiques par défaut
#
#####
# Accepte les connexions entrantes
iptables -P INPUT ACCEPT
# Accepte les connexions destinées à être forwardées
iptables -P FORWARD ACCEPT
# Accepte les connexions sortantes
iptables -P OUTPUT ACCEPT

#
# Règles de filtrage
#
#####
# Pas de filtrage
iptables -A INPUT -j ACCEPT

#
# Règles pour le partage de connexion (le NAT)
#
#####
# Le système fait serveur NAT ; l'interface extérieure est ppp0
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# Si la connexion que vous partagez est une connexion ADSL, vous
# serez probablement confronté au fameux problème du MTU. En résumé,
# le problème vient du fait que le MTU de la liaison entre votre
# fournisseur d'accès et le serveur NAT est un petit peu inférieur au
# MTU de la liaison Ethernet qui relie le serveur NAT aux machines qui
# sont derrière le NAT. Pour résoudre ce problème :
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o ppp0 --clamp-mss-to-pmtu

#
# Règles de port forwarding
#
#####
# Décommentez la ligne suivante pour que les requêtes TCP reçues sur
# le port 80 de l'interface eth0 soient forwardées à la machine dont
# l'IP est 192.168.0.3 sur son port 80 (la réponse à la requête sera
# forwardée au client)
#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80

Là encore, lorsque le réseau fonctionnera, ce sera une bonne idée de le sécuriser en rajoutant dans ce fichier des règles un peu moins laxistes.

NB : si iptables refuse de démarrer en prétextant des unresolved symbols à gogo, recompiler le noyau en commençant par un make mrproper.

Enfin on n’oublie surtout pas d’activer l’ip_forwarding dans le noyau : echo 1 >| /proc/sys/net/ipv4/ip_forward, et pour que ce soit fait à chaque démarrage on rajoute dans /etc/sysctl.conf une ligne net/ipv4/ip_forward=1 (Debian fournit désormais un fichier /etc/network/options; s’il existe sur votre système contentez-vous plutôt de changer ip_forward=no à yes).

Voilà, si la carte est bien installée sur le laptop on doit pouvoir pinguer une IP extérieure ; si ça ne fonctionne pas on peut regarder ce qui transite sur les interfaces avec un tcpdump -i ath0 et un tcpdump -i ppp0.

Configuration du DHCP

Le problème c’est qu’à moins de configurer en dur les serveurs DNS sur le laptop, on ne peut atteindre que des IP, pas des noms genre www.cnedra.org. La solution c’est d’installer un serveur DHCP qui enverra au client la liste des serveurs DNS de notre FAI (ici codée en dur avec ceux de Wanadoo ; on pourrait imaginer un mécanisme de recopie à partir du resolv.conf lorsque ppp0 est montée…) : apt-get install dhcp3-server, puis on édite /etc/dhcp3/dhcpd.conf :

# /etc/dhcp3/dhcpd.conf
#
# Config du serveur DHCP de l'ISC (package 'dhcp3-server')
# D'après http://people.via.ecp.fr/~alexis/formation-linux/config/dhcpd.conf
# cf. dhcpd.conf(5)
#####

#
# Options globales
# (s'appliqueront par défaut à tous les sous-réseaux)
#####
# Nom de domaine
#option domain-name "exemple.org";

# Adresses des serveurs DNS (séparées par une virgule)
option domain-name-servers 80.10.246.1, 80.10.246.132;

# Durée du bail en secondes
default-lease-time 6000;
max-lease-time 6000;

# Le serveur DHCP est autoritaire pour les sous-réseaux déclarés ci-dessous
authoritative;

#
# Déclaration des sous-réseaux et des machines
#
#####
# Déclaration du sous-réseau 192.168.0.0/255.255.255.0
subnet 192.168.0.0 netmask 255.255.255.0
{
	# Adresse du routeur
	option routers 192.168.0.1;
	# Plage d'adresses à attribuer pour les machines non déclarées
	range 192.168.0.100 192.168.0.200;
#	deny unknown-clients;
}

# La déclaration d'une machine permet de lui attribuer une adresse IP fixe
host MonLaptop
{
  hardware ethernet 00:0b:cd:5a:fb:43;	# @MAC de la carte Wifi du laptop
  fixed-address 192.168.0.12;
}

NB : là encore pour sécuriser on pourrait retirer le commentaire devant deny unknown-clients, mais cela rendrait moins souple l’extension du réseau.

Voilà, maintenant si on renouvelle la config réseau du laptop (sous Windows : ipconfig /renew, puis ipconfig /all pour voir la nouvelle config) les serveurs DNS devraient être bien configurés, et l’on pourra accéder à www.cnedra.org.

Aller plus loin…

On peut vouloir accéder à un VPN depuis notre laptop ; dans ce cas commencer par essayer d’établir la connexion comme si l’on était branché directement. En effet si le protocole utilisé par le VPN est L2TP, notre passerelle linux ne nécessite aucune modification ; en revanche il est probable si le laptop est sous Windows 2000 qu’il faudra appliquer un patch permettant au L2TP de traverser le NAT).

Conclusion

Voilà, on a créé notre Access-Point Wifi ; il faut maintenant bien sûr faire attention aux problèmes de sécurité qui ne sont qu’évoqués dans cette page ; cela dit il n’est pas interdit de trouver charmante la perspective d’un maillage d’Access-Points ouverts qui couvrirait nos agglomérations. À bon entendeur…

Cet article publié en mai 2004 a été mis à jour.

En lire plus sur : linux