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 :
- un 1er PC sous Debian et noyau 2.4 ou 2.6 connecté à Internet via l’interface ppp0 (ou autre, par exemple eth0, dans ce cas remplacer ppp0 dans le fichier
iptables-start
plus bas) ; - une carte Wifi supportant le mode Master avec les drivers madwifi (ici la NetGear WG311) ;
- un 2nd PC équipé d’une carte Wifi.
- Rappels réseau
- Configuration du noyau
- Installation des drivers madwifi
- Configuration de l’interface Wifi ath0
- Installation de la passerelle
- Configuration du DHCP
- Aller plus loin…
- Conclusion
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 :
wireless_mode Master
indique à la carte de fonctionner en mode Access Point (HostAP), comme les bornes que l’on trouve dans le commerce. La norme Wifi spécifie un autre mode permettant à deux équipements de se parler, c’est le mode Ad-Hoc destiné par exemple à l’interconnexion de laptops lors d’une réunion, mais ce mode est moins fiable et moins performant, alors puisque l’on peut s’en passer…- dans un 1er temps,
wireless_key off
permet de désactiver le contrôle d’accès ; quand le réseau fonctionnera dans ce mode on pourra par exemple remplacer cette ligne parwireless_key s:abcdefghijklm
et, si le laptop est un Windows, entrer dans la section Clefs partagées de l’utilitaire wireless le mot de passe abcdefghijklm.
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.