Tips en Trucs 2014

Verbinden met WiFi met terminal opdrachten

Introductie

Hoewel ik indien mogelijk de voorkeur geef aan vaste netwerkverbindingen, kan je soms niet anders dan draadloze netwerkverbindingen gebruiken. Meer en meer komen er apparaten op de markt die enkel nog via een WiFi verbinding op een netwerk aangesloten kunnen worden. Als je zo'n apparaat dan ook nog zonder grafische omgeving installeert, moet je de WiFi connectie via opdrachten of een script tot stand brengen. In de praktijk kan dit gaan om een via WiFi bereikbare NAS, multimedia of webserver en dergelijke meer.

Benodigdheden

De meeste distributies bevatten bij een standaard terminal installatie de pakketten met de onderdelen om een WiFi verbinding op te bouwen (wpa_supplicant, iw, ip en ping). iw is de basis opdracht om WiFi netwerk taken zoals het vinden van WiFi netwerkkaarten en het scannen van Access Points uit te voeren. wpa_supplicant zorgt voor een verbinding met een WPA/WPA2 beveiligd netwerk. ip wordt gebruikt voor het activeren/uitschakelen van netwerkapparaten en het uitvoeren van standaard netwerk opdrachten.

De voorbereidingen

De WiFi verbinding opsporen

dany@linux-att3:~> sudo /usr/sbin/iw dev
phy#0
        Interface wlp4s0
                ifindex 3
                wdev 0x1
                addr f4:b7:e2:bf:ff:91
                type managed

De uitvoer toont ons dat de computer één fysieke WiFi kaart bevat. Deze wordt aangeduid met de naam wlp4s0. Het type bepaalt de mode van de WiFi kaart en managed betekent dat de WiFi kaart nu als client werkt die een verbinding kan maken met een Access Point.

De WiFi kaart activeren

dany@linux-att3:~> ip link show wlp4s0
3: wlp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether f4:b7:e2:bf:ff:91 brd ff:ff:ff:ff:ff:ff

Kijk uit naar het woord UP tussen de haken in de eerste regel van de uitvoer. In het voorbeeld is de WiFi kaart niet actief. Activeer de WiFi kaart met de volgende opdracht:

dany@linux-att3:~> sudo ip link set wlp4s0 up
root's password:
RTNETLINK answers: Operation not possible due to RF-kill

