Linux Wireless Networks
WLAN/WiFi and Bluetooth
WiFi
IEEE 802.11 wireless computer networking standards …protocols for implementing WLAN (Wireless Local Area Network) …basis for the Wi-Fi (Wireless Fidelity) brand …standard is updated by means of amendments …denoted by 802.11 followed by a non-capitalized letter for example IEEE 802.11a.
# find wireless devices
lspci | egrep -i --color 'wifi|wlan|wireless'
# find the card(s) driver(s)
lspci | egrep -i --color 'wifi|wlan|wireless' \
| cut -d' ' -f1 \
| xargs lspci -k -sPhysical Layer
Widely used in the 2.4Ghz and 5Ghz radio frequencies …industrial Scientific Medical (ISM) band (license free) …each spectrum is sub-divided into channels with a center frequency and bandwidth …these wavelengths work best for line-of-sight. Spread spectrum technology …DSSS (Direct Sequency Spread Spectrum) …OFDM (Orthogonal Frequecy-Division Multiplexing). IEEE 802.11 Standards and Frequency Band…
| Standard | Frequencies |
|---|---|
| 802.11a | 5GHz |
| 802.11b | 2.4GHz |
| 802.11g | 2.4GHz |
| 802.11n | 2.4 & 5 GHz |
| 802.11ac | below 6GHz |
802.11b/g/n networks operate in the 2.4 GHz band:
- ISM band: 2.400–2.500 GHz
- 14 channels, bandwidth approximately 20 to 22 MHz
- Crowded frequency: Bluetooth, microwaves, telephones, garage door openers…
- not all channels usable for WiFi in all countries..
- channel overlapping between two adjacent WiFi AP devices cause frequency interference
- maximum three non-overlapping channel can be found in 2.4 GHz band
802.11a/n/ac networks operate in the 5 GHz band
- ISM band: 4.915–5.825 GHz spectrum
- Channel width: 802.11n 40MHz, 802.11ac 80MHz
- less crowded, 23 non-overlapping channels (not in all countries)
Operators mode, wireless devices called stations (STAs)
- Wirelessly connected STAs (at least two) form a basic service set (BSS)
- Controlled by a single coordination function (CF)
Ad-hoc mode without an AP
- Direct communication between two stations (peer-to-peer model)
- Isolated, no connection to other WiFi networks
- …infrastructure mode using a wireless Access Point (AP)
- STA with additional coordination functions
- wireless devices must associate to an AP for network access
rfkill
rfkill subsystem registers devices capable of transmitting RF (WiFi, Bluetooth, GPS, FM, NFC) … hard blocked reflects some physical disablement …soft blocked is a software mechanism to enable or disable transmission
rfkill list # current state
rfkill block all # turn off all RF
rfkill unblock all # turn on all RFHard block can not be unblocked by software …check the BIOS for WiFi related settings …use the physical switch or a keyboard shortcut (typically using the Fn key) …multiple keys can exist i.e. one for WiFi and another one for Bluetooth. Kernel module configuration (check with modinfo -p rfkill)
cat >> /etc/modprobe.d/modprobe.conf <<EOF
options rfkill master_switch_mode=2
options rfkill default_state=1
EOFiw & iwlist
iw (replaced iwconfig) (no support for WPA/WPA2)
iw list # show wireless device capabilities
iw dev $dev scan | grep -i ssid # scan for wireless APs
iw dev $dev link # link connection status
iw reg get # show regulatory domain
iw list | grep -A 15 Frequencies: # query the number of available channels and their allowed transmit poweriwlist, scans for available wireless networks, and display their configuration
# make sure the Wifi interface is up
dev=wlan0
ip link set $dev up
# scanning for nearby wireless access points
iwlist scan | egrep -i SSID\|Address\|Channel\|Quality\|Authwpa_cli
Connect to an encrypted (WEP, WPA, WPA2) wireless network with wpa_supplicant:
wpa_cli # used to configure wpa_supplicant
wpa_cli interface ${dev:-wlan0} # select wireless interface
wpa_cli scan # scan for access points
wpa_cli scan_results # list available access points
# default configuration file
/etc/wpa_supplicant/wpa_supplicant.conf
# example config file
/usr/share/doc/wpa_supplicant/wpa_supplicant.conf
# configure the authentication with an AP
wpa_passphrase "$ssid" | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf >/dev/null
# enter the password on the promptConfigure the country code
>>> grep country /etc/wpa_supplicant/wpa_supplicant.conf
country=DE
# reconfigure after a configuration change:
>>> sudo wpa_cli -i ${dev:-wlan0} reconfigureStart the WiFi access client in background and get an IP address from DHCP
# start in background
>>> wpa_supplicant -B -c $file -i $dev
>>> ip link show $dev
# ... and state should go ↓↓...
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode ....
link/ether 10:bf:48:4c:33:f8 brd ff:ff:ff:ff:ff:ff
# query DHCP for an IP-address
>>> dhcpcd $dev
>>> ip link show $dev
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 10:bf:48:4c:33:f8 brd ff:ff:ff:ff:ff:ff
# ↓↓↓↓↓↓↓↓↓↓↓ ... IP address should be visible
inet 192.168.1.7/24 brd 192.168.1.255 scope global noprefixroute wlp3s0
valid_lft forever preferred_lft foreveriwd & iwctl
iwd (iNet wireless daemon) aims to replace WPA supplicant
- no external dependencies, base on kernel features (D-Bus, cryptographic interface)
- designed to deal with multiple clients from the outset
- can be combined with
systemd-networkd
Build depending on the Linux distribution, update iwd to a recent version [^1]
tmp=$(mktemp -d) && cd $tmp
# dependencies on Debian
sudo apt install -y libtool libreadline-dev libdbus-glib-1-dev
# download the required source code
git clone https://kernel.googlesource.com/pub/scm/libs/ell/ell.git
# It is not required to build or install Embedded Linux library
git clone git://git.kernel.org/pub/scm/network/wireless/iwd.git && cd iwd
# configure, build, and install
./bootstrap
./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc
make
sudo make install
rm -rf $tmp
# load the systemd configuration
sudo systemctl daemon-reload
# print version information
/usr/libexec/iwd --versionMake sure to configure following prerequisites …bring up the interfaces with systemd-networkd …configure DNS resolution with systemd-resolved …minimal configuration to assign IP address(es) and set up routes using a built-in DHCP client:
cat > /etc/iwd/main.conf <<EOF
[General]
EnableNetworkConfiguration=true
EOF
# Enable the service to manage Wifi connections automatically
sudo systemctl enable --now iwd In case you want to debug connection problems, start in foreground
# locate the service executable
systemctl cat iwd.service | grep ExecStart
ExecStart=/usr/libexec/iwd
# run in foreground with debug mode
sudo IWD_TLS_DEBUG=1 /usr/libexec/iwd -dUse the command-line interface iwctl to select a WiFi connection:
iwctl device list # list wireless devices
iwctl device <dev> show # show device details
iwctl station list # list state
iwctl station <dev> scan # scan for networks
iwctl station <dev> get-networks # list networks
iwctl station <dev> connect <ssid> # connect to network
# access point connection configuration is store
/var/lib/iwd/*.{open,psk,8021x} # network configuration filesConfigure the DNS resolution
[Network]
NameResolvingService=resolvconf
# systemd is used by defaultthe PreSharedKey can be calculated with wpa_passphrase …included with wpa_supplicant …from the SSID and the WIFI passphrase
>>> wpa_passphrase <ssid>
# reading passphrase from stdin
************
network={
ssid="<ssid>"
#psk="***********"
psk=9d1c20628cabdb224a1a420723478f585f4579efd4b206301b8c0d6e5ddc8296
}cat > /var/lib/iwd/<ssid>.psk <<EOF
[Security]
PreSharedKey=9d1c20628cabdb224a1a420723478f585f4579efd4b206301b8c0d6e5ddc8296
EOF(Not working!) connect to eduroam
ca=https://www.pki.dfn.de/fileadmin/PKI/zertifikate/T-TeleSec_GlobalRoot_Class_2.crt
sudo wget -q $ca -O /var/lib/iwd/eduroam.cer
openssl x509 -inform DER \
-in /var/lib/iwd/eduroam.cer \
-out /var/lib/iwd/eduroam.crt
# create a configuration to access Eduroam
domain=devops.test
user=devops
password=12345678
cat << EOF | sudo tee /var/lib/iwd/eduroam.8021x
[Settings]
AutoConnect=true
[Security]
EAP-Method=PEAP
EAP-Identity=anonymous@${domain}
EAP-PEAP-CACert=/var/lib/iwd/eduroam.crt
EAP-PEAP-ServerDomainMask=radius.${domain}
EAP-PEAP-Phase2-Method=MSCHAPV2
EAP-PEAP-Phase2-Identity=${user}@${domain}
EAP-PEAP-Phase2-Password=${password}
EOFSignal Strength
Measured in dBm (decibel milliwatts) …absolute number representing power level in mW …expressed in negative values …logarithmic scale, the closer to 0 dBm, the better the signal is.
| dBm | Quality |
|---|---|
| -30 | Maximum, close to access point |
| -50 | Excellent |
| -60 | Good |
| -67 | Reliable (enough for VoIP, non HD video) |
| -70 | Week (enough for HTTP, mail) |
| -80 | Unreliable |
| -90 | Unusable |
wavemon, TUI to monitor signal strength …RSSI (Received Signal Strength Indicator), relative quality of a received signal to a client. Main factors that can weaken your Wi-Fi quality …physical obstruction, competing WiFi networks and/or interfering electronics.
# monitor link quality
watch -n 1 cat /proc/net/wirelessSecurity
Cf. Wireless Security Measures
| Component | Description |
|---|---|
| WEP | Original encryption protocol superseded by WPA |
| WPA | (Wi-Fi Protected Access) …introduced as an interim security enhancement over WEP …designed to be deployed on existing devices as firmware upgrade …“WPA Personal” use a PSK (preshared key) for authentication …“WPA Enterprise” uses an authentication server to generate keys/certificates …uses TKIP for encryption |
| WPA2 | Based on final 802.11i amendment (2004) …uses a 256bit AES key for encryption …supports PSK, and EAP authentication methods using RADIUS servers |
| EAP | (Extensible Authentication Protocol) …further improves WPA over the IEEE 802.1X standard …authentication framework based on RFC standards …WPA[2,3] uses EAP as authentication mechanism …types: EAP-TLS, EAP-TTLS (supports other auth. protocols in a TLS tunnel) |
| PEAP | (encapsulates EAP in a TLS tunnel) …PKI base server certificate ..EAP-MSCHAPv2 (authenticate to a Microsoft MS_CHAPv2 database) |
connman
/etc/connman/main.conf # configuration file
systemctl ... connman # service managment
/var/lib/connman/ # profile settings
connmanctl enable wifi # power Wi-Fi on
disable wifi
scan wifi # scan for WLAN networksEstablish your first connection with an interactive session:
connmanctl
connmanctl> agent on
# scan for access points (AP)
connmanctl> scan wifi
# show available APs
connmanctl> services
*A ..--WAVENET--.. wifi_185e0f65e843_2e2e2d2d574156454e45542d2d2e2e_managed_psk
# leading asterisk indicates a previously used AP
# connect to an AP
connmanctl> connect wifi_185e0f65e843_2e2e2d2d574156454e45542d2d2e2e_managed_psk
# disconnect
connmanctl> quitAfter authorisation with the AP has been established:
connmanctl services
connmanctl connect ...hostapd
hostapd daemon to act as WiFi access point …hardware needs to support the access point operation
>>> iw list
...
Supported interface modes:
* IBSS
* managed
* AP
...Configuration in /etc/hostapd/hostapd.conf
apt install -y hostapd
cat > /etc/hostapd/hostapd.conf <<EOF
interface=wlan0
driver=nl80211
ssid=..--2--..
country_code=DE
ieee80211d=1
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=test1234
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_group_rekey=86400
EOF# run in foreground
hostapd /etc/hostapd/hostapd.conf
# start the service
systemctl unmask hostapd
systemctl enable --now hostapdStatic IP address assigned to the wireless port
cat <<EOF | tee -a /etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant
EOF
systemctl restart dhcpcdDHCP Server with dnsmasq
# install a DHCP server
apt install -y dnsmasq
# enable DHCP on the WiFi interface
cat > /etc/dnsmasq.conf <<EOF
interface=wlan0
dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
EOF
# restart the DHCP server
systemctl restart dnsmasqRouting and Masquerade
cat > /etc/sysctl.d/05-ip-forward.conf <<EOF
net.ipv4.ip_forward=1
EOF
sysctl --system
# masquerade for outbound traffic on eth
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save > /etc/iptables.ipv4.natEdit /etc/rc.local and add this just above exit 0
iptables-restore < /etc/iptables.ipv4.natBluetooth
[^bluez] BlueZ Bluetooth protocol stack for Linux
http://www.bluez.org
/etc/bluetooth/{input,main,network}.conf # bluethoothd configuration
systemctl enable --now bluetooth # start bluethoothd
journalctl -u bluetooth # bluethoothd logs
bluetoothctl # command line interface
sudo dmesg | grep Bluetooth # check kernel messagesTurn the physical Bluetooth device on/off with rfkill:
rfkill unblock bluetooth
rfkill block bluetoothA2DP
bluetoothd emits an error like to following if support for audio streaming is not installed:
a2dp-sink profile connect failed for ... Protocol not availableA2DP is the “Advanced Audio Distribution Profile” which describes how Bluetooth devices can stream stereo-quality audio to remote devices.
Install the additional pulseaudio-bluetooth package:
sudo apt install -y pulseaudio pulseaudio-module-bluetooth bluez-firmware
sudo systemctl restart bluetooth
pulseaudio --kill && pulseaudio --startUsage
Pairing is the process of making two devices know about each other
- Exchange link-keys to secure the communication
- Can be initiated from both endpoints
- Includes an authentication that requires confirmation by the user
Outbound pairing & connection:
bluetoothctl scan on # wait until devices are discovered
bluetoothctl devices # list found device MAC address and name
bluetoothctl agent on # start an authentication agend
bluetoothctl pair $mac # pair with a device
# after paring connect to the deviceInbound pairing:
# make the device discoverable and pairable
bluetoothctl discoverable on
bluetoothctl pairable onAn agent may be used to guide interactive device paring. Register an agent BlueZ service with:
bluetoothctl agent KeyboardOnlyIf no agent is registered paring will be attempted without user interaction