Проблема возникла при использовании на 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
После этого связь с Интернет была восстановлена.
Комментариев нет:
Отправить комментарий