MyTetra Share
Делитесь знаниями!
Как включить внешний USB WiFi модуль ZyXEL NWD2105 в Linux
Время создания: 04.09.2024 21:25
Текстовые метки: linux, сеть, wifi, wi-fi, usb, модуль, донгл, свисток, внешний, zyxel, NWD2105, настройка, включение, подключение
Раздел: Компьютер - Linux - Сеть в Linux
Запись: xintrea/mytetra_syncro/master/base/1725474351u5tdl9tvf6/text.html на raw.github.com

Имеется внешний USB WiFi-модем ZyXEL NWD2105 (в формафакторе USB-свистка). Здесь записывается, как его можно запустить в ОС Linux.





Вначале надо проверить, что ядро увидело вставленный в USB-гнездо модуль. Для этого надо дать команды:



> dmesg

> lsusb



Будет видно, что появилось устройство:



ID 0586:341E ZyXEL Communicaions Corp. NWD2105 802.11bgn Wireless Adapter [Ralink RT3070]



Значит, как минимум ядро видит железяку.


Далее надо "разблокировать" это устройство. Почему-то для wireless-устройств надо делать такую процедуру. Для разблокировки необходим пакет со странным названием rf-kill. Его надо установить, подключив компьютер через проводную сеть. Разблокировка проводится следующими командами:



> rfkill list

0: eeepc-wlan

Soft blocked: yes

Hard blocked: no

1: phy0

Soft blocked: yes

Hard blocked: no

> rfkill unblock 1 (да, писать нужно номер а не имя)


> rfkill list

0: eeepc-wlan

Soft blocked: yes

Hard blocked: no

1: phy0

Soft blocked: no

Hard blocked: no



Видно, что устройство разблокировалось и можно действовать дальше. Необходимо посмотреть, доступно ли само устройство в сетевой подсистеме Linux. Для этого необходимо выполнить команду:



> ip link



Устройство должно быть видно под каким-нибудь "удобным" именем типа wlxfcf528aba8a6, где wlx-это префикс имени, а остальные символы - MAC-адрес устройства. Состояние устройства (state) будет отображаться как DOWN.


Казалось бы, можно поднять интерфейс и подключиться к сети. Однако, попытка поднять интерфейс через утилиту ifconfig приводит к ошибке:



> ifconfig wlxfcf528aba8a6 up

SIOCSIFFLAGS: No such file or directory



А попытка поднять интерфейс через утилиту ip показывает такую ошибку:



> ip link set wlxfcf528aba8a6 up

RTNETLINK answers: No such file or directory



В интернетах пишут, что такое поведение возможно, если в системе не установлены пакеты:



> apt-get install firmware-linux-nonfree

> apt-get install firmware-linux



Если эти пакеты не были установлены, их надо установить. Затем, проще всего, следует перезагрузить систему. Чтобы в initram не попадали лишние данные (что повлияет на скорость загрузки системы), надо вначале поставить только firmware-linux-nonfree, и если после его установки сохранились вышеуказанные ошибки, надо поставить следующий пакет и опять перегрузиться.


Другими словами, признаком того, что прошивки установились и правильно заливаются на подключаемое устройство будет то, что команды поднятия интерфейса не будут показывать ошибку. Скорее всего, команды будут молча выполняться, но интерфейс все равно подниматься не будет. И вроде как это нормальное поведение.



Внимание! После перезагрузки надо не забывать разблокировать WiFi устройство, как было написано выше.



Для дальнейших действий необходимо, чтобы в системе стояли пакеты wireless-tools, iw и iwd.



> apt-get install wireless-tools iw iwd



Далее надо проверить как видится WiFi интерфейс в утилитах управления WiFi-сети:



> iw dev

phy#0

Interface wlxfcf528aba8a6

ifindex 3

wdev 0x1

addr fc:f5:28:ab:a8:a6

type managed



Интерфейс виден. Теперь можно просканировать эфир на предмет наличия WiFi сетей:



> iw wlxfcf528aba8a6 scan



В ответ будет выдан длинный перечень сетей со всеми техническими подробностями. Чтобы просто увидеть список имен сетей, можно дать команду:



> iw wlxfcf528aba8a6 scan | grep SSID



Все эти действия показывают, что WiFi устройство работает с радиоканалом и способно получать информацию по WiFi протоколу.


* * *


Далее надо обратить внимание, что даже на 2024 год существуют устройства и несвободные прошивки к ним, которые не могут работать с длинными идентификаторами устройства. То есть, новомодные идентификаторы в ядре, типа wlxfcf528aba8a6 не всегда поддерживаются. Вот пример:



Somehow, my firmware got trouble with long interface name. So I ran this command to prevent it:

ln -s /dev/null /etc/systemd/network/99-default.link

and it worked.


https://unix.stackexchange.com/questions/386925



А так же возможны проблемы с DHCP, если имя устройства будет длинее 13 символов:



Also, if you want to use the interface with DHCP, the name must have length < 14, due to this issue:


https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=858580


https://stackoverflow.com/questions/24932172



Все это говорит о том, что чтобы не ловить фееричные баги, надо отключить новомодную выдачу имен в ядре. Для этого надо в файле /etc/default/grub добавить ядру опции:



GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"



После чего следует дать команду update-grub и перезагрузить компьютер.


* * *


Подключение по WEP


Если роутер работает по устаревшему протоколу WEP, то вроде как можно дать команду:



> iwconfig wlxfcf528aba8a6 essid Wifi2Home key s:ABCDE12345



В этой команде в опции essid пишется имя роутера, к которому надо подключиться, взятое из предыдущей команды. Опция key задает пароль для подключения, он такой же как и для любых других WiFi-устройств. Префикс "s:" говорит о том, что пароль вводится символьно (иначе пришло бы пароль писать в HEX-кодировке). Команда молча выполнится.


