пятница, 10 сентября 2021 г.

Адаптер wifi usb теряет связь с роутером по случайному закону

Проблема возникла при использовании на Linux подключаемого по usb wifi адаптера Realtek r8188eu (производства КНР) и роутера MikroTik 931-2nD r2. Сначала под подозрением оказался сам роутер MikroTik. Впоследствии выяснилось, что он "не виновен". Далее под подозрение попало устройство Realtek r8188eu в привязке именно к рассматриваемому компьютеру. Аналогичные r8188eu, подключаемые к другим компьютерам Windows и Linux, "вели себя" штатно.

Внешнее проявление выражалось в пропадании в какой-то момент времени связи с Интернет. При этом сам значок сетевого соединения на панели наличие соединения по wifi показывал, информация об IP-адресе и скорости соединения с точкой wifi присутствовала. Но команда ping роутера приводила к отрицательному результату, хотя ping своего IP-адреса,  полученного от DHCP роутера, выдавал положительный ответ. 

"Танцы с бубном" по поводу настроек энергосбережения устройств, подключаемых по usb, к результату не привели.

Было обнаружено, что если через значок менеджера сетевых соединений выключить и затем снова включить либо поддержку сети, либо Wi-Fi, связь компьютера с роутером восстанавливается.

Может быть сам r8188eu оказался немного дефектным, может быть он не совсем "дружит" с конкретным железом, может быть требуется осуществить ряд тонких настроек точки wifi роутера – это вопросы теоретических изысканий и долгого разбирательства. А причин может быть, как говорят, воз и маленькая тележка. Поэтому было принято решение оттолкнуться от результата выключения/включения поддержки сети и сделать такие действия выполняемыми автоматически при условии пропадания соединения с роутером. 

✔  Примечание. Решение было создано для своих нужд и не претендует как на корректность реализации, так и на изящность кода команд на bash.

Проверка состояния "видимости" роутера

✔  Примечание. Так как для запуска инструмента управления роутером MikroTik – winbox – в Linux требуется установка дополнительного ПО wine, то для управления роутером используется доступ через браузер и на MikroTik запущена служба www, хотя из соображений безопасности её не всегда рекомендуется использовать. Однако поскольку доступ к роутеру по www ограничен конкретной сетью (192.168.190.0/28), то её включение на MikroTik было сочтено приемлемым.

Сам роутер через DHCP выдаёт домен vot и в DNS имеет запись router.vot  Поэтому был создан сценарий, запускаемый через cron каждые 20 минут, который при отсутствии ответа от узла router.vot выполняет какое-то действие:

#!/bin/bash
echo -e "GET http://router.vot HTTP/1.0\n\n" | nc router.vot 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
     :
  else
     действие
fi
exit

Для внесения в cron задания выполните в терминале команду 

crontab -e

впишите новую строку

*/20 * * * * путь к сценарию sh

осуществите перевод каретки на новую строку и сохраните внесённые изменения.

✔  Примечание.  Если сценарий дополнить записью результата проверки в протокол, то получится, например:

#!/bin/bash
day=`date '+%d'`
log=/home/minter/Reports/system/$day.txt
echo -e "GET http://router.vot HTTP/1.0\n\n" | nc router.vot 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
  :
else
  echo "$(date '+%H.%M.%S') -- wifi is not active" >> $log
fi
exit

А в самом протоколе будет иметься запись, например:

13.00.12 -- wifi is not active

Действия при отсутствии ответа от роутера

К сожалению, планировавшиеся изначально остановка и последующий запуск сети к желаемому результату не привели:

/etc/init.d/networking stop

/etc/init.d/networking up

Поэтому было решено выключать wifi, а затем включать его снова.

Требуется указание на конкретную wifi, которое и было получено из ifconfig (или iwconfig). В моём случае этим wifi явилось устройство wlx000b819543a2 

Перед повторным включением wifi была задана пауза в 20 секунд.

Действия выполняются по сценарию sh:

#!/bin/bash
ifconfig wlx000b819543a2 down
sleep 20
ifconfig wlx000b819543a2 up
exit

который необходимо запускать под правами root.

Чтобы пароль не запрашивался, через команду sudo xed /etc/sudoers в файл sudoers была внесена строка:

minter ALL=NOPASSWD: путь с сценарию sh

minter – это моё имя пользователя в системе.

Итог

#!/bin/bash
day=`date '+%d'`
log=/home/minter/Reports/system/$day.txt
echo -e "GET http://router.vot HTTP/1.0\n\n" | nc router.vot 80 > /dev/null 2>&1
if [ $? -eq 0 ]; then
  :
else
  echo "$(date '+%H.%M.%S') -- wifi is not active" >> $log
  sudo /home/minter/Dropbox/scripts/modules/connect-net.sh
  echo "$(date '+%H.%M.%S') -- wifi restarted" >> $log
fi
exit

connect-net.sh – это сценарий перезапуска wifi

log – это файл протокола, из которого будет понятно в какое примерно время с точностью до 20 минут пропала связь с роутером.

✔   Примечание.  При тесте перезапуска wifi значок состояния сети на панели не изменялся. 

При тестировании сценария перезапуска wifi в логах роутера были получены записи:

00:0B:81:95:43:A2@wlan: disconnected, received deauth: sending station leaving (3)
00:0B:81:95:43:A2@wlan: connected, signal strength -58

Через 2 часа после публикации данной заметки состоялось практическая проверка реализации предложенного решения. Из протокола работы системы:

17.20.12 -- no wifi exists
17.20.12 -- wifi is not active
17.20.33 -- network restarted

Из лога MikroTik:

Sep/10/2021 17:06:13
00:0B:81:95:43:A2@wlan: disconnected, extensive data loss
Sep/10/2021 17:20:35
00:0B:81:95:43:A2@wlan: connected, signal strength -54

После этого связь с Интернет была восстановлена.

Комментариев нет:

Отправить комментарий