Он разработан легким, небольшого размера, подходит для маршрутизаторов и брандмауэров с ограниченными ресурсами.
Он также широко используется для привязки на смартфонах и портативных точках доступа, а также для поддержки виртуальных сетей в фреймворках виртуализации.
Подробнее о работе 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_SUBNET=10.77.77.0/24
Только прописать свои значения VPN_NAME и VPN_SUBNET их можно посмотреть командой:
Код: Выделить всё
ip addr
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
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
Код: Выделить всё
cat /tmp/ndnproxymain.stat
Код: Выделить всё
server=127.0.0.1#40500
Перезагружаем роутер
За счет встроенного кеширования 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
Инструкция взято от сюда