В самом алгоритме нет ничего нового, но благодаря недавнему обновлению AdGuard Home его можно реализовать довольно изящно: использование VPN для заданных вами доменов возможно тройкой коротких скриптов.
Требования
- Развёрнутая среда Entware,
- Рабочее VPN-соединение поверх провайдерского, по которому будет идти обращение к определённым доменам.
Установка пакетов
Подразумевается, что AdGuard Home (далее AGH) будет использоваться вместо встроенной в прошивку службы DNS Proxy. Установите необходимые пакеты:
opkg install adguardhome-go ipset iptables
Выполните первоначальную настройку AGH, для чего в CLI роутера наберите:
opkg dns-override
system configuration save
В этот момент Entware-сервисы будут перезапущены, а интерфейс для первоначальной настройки AGH станет доступен по адресу http://192.168.1.1:3000
, где 192.168.1.1 — IP-адрес роутера. Настройки по умолчанию подходят для большинства случаев.
Скриптовая обвязка
Результаты разрешения указанных доменных имён AGH будет помещать в ipset (bypass в примере), правилами iptables трафик по этим IP-адресам будет помечаться fwmark, а для роутинга помеченного трафика будет использоваться своя таблица маршрутизации.
Первый скрипт — создание ipset’а при старте роутера. Создайте файл /opt/etc/init.d/S52ipset
со следующим содержимым:
#!/bin/sh
PATH=/opt/sbin:/opt/bin:/opt/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
if [ "$1" = "start" ]; then
ipset create bypass hash:ip
ip rule add fwmark 1001 table 1001
fi
Второй — для поддержания актуальности таблицы роутинга. Файл /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh
с содержимым:
#!/bin/sh
[ "$system_name" == "nwg0" ] || exit 0
[ ! -z "$(ipset --quiet list bypass)" ] || exit 0
[ "${change}-${connected}-${link}-${up}" == "link-yes-up-up" ] || exit 0
if [ -z "$(ip route list table 1001)" ]; then
ip route add default dev $system_name table 1001
fi
где nwg0 — сетевой интерфейс VPN-соединения для выборочного обхода блокировок. Если затрудняетесь в его поиске, то посмотрите вывод ip addr
, его адрес будет совпадать с тем, что виден в веб-интерфейсе.
Третий — пометка трафика с помощью fwmark. Актуальная прошивка активно использует эту возможность, поэтому маркировать трафик приходится точечно. Создайте файл /opt/etc/ndm/netfilter.d/010-bypass.sh
c контентом:
#!/bin/sh
[ "$type" == "ip6tables" ] && exit
[ "$table" != "mangle" ] && exit
[ -z "$(ip link list | grep nwg0)" ] && exit
[ -z "$(ipset --quiet list bypass)" ] && exit
if [ -z "$(iptables-save | grep bypass)" ]; then
iptables -w -t mangle -A PREROUTING ! -s 192.168.254.0/24 -m conntrack --ctstate NEW -m set --match-set bypass dst -j CONNMARK --set-mark 1001
iptables -w -t mangle -A PREROUTING ! -s 192.168.254.0/24 -m set --match-set bypass dst -j CONNMARK --restore-mark
fi
где nwg0 — снова сетевой интерфейс VPN-соединения, 192.168.254.0/24 — его подсеть. Её так же можно найти в выводе ip addr
.
Сделайте скрипты исполняемыми:
chmod +x /opt/etc/init.d/S52ipset
chmod +x /opt/etc/ndm/ifstatechanged.d/010-bypass-table.sh
chmod +x /opt/etc/ndm/netfilter.d/010-bypass.sh
и переходите к финальному пункту.
Список доменов для обхода блокировок
Найдите в конфигурационном файле AGH /opt/etc/AdGuardHome/AdGuardHome.yaml
строчку ipset_file: ""
и поменяйте на ipset_file: /opt/etc/AdGuardHome/ipset.conf
.
Файл /opt/etc/AdGuardHome/ipset.conf
будет единственным, требующим редактирования время от времени, в зависимости от изменения вашего персонального списка доменов для разблокировки. Он имеет следующий синтаксис:
intel.com,ipinfo.io/bypass
instagram.com,cdninstagram.com/bypass
epicgames.com,gog.com/bypass
Т.е. в левой части через запятую указаны домены, требующие обхода блокировок, справа после слэша — ipset, в который AGH складывает результаты разрешения DNS-имён. Можно указать всё в одну строчку, можно разделить логически на несколько строк как в примере. Домены третьего уровня и выше также включаются в обход блокировок, т.е. указание intel.com включает www.intel.com, download.intel.com и пр. Рекомендую добавить какой-нибудь «сигнальный» сервис, показывающий ваш текущий IP-адрес (ipinfo.io в примере). Так вы сможете проверить работоспособность настроенного решения. Учтите, что AGH не перечитывает изменённый файл, поэтому после правки перезапустите его с помощью:
/opt/etc/init.d/S99adguardhome restart
При желании можно использовать несколько VPN-соединений для обращения к разным доменам, для простоты понимания здесь это не описано.
Диагностика проблем
- Убедитесь в том, что набор ipset создан и наполняется в процессе работы:
ipset --list bypass
Вывод должен быть не пустой.
- Убедитесь в существовании нужной таблицы роутинга для обхода блокировок:
ip rule list | grep 1001
- Убедитесь, что в таблице присутствует необходимый маршрут:
ip route list table 1001
- Посмотрите, существуют ли правила netfilter для пометки пакетов:
iptables-save | grep bypass
- После перезагрузки роутера проверьте в веб-интерфейсе Системный журнал, в нём не должно быть красных строк, связанных с настроенными скриптами.
Удачи в начинаниях!