Linux WiFi з командного рядка з wpa_supplicant

У цій статті я розповім, як можна налаштувати WiFi за допомогою wpa_supplicant, без всяких Xorg/X11 утиліт. Це необхідно для того, щоб базові служби ОС справно працювали з мінімальним набором технічних засобів віддаленого доступу. Програма буде виконуватися як служба, налаштування зроблені правкою конфіг файлів.
По-швидкому, встановити з'єднання з відкритою точкою доступу можна таким чином.
[root@home ~]$ wpa_cli
> add_network
> set_network 0 ssid "MYSSID"
> set_network 0 key_mgmt NONE
> enable_network 0

Якщо ж треба всерйоз і надовго, то прошу всередину.
Загальні відомості про wpa_supplicant
Що з себе являє wpa_supplicant?
  • Крос-платформна відкрита реалізація стандарту IEEE 802.11 для Linux, *BSD, Windows, Mac OS X та інших систем.
  • Повна підтримка WPA2, WPA і більш старих протоколів безпеки бездротової мережі LAN.
  • Додаток користувацького простору, що виконує функції саппликанта і SME оператора, виконуючого MLME інструкції.
Wpa_supplicant підтримує
  • WPA і повністю IEEE 802.11 i/RSN/WPA2.
  • WPA-PSK і WPA2-PSK (pre-shared key) ("WPA-Personal").
  • WPA разом з EAP (тобто, сервером аутентифікації RADIUS) ("WPA-Enterprise") управління ключами CCMP, TKIP, WEP (104/128 і 40/64 біт).
  • Кешування RSN, PMKSA: попередню аутентифікацію.


Як wpa_supplicant встановлює зв'язок із точкою доступу?
  • Мережевий інтерфейс повинен справно функціонувати з встановленим драйвером, перш ніж wpa_supplicant запуститься.
  • Wpa_supplicant запитує драйвер ядра сканувати доступні Basic Service Set (BSS).
  • Wpa_supplicant виробляє вибір BSS у відповідності з налаштуваннями.
  • Wpa_supplicant запитує драйвер ядра встановити з'єднання з обраної BSS.
  • Для WPA-EAP: аутентифікації EAP виробляє вбудований IEEE 802.1 X Supplicant, або ж зовнішній Xsupplicant з сервером аутентифікації.
  • Для WPA-EAP: отримано майстер-ключ від IEEE 802.1 X Supplicant.
  • Для WPA-PSK wpa_supplicant використовує пароль PSK як майстер-ключа сесії.
  • Wpa_supplicant виробляє з аутентифікатором точки доступу 4-х етапне узгодження[1] і групове узгодження ключів.
  • Wpa_supplicant виробляє шифрування односпрямованих і широкомовних пакетів[2], після чого починається звичайний обмін даними.
Головний і великий плюс wpa_supplicant — його юниксвейность, тобто відповідність принципом Unix Way, коли програма робить щось одне, але робить це добре. У якомусь сенсі wpa_supplicant Gentoo Way. Вона вимагає певної уваги і терпіння спочатку, але потім про неї можна геть забути. Після того як програма налаштована і пущена в справу, вона повністю випадає з потоку подій, перетворюючись у пару рядків з
ps -ef
. Вона не блищить і не мерехтить в системному треї, не сповіщає про розвідані, підключених і відключених бездротових мережах. Її просто немає, поки ви самі її не пошукайте.
З мінусів — складність настройки і конфігурації. Багато метушні порівняно з тырк-тырк-тырк у вікні
Network Manager
, не кажучи вже про WiFi підключення з будь Андроїд пристрої. Якщо ви збираєтеся в поїздку з Linux ноутбуком, то напевно віддасте перевагу більш дружній фронтенд налаштування бездротової мережі, щоб швидко підключатися до безкоштовних точок доступу WiFi в аеропорту, в готелі або в робочій обстановці. Для домашнього бездротового інтернету — саме те.
Установка
Якщо не вибирати графічний фронтенд, то програма майже не тягне за собою ніяких залежностей. Для Gentoo Linux згодиться установка з виставленими прапорами як показано.
(5:562)$ equery uses wpa_supplicant
[ Legend : U - final flag setting for installation]
[ : I - package is installed with flag ]
[ Colors : set, unset ]
* Found USE these flags for net-wireless/wpa_supplicant-2.6:
U I
- - ap : Add support for access point mode
+ + dbus : Enable dbus support for anything that it needs (gpsd, gnomemeeting, etc)
- - eap-sim : Add support for EAP-SIM authentication algorithm
- - fasteap : Add support for FAST-EAP authentication algorithm
- - gnutls : Add support for net-libs/gnutls (TLS 1.0 and SSL 3.0 support)
+ + hs2-0 : Add support for 802.11 u and Passpoint for HotSpot 2.0
- - p2p : Add support for Wi-Fi Direct mode
- - qt4 : Add support for the Qt GUI/Application Toolkit version 4.x
- - qt5 : Add support for the Qt 5 application and UI framework
+ + readline : Enable support for libreadline, a GNU line-editing library that almost everyone wants
- - smartcard : Add support for smartcards
+ + ssl : Add support for Secure Socket Layer connections
- - tdls : Add support for Tunneled Direct Link Setup (802.11 z)
- - uncommon-eap-types : Add support for GPSK, SAKE, GPSK_SHA256, IKEV2 and EKE
- - wps : Add support for Wi-Fi Protected Setup