После чего, в теории, команда поднятия интерфейса:



> ip link set wlxfcf528aba8a6 up



должна приводить к поднятию интерфейса и установке соединения. Проверить это на современных роутерах слишком сложно, поэтому здесь данный путь настройки не рассматривается.



Подключение по WPA/WPA2 (оно же WPA-PSK/WPA2-PSK)


Для установки соединения по WPA/WPA2, с учетом того, что соединение будет настраиваться по DHCP (как это происходит в большинстве WiFi подключений), то потребуется чтобы в системе была поддержка DHCP на уровне клиента. Для этого надо установить, как минимум, два пакета:



> apt-get install coredhcp-client systemd-resolved



Соединение будет устанавливаться через утилиту iwd. Ее настройка подробно описана в статье для дистрибутива Arch, но эта информация подходит и для Debian.



https://wiki.archlinux.org/title/Iwd



Вначале надо сделать стандартную настройку на получение IP-адреса для интерфейса wlan0 через DHCP в файле /etc/network/interfaces. Файл должен иметь примерно такой вид (следует обратить внимание, что теперь вместо wlxfcf528fbf8a6 будет простой wlan0):



auto lo

iface lo inet loopback


# The primary network interface

allow-hotplug ens3

iface ens3 inet dhcp


allow-hotplug wlan0

iface wlan inet dhcp



После изменения файла /etc/network/interfaces систему надо перегрузить, ибо в Debian не существует универсального адекватного и гарантированно работающего способа перечитать сетевые настройки.


Далее начинается настрока менеджера iwd. В файле /etc/iwd/main.conf следует прописать следующие опции:



[General]

EnableNetworkConfiguration=true


...


[Network]

RoutePriorityOffset=300

NameResolvingService=systemd



Далее, чтобы информацию о состоянии WiFi-сети могли читать все пользователи, а не только root, необходимо добавить настройки в D-Bus. Для этого следует создать файл /etc/dbus-1/system.d/iwd-allow-read.conf, и прописать в нем:



<!-- Allow any user to read iwd status information. Overrides some part

of /usr/share/dbus-1/system.d/iwd-dbus.conf. -->


<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"

"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">

<busconfig>


<policy context="default">

<deny send_destination="net.connman.iwd"/>

<allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.Properties" send_member="GetAll" />

<allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.Properties" send_member="Get" />

<allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.ObjectManager" send_member="GetManagedObjects" />

<allow send_destination="net.connman.iwd" send_interface="net.connman.iwd.Device" send_member="RegisterSignalLevelAgent" />

<allow send_destination="net.connman.iwd" send_interface="net.connman.iwd.Device" send_member="UnregisterSignalLevelAgent" />

</policy>


</busconfig>



Далее можно начать пробовать подключаться к WiFi сети. Вначале надо запустить сервис iwd:



> systemctl start iwd



По какой-то причине он не настраивается на автозапуск после установки пакета. Поэтому автозапуск для него надо активировать вручную:



> systemctl enable iwd



Далее можно получить список WiFi устройств:



> iwctl device list



Возможно, что устройство надо будет вывести из спящего режима командой:



> iwctl device wlan0 set-property Powered on



Далее можно получить список WiFi сетей командами:



> iwctl station wlan0 scan

> iwctl station wlan0 get-networks



И, наконец, можно подключиться к WiFi сети командой:



> iwctl --passphrase <ПарольНаWiFi> station wlan0 connect <ИмяWiFiСети>



Если все прошло правильно, интерфейс wlan0 будет поднят, и сеть появится:



> ip addr

...

4: wlan0: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000

link/ether e1:e5:28:fb:e8:a9 brd ff:ff:ff:ff:ff:ff

inet6 fe80::fef5:28ff:fefb:f8a6/64 scope link

valid_lft forever preferred_lft forever



Должны начать проходить пинги по IP:



> ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

64 bytes from 8.8.8.8: icmp_seq=1 ttl=106 time=18.7 ms

64 bytes from 8.8.8.8: icmp_seq=2 ttl=106 time=18.6 ms

64 bytes from 8.8.8.8: icmp_seq=3 ttl=106 time=6.78 ms

^C

--- 8.8.8.8 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3004ms

rtt min/avg/max/mdev = 6.776/14.145/18.651/4.930 ms



Однако, резолвинг DNS-имен работать не будет:



> ping webhamster.ru

ping: webhamster.ru: Временный сбой в разрешении имен



А в довершение ко всему, после минуты работы WiFi сеть по каким-то причинам отключится.


Но самое интересное, что после перезагрузки компьютера, подключение с DNS начинает работать нормально.


* * *


Следующим этапом будет размещение настроек подключения к WiFi в конфигурационных файлах iwd.


Для этого надо перейти в каталог /var/lib/iwd и создать в нем файл с именем:



<ИмяWiFiСети>.psk



То есть, если роутер раздает сетку с именем MyHomeWiFi, то надо создать файл с именем:



/var/lib/iwd/MyHomeWiFi.psk



Далее в этом файле надо прописать пароль на подключение к WiFi сети:



[Security]

Passphrase=<ПарольНаWiFi>



Затем можно подключаться к WiFi-сети командой, в которой не надо указывать пароль:



> iwctl station wlan0 connect <ИмяWiFiСети>



После первого подключения, в *.psk-файле рядом с опцией Passphrase добавится строчка:



PreSharedKey=abfb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295



И после этого, вроде как опцию Passphrase можно удалить, и пароль нигде не будет светиться в явном виде.


Вот так просто и непринужденно можно настроить WiFi соединение в Linux минимальными средствами.


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования