Partager une connexion filaire en WiFi

Comment partager la connexion filaire d’une machine Linux en WiFi ?

La problématique est la suivante : « un utilisateur disposant d’un portable sous Linux connecté sur un réseau filaire souhaite partager sa connexion avec des appareils mobiles (téléphones, tablettes, etc) en Wifi ».


Partager en 30 secondes

Lancer les commandes suivantes en root (un copier/coller suffit) :

# Configuration du réseau : 
ifconfig wlan0 down
iwconfig wlan0 mode ad-hoc
iwconfig wlan0 channel auto
iwconfig wlan0 key 1234567890
iwconfig wlan0 essid Shared
ifconfig wlan0 up
ifconfig wlan0 172.31.1.1 netmask 255.255.255.0
# Configuration DHCP :
dnsmasq -i wlan0 -F 172.31.1.50,172.31.1.100 -O option:router,172.31.1.1
# Configuration du routage :
sysctl -w net.ipv4.ip_forward=1
iptables -A FORWARD -i wlan0 -s 172.31.1.0/255.255.255.0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Connectez vos appareils en wifi sur le réseau « Shared », clé WEP « 1234567890 ».

Ça ne fonctionne pas ? Vérifiez que « network-manager » est désactivé et que « dnsmasq » est installé avant de ré-essayez.
Toujours pas ? Lisez la suite …

Prérequis

  • Une machine sous Linux connectée en filaire et opérationnelle disposant d’une carte wifi ;
  • les commandes « iwconfig », « ifconfig », « iptables » et « dnsmasq » ;
  • un accès root à la machine.

Vérifier que le réseau fonctionne correctement via un « ping » d’une adresse externe par exemple :

fhh@mafalda ~ $ ping -c1 www.google.com
PING www.google.com (173.194.67.103) 56(84) bytes of data.
64 bytes from wi-in-f103.1e100.net (173.194.67.103): icmp_req=1 ttl=49 time=10.0 ms
 
--- www.google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 10.049/10.049/10.049/0.000 ms

Note : « network-manager » peut parfois poser problème pour le partage de connexion. En cas de dysfonctionnement désactivez le.

Choix des paramètres

Les paramètres à choisir sont :

  • l’ESSID : le nom du réseau Wifi créé. Choisissez un réseau libre. Pour l’exemple prenons « FHH ».
  • La clé wep utilisée pour « protéger » le réseau (WEP n’est pas des plus sûr, mais est suffisant pour ce type d’application). Ici, nous utiliserons « 1234567890 ».
  • La plage IP du réseau Wifi. Choisissez-en une différente de celle du réseau filaire auquel vous êtes connecté. Dans l’exemple, le filaire est en 10.0.0.0/24, nous créerons un réseau wifi en 192.168.1.*.
  • L’adresse donnée à l’interface wifi. Elle doit être dans la plage IP choisie ci-dessus. Dans l’exemple nous la fixons à « 192.168.1.1 »

Configuration du Wifi

Une fois les paramètres choisis, nous pouvons configurer le wifi en root via « iwconfig » et « ifconfig » :

mafalda ~ # ifconfig wlan0 down # Arrêt de l'interface wifi
mafalda ~ # iwconfig wlan0 mode ad-hoc # Passage en mode ad-hoc
mafalda ~ # iwconfig wlan0 channel auto # Le système choisi le canal
mafalda ~ # iwconfig wlan0 key 1234567890 # Protection du réseau (WEP)
mafalda ~ # iwconfig wlan0 essid FHH # Nommage du réseau
mafalda ~ # ifconfig wlan0 up # Démarrage de l'interface wifi
mafalda ~ # ifconfig wlan0 192.168.1.1 netmask 255.255.255.0 # Attribution de l'IP à l'interface.

Si aucune erreur n’est retournée, la configuration wifi est en place. Vous pouvez le vérifier sur la machine :

mafalda ~ # iwconfig wlan0
wlan0     IEEE 802.11abg  ESSID:"FHH"  
          Mode:Ad-Hoc  Frequency:2.412 GHz  Cell: 2E:2B:50:A3:61:02   
          Tx-Power=15 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Encryption key:1234-5678-90
          Power Management:on
mafalda ~ # ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
...

Les appareils mobiles peuvent dès cette étape se joindre au wifi créé !
Ils ne récupères cependant pas d’IP (pas de DHCP) et ne peuvent accéder au réseau (pas de forwarding).

Distribuer des configurations réseau

La connectivité wifi est en place. Il faut maintenant configurer un serveur DHCP pour envoyer aux postes clients une configuration réseau.
Dans notre exemple nous utiliserons « dnsmasq ». Vous pouvez le configurer par un fichier ou lui passer les paramètres directement en ligne de commande.

