September 12, 2024

Автоматическое добавление клиентов в AdguardHome из роутера Keenetic

Оглавление

1. Описание

AdguardHome позволяет автоматически подгружать список имен клиентов из файла /etc/hosts в runtime клиенты. Выглядит это так:

Главная страница
При этом в ручную добавленных клиентов нет
Зарегистрированные клиенты в роутере

Плюсы этого решения перед ручным добавлением клиентов в adguard - это автоматическое слежение за именами хостов, их ip адресами, и позволяет довольно просто узнать какие ipv6 адреса у устройств в сети, так как в кинетике за этим следить по умолчанию нельзя.

Минусы - нельзя навесить какие-то права на устройство, тогда все равно вручную нужно будет добавлять клиента

[в начало]

2. Логика работы скрипта

Что бы автоматически добавлять клиентов в файл /etc/hosts (по факту этот файл является ссылкой на /var/hosts) был написан скрипт, который:
1) выдергивает зарегистрированных клиентов из кинетика
2) добавляет их ipv4 адреса с их именем в файл /var/hosts
3) Так же скрипт ищет текущие ipv6 адреса в сети и сопоставляет по MAC адресу их с зарегистрированными клиентами и так же добавляет в /var/hosts
4) При наличии изменений в файле /var/hosts перезапускает adguard
5) Запускается при старте роутера и раз в час по крону

[в начало]

3. Скачивание скрипта

3.1. Заходим на ssh в entware, ставим нужные пакеты:

opkg install cron curl diffutils patch

3.2. Создаем папку и скачиваем в нее файл скрипта, делаем его исполняемым

mkdir scripts
curl https://raw.githubusercontent.com/DennoN-RUS/scripts/main/keenetic/add-instance-in-hosts.sh > scripts/add-instance-in-hosts.sh
chmod +x scripts/add-instance-in-hosts.sh

Ссылка на скрипт

[в начало]

4. Настройка и запуск скрипта

Перед запуском нужно внести пару изменений в сам скрипт
4.1. Открываем файл на редактирование и меняем:

local_iface=br0

Где br0 имя интерфейса локальной сети, узнать его можно выполнив команду:

ip a | grep -B2 "192.168.1.1"

Где 192.168.1.1 адрес роутера в локальной сети

router_name=S-KN-1811

Сюда пишем имя роутера, любое, без пробелов, только латиница, цифры и знак -

ipv6_enable=1

Если 1, то скрипт будет пытаться определить ipv6 адреса устройств. Если 0, то будет пропускать этот шаг

get_old=1

Можно поставить 0 - это выключено и 1 - это включено. Если включено, будет создавать файл /opt/etc/host.old, в который будут попадать устройства, которые были разрегистрированны в кинетике или же у них пропал ipv6 адрес, если он был до этого. На функционал не влияет, но можно будет понять, что в хостах осталось что-то старое и не нужное. Можно выключть, что бы не записывать на флешку каждый раз, когда устройство пропадет из сети (актуально только для ipv6)

SCRIPT_PATH="$SYSTEM_PATH/root/scripts"

Скрипт должен лежать по пути /opt/root/scripts, если в каком-то другом месте, то можно поменять путь в этой переменной

4.2. Запускаем скрипт

./scripts/add-instance-in-hosts.sh

[в начало]

5. Проверка

После того, как скрипт запустился он:
1) создаст файл /opt/etc/init.d/S04user-scripts, который будет запускаться при старте системы и заполнять файл /var/hosts
2) создаст ссылку на себя же в папке /opt/etc/cron.hourly/ для запуска раз в час
3) заполнит полными данными файл /opt/etc/host.res, формат такой: Имя MAC IP #Дата добавления/изменения в файле этой строки
4) заполнит файл /var/hosts, формат такой: IP Имя
5) перезапустит adguard, что бы тот перечитал файл /etc/hosts, рестарт будет происходить каждый раз, когда в файл /var/hosts (он же /etc/hosts) внесены изменения

[в начало]