In het voorbeeld is dit niet mogelijk doordat de WiFi kaart is uitgeschakeld. Dit kan zowel hardwarematig (met behulp van een schakelaar op de computer of softwarematig (via een instelling of opdracht). Softwarematig kan je de WiFi kaart inschakelen met:

dany@linux-att3:~> sudo /usr/sbin/rfkill unblock 0

Indien je op een systeem werkt met een grafische Desktop (bijv. KDE);, dan schakel je best NetworkManager uit. NetworkManager laat toe dat gebruikers zelf netwerkverbindingen kunnen beheren. NetworkManager komt dan namelijk niet in conflict met de in de terminal uitgevoerde opdrachten om het netwerk te beheren.

sudo systemctl stop NetworkManager.service

Na het nogmaals activeren van de WiFi kaart is deze nu wel actief.

dany@linux-att3:~> sudo ip link set wlp4s0 up
dany@linux-att3:~> ip link show wlp4s0
3: wlp4s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether f4:b7:e2:bf:ff:91 brd ff:ff:ff:ff:ff:ff

De WiFi verbinding controleren

dany@linux-att3:~> /usr/sbin/iw wlp4s0 link
Not connected.

De uitvoer toont ons dat we niet met een netwerk verbonden zijn.

WiFi netwerken scannen

dany@linux-att3:~> sudo /usr/sbin/iw wlp4s0 scan
root's password:
BSS ac:81:12:54:67:21 (on wlp4s0)
        TSF: 17798399 usec (0d, 00:00:17)
        freq: 2437
        beacon interval: 100
        capability: ESS Privacy ShortSlotTime (0x0411)
        signal: -19.00 dBm
        last seen: 672 ms ago
        Information elements from Probe Response frame:
        SSID: SoftAP
        Supported rates: 1.0* 2.0* 5.5* 11.0* 6.0 9.0 12.0 18.0 
        DS Parameter set: channel 6                                             
        ERP: Barker_Preamble_Mode                                               
        Extended supported rates: 24.0 36.0 48.0 54.0                           
        RSN:     * Version: 1                                                   
                 * Group cipher: CCMP                                           
                 * Pairwise ciphers: CCMP
                 * Authentication suites: PSK
                 * Capabilities: 16-PTKSA-RC (0x000c)
        HT capabilities:
                Capabilities: 0x6e
                        HT20/HT40
                        SM Power Save disabled
                        RX HT20 SGI
                        RX HT40 SGI
                        No RX STBC
                        Max AMSDU length: 3839 bytes
                        No DSSS/CCK HT40
                Maximum RX AMPDU length 65535 bytes (exponent: 0x003)
                Minimum RX AMPDU time spacing: 2 usec (0x04)
                HT RX MCS rate indexes supported: 0-15, 32
                TX unequal modulation not supported
                HT TX Max spatial streams: 2
                HT TX MCS rate indexes supported may differ
        HT operation:
                 * primary channel: 6
                 * secondary channel offset: below
                 * STA channel width: any
                 * RIFS: 0
                 * HT protection: no
                 * non-GF present: 0
                 * OBSS non-GF present: 0
                 * dual beacon: 0
                 * dual CTS protection: 0
                 * STBC beacon: 0
                 * L-SIG TXOP Prot: 0
                 * PCO active: 0
                 * PCO phase: 0
        Extended capabilities: 1
        WMM:     * Parameter version 1
                 * BE: CW 15-1023, AIFSN 3
                 * BK: CW 15-1023, AIFSN 7
                 * VI: CW 7-15, AIFSN 2, TXOP 2976 usec
                 * VO: CW 3-7, AIFSN 2, TXOP 1472 usec

Van de weergegeven informatie interesseert ons vooral de SSID en het beveiligings protocol (WPA/WPA2 versus WEP). De SSID in het voorbeeld is SoftAP. Het gebruikte beveiligings protocol RSN, beter bekend onder de naam WPA2.

Verbinding maken met een WPA/WPA2 WiFi netwerk

Eerst moeten we de toegangssleutel tot het WiFi netwerk SoftAP aan het configuratiebestand /etc/wpa_supplicant/wpa_supplicant.conf toevoegen.

dany@linux-att3:~> su
Wachtwoord:
linux-att3:/home/dany # wpa_passphrase SoftAP >> /etc/wpa_supplicant/wpa_supplicant.conf
...typ hier uw wachtwoord gevolgd door Return...
linux-att3:/home/dany # exit

De opdracht wpa_passphrase heeft enkel de SSID (SoftAP) van het WiFi netwerk waarmee je wilt verbinden nodig. Typ na het uitvoeren van deze opdracht het wachtwoord in, gevolgd door Return. De geproduceerde uitvoer wordt toegevoegd aan het configuratiebestand van wpa_supplicant en ziet er dan zo uit:

dany@linux-att3:~> sudo more /etc/wpa_supplicant/wpa_supplicant.conf
root's password:
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel

# reading passphrase from stdin
network={
        ssid="SoftAP"
        #psk="wachtwoord"
        psk=2f60d34be6c69ebed31118ace3efd0bffad19ccd2725a1a72bbec3236b746b8a
}

Met een tweede opdracht maken we een verbinding met het SoftAP WiFi netwerk.

dany@linux-att3:~> sudo /usr/sbin/wpa_supplicant -B -D nl80211 -i wlp4s0 -c /etc/wpa_supplicant/wpa_supplicant.conf
Successfully initialized wpa_supplicant

Gebruik de iw opdracht om te verifiëren of je wel degelijk met het WiFi netwerk bent verbonden.

dany@linux-883d:~> sudo /usr/sbin/iw wlp4s0 link
root's password:
Connected to ac:81:12:54:67:21 (on wlp4s0)
        SSID: SoftAP
        freq: 2437
        RX: 32999 bytes (299 packets)
        TX: 28461 bytes (165 packets)
        signal: -30 dBm
        tx bitrate: 162.0 MBit/s MCS 12 40Mhz

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

Een IP adres bekomen

dany@linux-883d:~> sudo /usr/sbin/dhcpcd --timeout 40 wlp4s0
dany@linux-883d:~> ip addr show wlp4s0
2: wlp4s0:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether ac:7b:a1:42:e0:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.5/24 brd 192.168.1.255 scope global wlp4s0
       valid_lft forever preferred_lft forever
    inet6 fe80::ae7b:a1ff:fe42:e05f/64 scope link 
       valid_lft forever preferred_lft forever

De eerste opdracht vraagt aan de DHCP server een IP adres aan. De --timeout optie zorgt voor ervoor dat de DHCP server wat meer (dubbel zoveel) tijd krijgt om te antwoorden. Dit was in mijn geval nodig om een geldig IP adres te krijgen.

De tweede opdracht geeft het gekregen IP adres weer (een controle).

Opmerkingen

Netwerkverbindingen reageren niet altijd zoals je zou willen en WiFi verbindingen zijn door hun aard daarenboven storingsgevoelig. Dit heeft tot gevolg dat indien één stap in bovenstaande procedure mislukt, de volledige procedure teruggedraaid moet worden en daarna pas terug kan herhaald worden. Daarenboven is elk netwerk verschillend, en moet je soms enkele opties aanpassen (raadpleeg de man pagina's). Wees dus volhardend en bereik uiteindelijk uw doel.

Alles in een handig script

Na grondig testen van de opdrachten kan je ze in een script opnemen om het verbinden en verbreken van de WiFi verbinding te automatiseren. Het onderstaande script werkt alleen als je het als root (systeembeheerder) uitvoert en het sleutel van het WiFi netwerk in het configuratiebestand van wpa_supplicant is opgenomen.

#!/bin/bash
ping -c 1 `ip -f inet -oneline a show wlp4s0 | cut -d " " -f7 | cut -d / -f1`
if [ $? -ne "2" ]; then
	dhcpcd -k wlp4s0
	wpa_cli terminate
	ip link set wlp4s0 down
	$(dialog --backtitle "$snt" \
		--title "$titel" \
		--msgbox "De verbinding met SoftAP is afgesloten." 6 55 2>&1 1>$(tty));
else
		ip link set wlp4s0 up
		wpa_supplicant -B -D nl80211 -i wlp4s0 -c /etc/wpa_supplicant/wpa_supplicant.conf
		dhcpcd --timeout 40 wlp4s0
		$(dialog --backtitle "$snt" \
			--title "$titel" \
			--msgbox "Het IP-adres van deze computer is `ip -f inet -oneline a show wlp4s0 | cut -d " " -f7`" 6 55 2>&1 1>$(tty));
fi