Встановлюємо.
  • emerge -av wpa_supplicant
    #Gentoo
  • aptiture install wpasupplicant
    #Debian
  • yum install wpa_supplicant
    #Redhat
  • pacman -S wpa_supplicant
    #Arch
З'єднання без конфіг файл
Якщо вам потрібно підключитися тільки один раз, то необхідності створювати файл конфігурації і вникати у всі тонкощі налаштування, немає. Досить набрати кілька інструкцій з командного рядка.
Приклад для відкритої мережі був показаний в самому початку. Для закритої WPA мережі швидке підключення виглядає так:
На початку треба запустити саму програму wpa_supplicant і супутню
wpa_cli
.
[root@home ~]$ wpa_supplicant -Dnl80211 -iwlan0 -C/var/run -u &
[root@home ~]$ wpa_cli -p/var/run

Потім налаштування з інтерактивного інтерфейсу
wpa_cli
.
> add_network
> set_network 0 ssid "name of AP"
> set_network 0 key_mgmt WPA-PSK
> set_network 0 попарно TKIP
> set_network 0 psk "key"
> enable_network 0

Для закритої WPA2 мережі:
> add_network
> set_network 0 ssid "name of AP"
> set_network 0 key_mgmt WPA-PSK
> set_network 0 попарно CCMP
> set_network 0 psk "key"
> enable_network 0

В кінці необхідно вручну запустити демон DHCP.
[root@home ~]$ dhcpcd wlan0

Підключення до Ad-Hoc мережі
Ніколи з таким не стикався, але готовим треба бути до всього. Підключення до відкритої ad-hoc.
> add_network
> set_network 0 ssid "adhoc-ssid"
> set_network 0 mode 1
> set_network 0 frequency 2412
> set_network 0 key_mgmt NONE
> enable_network 0

Те ж саме з допомогою
iw
.
> iw dev wlan0 del
> iw phy phy0 interface add wlan0 type ibss
> ifconfig wlan0 up
> iw dev wlan0 scan 
> iw dev wlan0 ibss join AdHocNetworkName 2412 

Налаштування домашньої мережі
Тепер найцікавіше — налаштування. Цей процес задокументований для Arch Wiki, Debian Wiki і Gentoo Wiki, але всіх деталей там немає.
Програма зазвичай ставиться в теку
/etc/wpa_supplicant/
, і наше завдання — правильно налаштувати конфігураційний файл
wpa_supplicant.conf
, і прив'язати його до автозапуску бездротового мережевого інтерфейсу.
Почнемо з
wpa_supplicant.conf
. Якщо ви працюєте з дому до WPA/WPA2, то швидше за все використовуєте пароль для WiFi з'єднання, що відповідає режиму
WPA-PSK ("WPA-Personal")
. Ми не буде розглядати варіанти з шифруванням WEP, так як воно набагато краще відкритої мережі.
Візьмемо типовий конфіг документації. Наприклад такий.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel
#
# home network; allow all valid ciphers
network={
ssid="home"
scan_ssid=1
key_mgmt=WPA-PSK
psk="very secret passphrase"
}

Перший рядок необхідна,
ctrl_interface
програма навіть не запуститься. GROUP=wheel потрібно для того, щоб запускати з-під звичайного користувача в графічному інтерфейсі wpa_gui, але це не наш шлях. Тому міняємо на рутовий
GROUP=0
.
ctrl_interface_group=0
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1

Кожній мережі у файлі налаштувань повинен відповідати блоку
network {}
. Покопавшись в исходниках, виявив знайшов придатне писання змінної
ap_scan
у файлі
config.h
, а в мануалі і керівництві користувача опис дуже убоге.
ap_scan=0 #драйвер сканує точку доступу
ap_scan=1 #wpa_supplicant сканує точку доступу, використовується за замовчуванням
ap_scan=2 #як 0, але ще враховує політики безпеки і SSID, працює з ndiswrapper

описap_scan — AP scanning/selection
By default, wpa_supplicant requests driver to perform AP scanning and then uses the scan results to select a suitable AP. Another alternative is to allow the driver to take care of AP scanning and selection and use wpa_supplicant just to process EAPOL frames based on IEEE 802.11 association information from the driver.
1: wpa_supplicant initiates scanning and AP selection (default).
0: Driver takes care of scanning, AP selection, and IEEE 802.11 association parameters (e.g., WPA IE generation); this mode can also be used with non-WPA drivers when using IEEE 802.1 X mode;
do not try to associate with APs (i.e., external program needs to control association). This mode must also be used when using wired Ethernet drivers.
2: like 0, but associate with APs using security policy and SSID (but not BSSID); this can be used, e.g., with ndiswrapper and NDIS drivers to enable operation with hidden SSIDs and optimized roaming;
in this mode, the network blocks in the configuration are tried one by one until the driver reports successful association; each network block should have explicit security policy (i.e., only one
option in the lists) for key_mgmt, попарно, group, proto variables.
Note: ap_scan=2 should not be used with the nl80211 driver interface (the current Linux interface). ap_scan=1 is optimized work working with nl80211. For finding networks using hidden SSID, scan_ssid=1 in the network block can be used with nl80211.
Інші опції взяті з керівництва конфіг файл.
  • bssid
    — The Basic Service Set Identifier (BSSID), фізична адреса точки доступу.
  • key_mgmt
    — Протоколи аутентифікації.
  • попарно
    — Для WPA2 вкажіть CCMP, а для WPA — TKIP.
  • proto
    — WPA/WPA2.
  • psk
    — Хеш пароля PreShared Key.
керівництво по налаштуваньgroup: list of accepted group (broadcast/multicast) ciphers for WPA
CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11 i/D7.0]
TKIP = Temporal Key Integrity Protocol [IEEE 802.11 i/D7.0]
WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key [IEEE 802.11]
If not set, this defaults to: CCMP TKIP WEP104 WEP40
попарно: list of accepted попарно (unicast) ciphers for WPA
CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11 i/D7.0]
TKIP = Temporal Key Integrity Protocol [IEEE 802.11 i/D7.0]
NONE = Use only Group Keys (deprecated, should not be included if APs support попарно keys)
proto: list of accepted protocols
WPA = WPA/IEEE 802.11 i/D3.0
RSN = WPA2/IEEE 802.11 i (also WPA2 can be used as an alias for RSN)
If not set, this defaults to: WPA RSN
key_mgmt: list of accepted authenticated key management protocols
WPA-PSK = WPA pre-shared key (this requires 'psk' field)
WPA-EAP = WPA using EAP authentication (this can use an external program, e.g., Xsupplicant, for IEEE 802.1 X EAP Authentication
IEEE8021X = IEEE 802.1 X using EAP authentication and (optionally) dynamically generated WEP keys
NONE = WPA is not used; plaintext or static WEP could be used
If not set, this defaults to: WPA-PSK, WPA-EAP
Створюємо хеш пароля для
psk
:
$ wpa_passphrase MYSSID passphrase

Все готово, щоб створити конфіг мережі. Підсумковий файл повинен виглядати якось так.
ctrl_interface_group=0
ap_scan=1
ctrl_interface=/var/run/wpa_supplicant
network={
proto=WPA2
попарно=CCMP
key_mgmt=WPA-PSK
priority=5
ssid="MYSSID"
bssid=44:b0:51:dc:ba:f8
psk=ce55977186ae1df2dffeb571acee8dacd92f49edddbdef53623132e3c24567ae
}

Вірні значення для
bssid
,
group
,
proto
та
попарно
можна визначити, скануючи бездротову мережу.
[root@home ~]$ iwlist <wlan_interface> scan

Команда
iwlist
з набору
Wireless Tools
застаріла, замість неї зараз
iw
.
[root@home ~]$ iw dev <wlan_interface> scan

Налаштування 802.1 X для офісу
Стандарт IEEE 802.1 X визначає більш сувору модель підключення до WiFi мережі. Замість
psk
паролю потрібно пред'явити сертифікат.
  • ca_cert
    — Абсолютний шлях до CA-сертифікату в форматі PEM або DER, необхідний для можливості підтвердження сертифіката сервера.
  • ca_path
    — Абсолютний шлях до директорії, де зберігаються файли CA-сертифікатів (PEM), які ви бажаєте додати в список довірених.
  • client_cert
    — Абсолютний шлях до клієнтського сертифіката у форматі PEM або DER.
  • eap
    — Розділений пробілами список підтримуваних методів EAP: MD5, MSCHAPV2, OTP, GTC, TLS, PEAP, або TTLS.
  • identity
    — Ідентифікації EAP, наприклад ім'я користувача.
  • password
    — Пароль EAP.
Так може виглядати блок, що використовується для підключення до мережі в режимі WPA-Enterprise з аутентифікацією 802.1 X PEAP, в якому потрібно ввести дані облікового запису:
network = {
ssid="Company WPA2 EAP"
key_mgmt=WPA-EAP
попарно=TKIP
group=TKIP
eap=PEAP
identity="username@domain"
password="your_passphrase"
ca_cert="./etc/cert/ca.pem"
phase1="peapver=0"
phase2="MSCHAPV2"
}

А це приклад блоку, налаштованого для підключення до мережі в режимі WPA-Enterprise з аутентифікацією 802.1 X EAP-TLS, в якому потрібні серверний та клієнтський сертифікати:
network = {
ssid="Company WPA2 TLS"
key_mgmt=WPA-EAP
попарно=CCMP
group=CCMP
eap=TLS
ca_cert="./etc/cert/ca.pem"
private_key="./etc/cert/privkey.p12"
private_key_passwd="your_passphrase PKCS#12"
}

Прив'язка wpa_supplicant до мережевої карти
Gentoo Linux треба додати 2 рядка
/etc/conf.d/net
.
modules=( "wpa_supplicant" )
wpa_supplicant_wlan0="-Dnl80211"

Список підтримуваних
D<driver>
драйверів. Для сучасних чіпів і версій ядра підійде
nl80211
. На старому залізі може злетіти
wext
.
  • nl80211
    — New driver.
  • wext
    — Linux wireless extensions (generic).
  • wired
    — wpa_supplicant wired Ethernet driver.
  • roboswitch
    — wpa_supplicant Broadcom switch driver.
  • bsd
    — BSD 802.11 support (Atheros, etc.).
  • ndis
    — Windows NDIS driver.
Мережева карта
wlan0
має бути залинкована з
lo0
.
lrwxrwxrwx 1 root root 6 лис 29 2014 /etc/init.d/net.wlan0 -> net.lo

Слід також додати wpa_supplicant автозапуск.
[root@home ~]$ rc-update add wpa_supplicant default

Користувачі > Debian додають запис в файл
/etc/network/interfaces
.
auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Користувачі > RedHat додають
/etc/sysconfig/wpa_supplicant

INTERFACES="-iwlan0"

а в файл
/etc/sysconfig/network-scripts/ifcfg-wlan0

ESSID="home"
NAME=wlan0
MODE=Managed
KEY_MGMT=WPA-PSK
TYPE=Wireless
BOOTPROTO=dhcp
DEFROUTE=yes
ONBOOT=yes
HWADDR=aa:bb:cc:dd:ee
IPV6INIT=yes
IPV6_AUTOCONF=yes

Налагодження
Після того як wpa_supplicant успішно підключилася до точки доступу,
dmesg
можна побачити протокол встановлення з'єднання.
[243960.587] cfg80211: World regulatory domain updated:
[243960.587] cfg80211: DFS Master region: unset
[243960.587] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time)
[243960.587] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A)
[243960.587] cfg80211: (2457000 KHz - 2482000 KHz @ 20000 KHz, 92000 KHz AUTO), (2000 mBm), (N/A)
[243960.587] cfg80211: (2474000 KHz - 2494000 KHz @ 20000 Кгц), (N/A, 2000 mBm), (N/A)
[243960.587] cfg80211: (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (2000 mBm), (N/A)
[243960.587] cfg80211: (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (2000 mBm), (0 s)
[243960.587] cfg80211: (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s)
[243960.587] cfg80211: (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), 
[243960.587] cfg80211: (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm),
[243963.070] wlan0: authenticate with aa:bb:cc:dd:ee
[243963.075] wlan0: send auth to aa:bb:cc:dd:ee (try 1/3)
[243963.077] wlan0: authenticated
[243963.084] wlan0: associate with aa:bb:cc:dd:ee (try 1/3)
[243963.088] wlan0: RX AssocResp from aa:bb:cc:dd:ee (capab=0x411 status=0 aid=3)
[243963.090] wlan0: associated

Якщо ж замість цього ви побачите помилку:
Successfully initialized wpa_supplicant
nl80211: Driver does not support authentication/association or connect commands
wlan0: Failed to initialize driver interface

то швидше за все, треба використовувати драйвер
wext
замість
nl80211
. А з помилкою:
WEXT: Driver did not support SIOCSIWAUTH for AUTH_ALG, trying SIOCSIWENCODE

навпаки, замість
wext
треба підставити
nl80211
.
В ситуації, коли ви не можете визначити помилку, запустіть wpa_supllicant безпосередньо з ключем
dd
.
[root@home ~]$ wpa_supplicant -Dnl80211 -iwlan0 -C/var/run/wpa_supplicant/ -c/etc/wpa_supplicant/wpa_supplicant.conf -dd

Використані матеріали


  1. 4-way handshake
  2. Unicast and broadcast
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.