Les données à renseigner sont :

  • l’interface d’écoute (-i) : interface par laquelle le DHCP reçoit les requête et diffuse les configurations réseau (ici l’interface wifi « wlan0 ») ;
  • la plage d’IP distribuée (-F) : donne la borne inférieure et supérieure de la plage d’adresse IP distribuée (dans l’exemple, nous distribuerons des IPs comprises entre « 192.168.1.50 » et « 192.168.1.100 ») ;
  • l’adresse de la passerelle (-O option:router ) : soit dans notre cas l’IP de l’interface wifi (« 192.168.1.1 ») ;
  • l’adresse des DNS (-0 option:dns-server) : si cette option n’est pas précisée, dnsmasq récupère cette info dans « /etc/resolv.conf ».

« dnsmasq » En ligne de commande

Toutes les données nécessaires peuvent être passée à « dnsmasq » lors de son invocation :

mafalda ~ # dnsmasq -i wlan0 -F 192.168.1.50,192.168.1.100 -O option:router,192.168.1.1

Si vous souhaitez forcer des DNS particulier (utile sur certaines version de UBUNTU intégrant leurs propres DNS), l’option « -R » désactive la lecture de « /etc/resolv.conf » et vous devez préciser les DNS par défaut via l’option « -O ». Exemple en utilisant les DNS publiques de Google :

mafalda ~ # dnsmasq -R -i wlan0 -F 192.168.1.50,192.168.1.100 -O option:router,192.168.1.1 -O option:dns-server,8.8.8.8,8.8.4.4

Par défaut, « dnsmasq » est lancé en mode démon. L’option « -d » permet de déboguer et de vérifier le fonctionnement (attention : ne rend pas la main). Exemple de débogage :

mafalda ~ # dnsmasq -d -i wlan0 -F 192.168.1.50,192.168.1.100 -O option:router,192.168.1.1
dnsmasq: started, version 2.63rc6 cachesize 150
dnsmasq: compile time options: IPv6 GNU-getopt DBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack
dnsmasq-dhcp: DHCP, IP range 192.168.1.50 -- 192.168.1.100, lease time 1h
dnsmasq: reading /etc/resolv.conf
dnsmasq: using nameserver 10.0.0.100#53
dnsmasq: using nameserver 8.8.8.8#53
dnsmasq: using nameserver 8.8.4.4#53
dnsmasq: read /etc/hosts - 1 addresses
dnsmasq-dhcp: DHCPDISCOVER(wlan0) 00:e8:d7:6a:ba:b1 
dnsmasq-dhcp: DHCPOFFER(wlan0) 192.168.1.62 00:e8:d7:6a:ba:b1 
dnsmasq-dhcp: DHCPREQUEST(wlan0) 192.168.1.62 00:e8:d7:6a:ba:b1 
dnsmasq-dhcp: DHCPACK(wlan0) 192.168.1.62 00:e8:d7:6a:ba:b1 android-3522sdfqse32

Un fichier de configuration pour « dnsmasq »

« dnsmasq » Est un outil complet largement sous-exploité dans le cas qui nous intéresse. Plutôt que de reprendre le fichier de configuration par défaut, et de l’adapter, je vous propose un fichier ne contenant que les paramètres qui nous intéressent :

mafalda ~ # cat ~/conf/dnsmasq.shared.conf
# Interface d'écoute :
interface=wlan0
# Plage d'IPs allouées : 
dhcp-range=192.168.1.50,192.168.1.100,255.255.255.0
# Adresse du routeur :
dhcp-option=option:router,192.168.1.1
# Adresse des DNS (facultatif) :
# dhcp-option=option:dns-server,8.8.8.8,8.8.4.4
# Ne pas lire "/etc/resolv.conf" (facultatif) :
# no-resolv

Préciser le fichier de configuration à utiliser au démarrage de « dnsmasq » :

mafalda ~ # dnsmasq -C ~/conf/dnsmasq.shared.conf

Tous les appareils connectés à votre wifi doivent maintenant recevoir une configuration réseau.
Ils « pingent« , mais ne peuvent accéder à internet (forwarding et masquerading restent à activer).

Routage du trafic

Maintenant que les périphériques mobiles ont une configuration réseau, il faut relayer leurs requêtes vers internet. Il faut pour cela activer l’IP forwarding :

mafalda ~ # sysctl -w net.ipv4.ip_forward=1

Les requêtes du réseau wifi sont forwardées vers l’extérieur via une règle « iptables » :

mafalda ~ # iptables -A FORWARD -i wlan0 -s 192.168.1.0/255.255.255.0 -o eth0 -j ACCEPT

Enfin pour que les requêtes du nouveau réseau ne sorte pas avec des IPs privées, elles sont masqueradées :

mafalda ~ # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Les appareils connectés au wifi accèdent alors à l’extérieur.

Conclusion

La démarche peut être adaptée au partage d’une connexion wifi par une connexion filaire, au partage d’une connexion filaire par une autre (avec deux cartes réseau), etc…

Références

man dnsmasq : http://linux.die.net/man/8/dnsmasq
man iptables : http://linux.die.net/man/8/iptables
man iwconfig : http://linux.die.net/man/8/iwconfig
man ifconfig : http://linux.die.net/man/8/ifconfig

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *