Utilisation du Wifi sans Network Manager

Il est peu courant, voire même impensable, le fait de s’en passer d’un outil comme Network Manager sur des ordinateurs portables. J’avoue que ce n’est pas très pratique, surtout lorsqu’on se déplace régulièrement. L’utilité de vouloir s’en passer de cet outil, ou de tout autre outil graphic avec les mêmes fonctionnalitées, se limite donc aux ordinateurs du bureau. Au niveau sécurité, je ne vois pas l’intérêt d’utiliser le wifi sur un serveur, surtout si ce dernier est en production. Par contre, sur un serveur utilisé en lab, je peux encore comprendre.

Avant d’aller plus loin, j’espère que vous avez installé les pilotes pour votre carte wifi. Si vous ne savez pas quel est le modèle de votre carte, vous « lspci » est la commande à connaitre.

$ lspci | grep Network
03:00.0 Network controller [0280]: Broadcom Corporation BCM43224 802.11a/b/g/n [14e4:4353] (rev 01)

La commande « /sbin/iw dev » (ou « sudo iw dev »), vous donnera l’information sur le nom de l’interface wifi à configurer sur votre ordinateur.

$ sudo iw dev
phy#0
Interface wlan0
ifindex 3
wdev 0x1
addr c8:xx:xx:xx:xx:95
type managed

1. Installation du packet wpasupplicant

$ aptitude search wpasupplicant
i wpasupplicant – client support for WPA and WPA2 (IEEE 802.11i)
p wpasupplicant:i386 – client support for WPA and WPA2 (IEEE 802.11i)

Le « i » devant « wpasupplicant », indique que le packet est déjà installé. Si ce n’est pas le cas, vous pouvez toujours l’installer avec la commande

$ apt-get install wpasupplicant

Ce paquet contient ce qu’il faut pour démarrer ou arrêter une interface (ifup <interface_wifi>, ifdown <interface_wifi> ou encore ifquery <interface_wifi>). Un peu plus loin dans ce chapitre, je vais aussi vous montrer comment générer une clef en hexadécimal en utilisant cet outil, pour ne pas enregistrer le mot de passe du wifi en clair dans votre fichier de configuration.

Bref, pour faire très simple sans rentrer dans les détails, cet outil va permettre à un utilisateur de se connecter sur un réseau sans fil, à partir de moment où on arrive à s’authentifier.

2. Vérification de l’état de la carte wifi

$ ip addr show wlan0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN group default qlen 1000
link/ether c8:xx:xx:xx:xx:95 brd ff:ff:ff:ff:ff:ff

La commande « ip addr » peut se simplifier par « ip a », qui nous donnera exactement le même résultat.

$ ip link show wlan0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether c8:xx:xx:xx:xx:95 brd ff:ff:ff:ff:ff:ff

Les commandes « ip addr » et « ip link » peuvent s’utiliser avec des options comme « show <nom de l’interface> », pour afficher juste ce qu’il nous faut comme information. Ce sont des commandes iproute2, auquelles il faut commencer à s’habituer.

Une autre commande, qui nous servira plus tard pour vérifier si on est bien connecté au wifi.

# iwconfig wlan0
wlan0 IEEE 802.11abgn ESSID:off/any
Mode:Managed Access Point: Not-Associated Tx-Power=19 dBm
Retry short limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:off

3. Configuration manuelle de l’accès au wifi

Dans un premier temps, il faut arrêter Network Manager.

# /etc/init.d/network-manager stop

Sinon, vous pouvez aussi le supprimer définitivement.

Créer ensuite un fichier pour la configuration de l’interface wifi. Personnellement, je préfere un fichier séparé de celui du /etc/network/interfaces.

# touch /etc/network/interfaces/wlan0
# chmod 600 /etc/network/interfaces.d/wlan0

L’intérêt de la modification des droits d’accès à ce fichier, est de ne pas afficher votre clé wifi aux utilisateurs autre que Root.

Maintenant, on peut commencer le scan puis d’ajouter les informations nécessaires pour se connecter au réseau.

# iwlist scan
eth0 Interface doesn’t support scanning.
wlan0 Interface doesn’t support scanning : Network is down
lo Interface doesn’t support scanning.

La tentative de scan ne peut qu’échouer, puisque l’interface wlan0 n’est pas activée. Pour l’activer,

# ip link set wlan0 up

Si, avec cette commande, vous n’arrivez toujours pas à scanner votre réseau, passer à la commande suivante.

# ifup wlan0

On peut refaire un test de scan du réseau.

# iwlist scan
eth0 Interface doesn’t support scanning.
wlan0 Scan completed :
Cell 01 – Address: E8:XX:XX:XX:XX:AE
Channel:1
Frequency:2.412 GHz (Channel 1)
Quality=42/70 Signal level=-68 dBm
Encryption key:on
ESSID: »Mon_reseau_wifi« 
Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s
Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s
36 Mb/s; 48 Mb/s; 54 Mb/s
Mode:Master
!————————!
Cell 02 – Address: EA:40:F2:A0:70:A0
Channel:1
Frequency:2.412 GHz (Channel 1)
!————————!

Une fois que vous avez repérer votre réseau wifi, générer un clé hexadécimale à partir du mot de passe pour y accéder. Il n’est pas nécessaire de copier la sortie de la commande « wpa_passphrase » dans un quelconque fichier, sauf pour la valeur du PSK. Généralement, sur certains blogs, on vous propose de copier justement ces informations dans le fichier /etc/wpa_supplicant.conf, mais cela affichera le mot de passe de votre wifi en clair.

$ wpa_passphrase Mon_reseau_wifi Mon_mot_de_passe_wifi
network={
ssid= »Mon_reseau_wifi« 
#psk= »Mon_mot_de_passe_wifi« 
psk=567xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx920
}

4. Configurer le fichier wlan0

Vous pouvez utiliser n’importe quel outil pour configurer ce fichier, mais je préfère utiliser VIM. Ci-dessous un outil que j’ai essayé par curiosité, mais qui ne fait rien de plus que de vous laisser le choix de l’éditeur de fichier. Par défaut, on vous propose nano.

# sensible-editor /etc/network/interfaces.d/wlan0
Select an editor. To change later, run ‘select-editor’.
1. /bin/nano <—- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
Choose 1-3 [1]: 2

# The wireless network interface with dhcp
auto wlan0
iface wlan0 inet dhcp
wpa-ssid Mon_reseau_wifi
wpa-psk 567xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx920

Copier les informations à partir de « auto wlan0 » comme ci-dessus, dans votre fichier wlan0, et avec les bonnes informations.

5. Tester la connection à internet

# ping google.com
ping: unknown host google.com

$ ip link show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether c8:xx:xx:xx:xx:95 brd ff:ff:ff:ff:ff:ff

# ifdown wlan0
Killed old client process
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/c8:xx:xx:xx:xx:95
Sending on LPF/wlan0/c8:xx:xx:xx:xx:95
Sending on Socket/fallback
DHCPRELEASE on wlan0 to 192.168.1.1 port 67

# ifup wlan0
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/c8:xx:xx:xx:xx:95
Sending on LPF/wlan0/c8:xx:xx:xx:xx:95
Sending on Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 7
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 12
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 11
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.1.1
DHCPACK from 192.168.1.1
bound to 192.168.1.10 — renewal in 1679 seconds.

# iw wlan0 link
Connected to e8:xx:xx:xx:xx:ae (on wlan0)
SSID: Mon_reseau_wifi
freq: 2412
RX: 811158 bytes (5944 packets)
TX: 135869 bytes (1041 packets)
signal: -65 dBm
tx bitrate: 78.0 MBit/s MCS 12

bss flags: short-preamble short-slot-time
dtim period: 0
beacon int: 100

# ping google.com
PING google.com (74.125.24.102) 56(84) bytes of data.
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=1 ttl=51 time=14.4 ms
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=2 ttl=51 time=13.3 ms
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=3 ttl=51 time=16.3 ms
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=4 ttl=51 time=14.4 ms
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=5 ttl=51 time=13.5 ms
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=6 ttl=51 time=15.3 ms
64 bytes from de-in-f102.1e100.net (74.125.24.102): icmp_seq=7 ttl=51 time=13.9 ms
^C
— google.com ping statistics —
7 packets transmitted, 7 received, 0% packet loss, time 6008ms
rtt min/avg/max/mdev = 13.368/14.500/16.382/1.000 ms

$ ip a show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether c8:xx:xx:xx:xx:95 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global wlan0
valid_lft forever preferred_lft forever
inet6 fe80::cabc:c8ff:fecc:4e95/64 scope link
valid_lft forever preferred_lft forever

Noter que je n’ai pas utiliser /etc/init.d/networking {stop/start/restart}; puisque cette commande redémarre toutes les interfaces sans exeption. Or, ce qui m’intéresse, c’est de ne redémarrer qu’une interface spécifique. De ce fait, le meilleur choix est d’utiliser « {ifdown|ifup} <interface> ».

6. Troubleshoot

Il n’y en a pas beaucoup de commandes à connaître. Ci-dessous un bref résumé des commandes que j’ai le plus utilisées.

ip link
ip link show wlan0

sudo ifconfig -a

iwlist scan

ifdown wlan0
ifup wlan0

iw wlan0 link

dhclient -v -r wlan0
dhclient -v wlan0

7. Les logs

Si jamais vous avez des problèmes de réseau, le mieux c’est de voir ce qui se passe dans les logs. Voir les quelaues exemples ci-dessous:

# ifup wlan0
Internet Systems Consortium DHCP Client 4.3.1
Copyright 2004-2014 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/wlan0/c8:xx:xx:xx:xx:95
Sending on LPF/wlan0/c8:xx:xx:xx:xx:95
Sending on Socket/fallback
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 7
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 12
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 11
DHCPREQUEST on wlan0 to 255.255.255.255 port 67
DHCPOFFER from 192.168.1.1
DHCPACK from 192.168.1.1
bound to 192.168.1.10 — renewal in 1679 seconds.

# cat /var/log/syslog | grep wlan0
Jul 18 08:06:43 nunux kernel: [ 373.279111] IPv6: ADDRCONF(NETDEV_UP): wlan: link is not ready
Jul 18 08:06:44 nunux dhclient: Listening on LPF/wlan0/c8:xx:xx:xx:xx:95
Jul 18 08:06:44 nunux dhclient: Sending on LPF/wlan0/c8:xx:xx:xx:xx:95
Jul 18 08:06:44 nunux dhclient: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8
Jul 18 08:06:53 nunux dhclient: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 12
Jul 18 08:06:53 nunux wpa_supplicant[3476]: wlan0: CTRL-EVENT-REGDOM-CHANGE init=BEACON_HINT type=UNKNOWN
Jul 18 08:06:55 nunux wpa_supplicant[3476]: wlan0: SME: Trying to authenticate with E8:XX:XX:XX:XX:AE (SSID=’Mon_reseau_wifi‘ freq=2412 MHz)
Jul 18 08:06:55 nunux kernel: [ 385.221724] wlan0: authenticate with E8:XX:XX:XX:XX:AE
Jul 18 08:06:55 nunux kernel: [ 385.231415] wlan0: direct probe to E8:XX:XX:XX:XX:AE (try 1/3)
Jul 18 08:06:55 nunux kernel: [ 385.433241] wlan0: send auth to E8:XX:XX:XX:XX:AE (try 2/3)
Jul 18 08:06:56 nunux wpa_supplicant[3476]: wlan0: Trying to associate with E8:XX:XX:XX:XX:AE (SSID=’Mon_reseau_wifi‘ freq=2412 MHz)
Jul 18 08:06:56 nunux kernel: [ 385.817935] wlan0: authenticated
Jul 18 08:06:56 nunux kernel: [ 385.821490] wlan0: associate with E8:XX:XX:XX:XX:AE (try 1/3)
Jul 18 08:06:56 nunux wpa_supplicant[3476]: wlan0: Associated with E8:XX:XX:XX:XX:AE
Jul 18 08:06:56 nunux kernel: [ 386.376264] wlan0: RX AssocResp from E8:XX:XX:XX:XX:AE (capab=0x411 status=0 aid=1)
Jul 18 08:06:56 nunux kernel: [ 386.376716] wlan0: associated
Jul 18 08:06:56 nunux kernel: [ 386.376751] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Jul 18 08:06:57 nunux wpa_supplicant[3476]: wlan0: WPA: Key negotiation completed with E8:XX:XX:XX:XX:AE [PTK=CCMP GTK=CCMP]
Jul 18 08:06:57 nunux wpa_supplicant[3476]: wlan0: CTRL-EVENT-CONNECTED – Connection to E8:XX:XX:XX:XX:AE completed [id=0 id_str=]
Jul 18 08:06:58 nunux avahi-daemon[2501]: Joining mDNS multicast group on interface wlan0.IPv6 with address fe80::cabc:c8ff:fecc:4e95.
Jul 18 08:06:58 nunux avahi-daemon[2501]: New relevant interface wlan0.IPv6 for mDNS.
Jul 18 08:06:58 nunux avahi-daemon[2501]: Registering new address record for fe80::cabc:c8ff:fecc:4e95 on wlan0.*.
Jul 18 08:07:05 nunux dhclient: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 21
Jul 18 08:07:08 nunux dhclient: DHCPREQUEST on wlan0 to 255.255.255.255 port 67
Jul 18 08:07:12 nunux dhclient: DHCPREQUEST on wlan0 to 255.255.255.255 port 67
Jul 18 08:07:12 nunux avahi-daemon[2501]: Joining mDNS multicast group on interface wlan0.IPv4 with address 192.168.1.10.
Jul 18 08:07:12 nunux avahi-daemon[2501]: New relevant interface wlan0.IPv4 for mDNS.
Jul 18 08:07:12 nunux avahi-daemon[2501]: Registering new address record for 192.168.1.10 on wlan0.IPv4.
Jul 18 08:08:17 nunux wpa_supplicant[3476]: wlan0: WPA: Group rekeying completed
!——————————!
Jul 18 08:33:59 nunux dhclient: DHCPREQUEST on wlan0 to 192.168.1.1 port 67
Jul 18 08:34:17 nunux wpa_supplicant[3476]: wlan0: WPA: Group rekeying completed with E8:XX:XX:XX:XX:AE [GTK=CCMP]

# dmesg
007

Sources:

How to use a WiFi interface (Debian)
How To Connect To A WPA Wifi Using Command Lines On Debian
Debian Linux Configure Wireless Networking With WPA2
Connect to WiFi network from command line in Linux
How to connect to a WPA/WPA2 WiFi network using Linux command line
WiFi HowTo(Ubuntu)
Network configuration (Debian)
Linux Force DHCP Client (dhclient) to Renew IP Address