Если кому интересно вот инструкция:
Предполагается что у вас уже настроено VPN соединение на роутере.
В инструкции используется новый хук iflayerchanged.d, который работает только на прошивках 4.0+.
Сносим opkg и ставим заново на всякий случай. Я устанавливаю во внутреннюю память роутера. Все нужные пакеты занимают около 7мб.
После установки opkg заходим по SSH в Entware. Для этого в командной строке:
ssh root@192.168.1.1 -p 222
Устанавливаем пакеты:
opkg update && opkg install ipset iptables dnsmasq
Внимание: Далее будет работа с редактором vi. Прежде чем вставить текст в редакторе нужно нажать кнопку i на клавиатуре чтобы войти в режим редактирования, вставить текст, затем нажать ESC на клавиатуре, написать :wq и нажать Enter чтобы сохранить файл и закрыть редактор.
Создаем файл конфигурации:
vi /opt/etc/bypass.conf
В него вставляем содержимое, отредактировав VPN_NAME и VPN_SUBNET (можно подсмотреть командой: ip addr):
VPN_NAME=nwg0
VPN_SUBNET=10.77.77.0/24
Даем права на запуск:
chmod +x /opt/etc/bypass.conf
Создаем скрипт запуска:
vi /opt/etc/init.d/S52ipset-bypass
В него вставляем содержимое:
#!/bin/sh
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /opt/etc/bypass.conf
if [ "$1" = "start" ]; then
ipset create bypass hash:ip
ip rule add fwmark 1001 table 1001
fi
Даем права на запуск:
chmod +x /opt/etc/init.d/S52ipset-bypass
Создаем хук iflayerchanged.d:
vi /opt/etc/ndm/iflayerchanged.d/010-bypass-table.sh
В него вставляем содержимое:
#!/bin/sh
. /opt/etc/bypass.conf
[ "$1" == "hook" ] || exit 0
[ "$system_name" == "$VPN_NAME" ] || exit 0
[ ! -z "$(ipset --quiet list bypass)" ] || exit 0
[ "${layer}-${level}" == "link-running" ] || exit 0
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:
vi /opt/etc/ndm/netfilter.d/010-bypass-table.sh
В него вставляем содержимое:
#!/bin/sh
. /opt/etc/bypass.conf
[ "$type" == "ip6tables" ] && exit
[ "$table" != "mangle" ] && exit
[ -z "$(ip link list | grep $VPN_NAME)" ] && exit
[ -z "$(ipset --quiet list bypass)" ] && exit
if [ -z "$(iptables-save | grep bypass)" ]; then
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:
vi /opt/etc/dnsmasq.conf
В него вставляем новый конфиг, заменяя старый. Адрес в server можно поменять на предпочтительный DNS сервер, например 1.1.1.1 или 9.9.9.9.
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
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.