dnsmasq на ОС Entware

Тут будет некоторая информация по keenetic
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 847
Стаж: 5 лет 6 месяцев
Откуда: Вологодская область
Поблагодарили: 37 раз
Контактная информация:

dnsmasq на ОС Entware

Сообщение Артём Мамзиков »

Dnsmasq предоставляет сетевую инфраструктуру для небольших сетей: DNS, DHCP, объявление маршрутизатора и сетевая загрузка.
Он разработан легким, небольшого размера, подходит для маршрутизаторов и брандмауэров с ограниченными ресурсами.
Он также широко используется для привязки на смартфонах и портативных точках доступа, а также для поддержки виртуальных сетей в фреймворках виртуализации.
Подробнее о работе dnsmasq

при использовании dnsmasq в keenetic не будет работать встроенный функционал:
Придётся отказаться от прошивочного сервиса с его плюшками.
От веб-интерфейса при вводе новых доменов и от понимания прошивкой обращения к доменам и поддоменам.
А так же от интернет фильтров со всеми возможностями которые они дают.
возможность обращения к локальным устройствам по тем DNS-именам, которыми они представились DHCP-серверу.
И в целом не хочется без крайней нужды отрывать какой-то базовый функционал от роутера, поскольку прошивочная логика больше не будет им управлять.
Если он отвалится, то перезапустить его будет некому.
Прошивочные фичи можно сохранить, сделав каскад из DNS-прокси служб.
Прошивочный резолвер будет обращаться к dnsmasq.

Так же мы разбирали:
ipset-dns— это легкий сервер пересылки DNS, который добавляет все разрешенные IP-адреса
Более подробно об ipset-dns тут
аналогично:
dnsmasq; adguardhome, они так же умеют наполнять ipset по результатам разрешения DNS-имён.

Более подробно о ipset

ipset - инструмент для работы с большим количеством IP-адресов и сетевых портов в брандмауэре/межсетевого экране netfilter/iptables

route Маршрутизация
еще примеры маршрутизации


Обновляем список пакетов и устанавливаем ipset iptables dnsmasq mc

Код: Выделить всё

opkg update && opkg install ipset iptables dnsmasq-full mc
Создадим файл и наполним его содержимым

Код: Выделить всё

mcedit /opt/etc/bypass.conf
VPN_NAME=nwg0
VPN_SUBNET=10.77.77.0/24

Только прописать свои значения VPN_NAME и VPN_SUBNET их можно посмотреть командой: Даем права на запуск:

Код: Выделить всё

chmod +x /opt/etc/bypass.conf
Создаем скрипт запуска:

Код: Выделить всё

mcedit /opt/etc/init.d/S52ipset-bypass
Содержимое

Код: Выделить всё

#!/bin/sh

# Установка переменной окружения PATH для определения путей к исполняемым файлам
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# Загрузка конфигурационных данных из файла bypass.conf
. /opt/etc/bypass.conf

# Проверка первого аргумента командной строки
if [ "$1" = "start" ]; then
    # Создание IP-сета с именем bypass для хранения IP-адресов
    ipset create bypass hash:ip
    
    # Добавление правила маршрутизации для пакетов с маркером 1001
    ip rule add fwmark 1001 table 1001
fi

Даем права на запуск:

Код: Выделить всё

chmod +x /opt/etc/init.d/S52ipset-bypass
Создаем хук iflayerchanged.d:

Код: Выделить всё

mcedit /opt/etc/ndm/iflayerchanged.d/010-bypass-table.sh
Вставляем содержимое:

Код: Выделить всё

#!/bin/sh

# Загрузка конфигурационных данных из файла bypass.conf
. /opt/etc/bypass.conf

# Проверка условий для выполнения скрипта
[ "$1" == "hook" ] || exit 0  # Скрипт выполняется только если первый аргумент равен "hook"
[ "$system_name" == "$VPN_NAME" ] || exit 0  # Выполняется только если переменная system_name равна VPN_NAME
[ ! -z "$(ipset --quiet list bypass)" ] || exit 0  # Выполняется только если IP-сет bypass не пуст
[ "${layer}-${level}" == "link-running" ] || exit 0  # Выполняется только если значение переменной layer-level равно "link-running"

# Добавление маршрута по умолчанию в таблицу маршрутизации 1001, если маршрут отсутствует
if [ -z "$(ip route list table 1001)" ]; then
    ip route add default dev $system_name table 1001
fi
Даем права на запуск:

Код: Выделить всё

chmod +x /opt/etc/ndm/iflayerchanged.d/010-bypass-table.sh
Создаем хук netfilter.d:

Код: Выделить всё

mcedit /opt/etc/ndm/netfilter.d/010-bypass-table.sh
В него вставляем содержимое:

Код: Выделить всё

#!/bin/sh

# Загрузка конфигурационных данных из файла bypass.conf
. /opt/etc/bypass.conf

# Проверка условий для выполнения скрипта
[ "$type" == "ip6tables" ] && exit 0  # Если тип не равен "ip6tables", выход из скрипта
[ "$table" != "mangle" ] && exit 0  # Если таблица не равна "mangle", выход из скрипта
[ -z "$(ip link list | grep $VPN_NAME)" ] && exit 0  # Если интерфейс с именем $VPN_NAME не найден, выход из скрипта
[ -z "$(ipset --quiet list bypass)" ] && exit 0  # Если IP-сет bypass пустой, выход из скрипта

# Проверка, существует ли уже правило с использованием iptables
if [ -z "$(iptables-save | grep bypass)" ]; then
    # Добавление правил в таблицу mangle для маркировки пакетов
    iptables -w -t mangle -A PREROUTING ! -s $VPN_SUBNET -m conntrack --ctstate NEW -m set --match-set bypass dst -j CONNMARK --set-mark 1001
    iptables -w -t mangle -A PREROUTING ! -s $VPN_SUBNET -m set --match-set bypass dst -j CONNMARK --restore-mark
fi
Даем права на запуск:

Код: Выделить всё

chmod +x /opt/etc/ndm/netfilter.d/010-bypass-table.sh
Редактируем файл конфигурации dnsmasq.conf:

Код: Выделить всё

mcedit /opt/etc/dnsmasq.conf

Код: Выделить всё

user=nobody
pid-file=/var/run/opt-dnsmasq.pid
port=5300

min-port=4096
cache-size=1536

bogus-priv
no-negcache
no-resolv
no-poll
no-hosts
clear-on-reload
# bind-dynamic
# listen-address=192.168.0.1
# listen-address=127.0.0.1
# expand-hosts
# log-async

server=8.8.8.8
ipset=/#/bypass
Если вы используете DoT или DoH на роутере, то можно указать их, чтобы DNS запросы к перенаправленным хостам также шифровались. Подсмотреть адреса и порты локальных резолверов можно командой

Код: Выделить всё

cat /tmp/ndnproxymain.stat
Все что с портами 405*** это DoH/DoT серверы кинетика. Выбираем любой. Адрес с портом указываем так:

Код: Выделить всё

server=127.0.0.1#40500
Добавляем нужные хосты в разделе Интернет-фильтры -> Настройка DNS, указывая адрес сервера DNS: 192.168.1.1:5300
Перезагружаем роутер

За счет встроенного кеширования dnsmasq, работает намного стабильнее и быстрее в плане резолвинга, чем при использовании ipset-dns

Советую перенести на другой порт. Порт 5353 может использоваться
Проверка свободности порта
netstat -nlpu | grep :5353
Bash
udp 0 0 0.0.0.0:5353 0.0.0.0:* 658/avahi-daemon
если используется smb и/или mdns
Ошибка при старте если порт занят "Race Condition"

Чтобы все работало после перезагрузки надо изменить порт в ipset-dns потому что происходит конфликт с avahi-daemon и поэтому не работает. Выполняем:
nano /opt/etc/init.d/S52ipset-dns и редактируем порт 5353 на 5300, сохраняем, перезагружаем роутер, теперь домены добавлять в роутере во вкладке > Сетевые правила > Интернет фильтр > в строке Адрес сервера DNS писать это значение 192.168.1.1:5300
/opt/etc/init.d/S56dnsmasq restart

Инструкция взято от сюда
количество слов: 467

Вернуться в «Keenetic»