Как настроить автоматическое обновление блокировок рекламы на DD-WRT

Если вы прошили роутер DD-WRT и хотите избавиться от рекламы на всех устройствах в сети — без установки расширений на каждый браузер и приложений на телефоны — вам нужен скрипт, который будет сам качать свежие списки блокировки и обновлять правила. Раз в неделю, раз в сутки, когда вам удобно. Без ручного вмешательства.

Расскажу, как это работает под капотом, какие есть варианты и какой путь выбрать под вашу ситуацию.

Что вообще происходит, когда роутер блокирует рекламу

DD-WRT — это Linux. А значит, внутри есть всё необходимое: DNS-сервер, файрвол, планировщик cron и возможность запускать скрипты. Блокировка рекламы на уровне роутера обычно строится вокруг двух механизмов:

  • DNS-фильтрация — роутер не резолвит домены рекламных серверов. Устройство запрашивает ads.example.com, а DNS отдаёт пустой адрес. Реклама просто не загружается.
  • iptables + ipset — файрвол дропает соединения к известным IP-адресам рекламных сетей. Работает жёстче, но требует больше ресурсов.

Списки рекламных доменов — это текстовые файлы с тысячами строк. Они постоянно меняются: появляются новые трекеры, умирают старые. Вот почему нужна автоматизация обновления. Вручную раз в неделю заходить в веб-интерфейс и вставлять списки — то ещё занятие.

Три рабочих подхода

Есть несколько способов организовать автоматическое обновление. Выбор зависит от того, какой софт вы уже используете и сколько памяти у роутера.

Подход Что используется Плюсы Минусы Кому подходит
dnsmasq + скрипт Встроенный DNS-сервер DD-WRT и кастомный скрипт в /jffs Не нужен дополнительный софт, работает на любом роутере с DD-WRT Нужно писать или адаптировать скрипт самостоятельно Тем, кто хочет минимум зависимостей и готов разобраться в bash
AdGuard Home в контейнере AdGuard Home, запущенный через Entware или на USB-накопителе Красивый веб-интерфейс, статистика, родительский контроль, автообновление из коробки Требует больше оперативной памяти (от 256 МБ) и USB-порт для хранения Тем, у кого мощный роутер и кто хочет «настроил и забыл»
Pi-hole на отдельном устройстве Pi-hole на Raspberry Pi или ВМ, DD-WRT просто указывает на него как на DNS Максимальная гибкость, огромное сообщество, детальная аналитика Нужно отдельное устройство, DD-WRT здесь только транзит Тем, у кого уже есть Raspberry Pi или сервер в сети

Настройка dnsmasq через скрипт в /jffs

Это самый легковесный вариант. Он работает даже на роутерах с 32 МБ оперативной памяти, потому что использует только встроенные инструменты DD-WRT.

Шаг 1. Подготовьте место для скрипта

Включите JFFS2 в веб-интерфейсе: Services → JFFS2 → Enable. После перезагрузки у вас появится раздел /jffs, который не стирается при обновлении прошивки. Именно туда мы положим скрипт.

Шаг 2. Создайте скрипт обновления

Подключитесь к роутеру по SSH и создайте файл:

vi /jffs/update-adblock.sh

Вот базовая версия скрипта, который качает списки, форматирует их под dnsmasq и перезапускает DNS-сервер:

#!/bin/sh

# Временная директория для загрузки
TMPDIR="/tmp/adblock-update"
mkdir -p "$TMPDIR"

# Файл, куда соберём итоговый список
OUTFILE="/jffs/dnsmasq.adblock.conf"

# Источники списков блокировки
LISTS="
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
"

# Качаем каждый список
for url in $LISTS; do
    filename=(echo "url" | md5sum | cut -d' ' -f1)
    fetch -o "TMPDIR/filename" "$url" 2>/dev/null
done

# Обрабатываем: убираем комментария, пустые строки, форматируем под dnsmasq
cat "$TMPDIR"/* 2>/dev/null | \
    grep -v '^#' | \
    grep -v '^$' | \
    grep -v 'localhost' | \
    sed 's/^127.0.0.1 //; s/^0.0.0.0 //' | \
    sed 's/^/address=\//; s/$/\/0.0.0.0/' | \
    sort -u > "$OUTFILE"

# Очищаем временные файлы
rm -rf "$TMPDIR"

# Перезапускаем dnsmasq, чтобы подхватить новый конфиг
stopservice dnsmasq
startservice dnsmasq

echo "(date): Adblock updated,(wc -l < "$OUTFILE") entries" >> /jffs/adblock.log

Скрипт делает простую вещь: скачивает несколько списков, вырезает мусор, приводит к формату address=/домен/0.0.0.0 и перезапускает dnsmasq. Лог пишется в /jffs/adblock.log — удобно проверять, что всё работает.

Шаг 3. Подключите конфиг к dnsmasq

В веб-интерфейсе перейдите в Services → DNSMasq и в поле Additional DNSMasq Options добавьте:

conf-file=/jffs/dnsmasq.adblock.conf

Сохраните и примените настройки.

Шаг 4. Настройте автоматический запуск по расписанию

В веб-интерфейсе: Administration → Management → Cron → Enable. В поле Additional Cron Jobs добавьте строку для запуска скрипта, например, раз в сутки в 4 утра:

0 4 * * * root /jffs/update-adblock.sh

Формат cron стандартный: минута, час, день месяца, месяц, день недели. Если хотите обновлять раз в неделю по воскресеньям в 3 ночи:

0 3 * * 0 root /jffs/update-adblock.sh

Если хотите использовать ipset вместо dnsmasq

DNS-фильтрация не спасает от рекламы, которая грузится с того же домена, что и полезный контент (например, CDN-хостинги). В таких случаях можно добавить блокировку по IP через ipset.

Принцип тот же: скрипт качает списки IP-адресов, загружает их в ipset-сет, а iptables дропает трафик к этому сету. Скрипт будет выглядеть примерно так:

#!/bin/sh

IPSET_NAME="adblock_ips"
LIST_URL="https://raw.githubusercontent.com/your-list-source/iplist.txt"

# Создаём сет, если не существует
ipset list "$IPSET_NAME" >/dev/null 2>&1 || \
    ipset create "$IPSET_NAME" hash:net maxelem 131072

# Временный файл для новых записей
TMPFILE="/tmp/ipset-adblock.txt"
fetch -o "TMPFILE" "LIST_URL" 2>/dev/null

# Обновляем сет
while read -r ip; do
    ipset add "IPSET_NAME" "ip" 2>/dev/null
done < "$TMPFILE"

rm -f "$TMPFILE"

И правило в iptables (добавляется через Administration → Commands → Firewall):

iptables -I FORWARD -m set --match-set adblock_ips dst -j DROP

Минус подхода: ipset хранит всё в оперативной памяти. Список на 100 000 IP-адресов съедает несколько мегабайт RAM. На роутере с 64 МБ памяти это может быть ощутимо.

AdGuard Home через Entware

Если у вас роутер с USB-портом и от 256 МБ RAM, проще поставить AdGuard Home. Он обновляет фильтры сам, имеет веб-интерфейс и показывает статистику запросов.

Установка через Entware:

  1. Установите Entware на USB-накопитель (инструкции есть на форуме DD-WRT).
  2. Подключитесь по SSH и выполните: opkg install adguardhome
  3. Запустите: /opt/etc/init.d/S80adguardhome start
  4. Откройте http://IP_РОУТЕРА:3000 и пройдите мастер настройки.
  5. В настройках DHCP на DD-WRT укажите адрес роутера как DNS-сервер для клиентов.

AdGuard Home обновляет фильтры по расписанию самостоятельно. Вам не нужно писать скрипты — только выбрать нужные списки в веб-интерфейсе.

Частые ошибки и как их избежать

Когда люди впервые настраивают блокировку рекламы на роутере, проблемы обычно одни и те же:

  • Забывают про объём списков. Если сложить все популярные списки, получится 500 000+ доменов. dnsmasq на слабом роутере может не справиться — DNS-запросы начнут тормозить или таймаутиться. Решение: начните с одного-двух списков и следите за нагрузкой.
  • Блокируют слишком агрессивно. Некоторые списки содержат домены, которые ломают работу сайтов или приложений. Например, блокировка graph.facebook.com может сломать вход через Facebook на сторонних сайтах. Ведите белый список.
  • Не проверяют, что скрипт реально отработал. Добавьте логирование в скрипт и периодически смотрите в лог. Если роутер перезагрузился в момент обновления или интернет был недоступен — скрипт мог скачать пустой файл и затереть рабочий список.
  • Кладут скрипт в /tmp. Директория /tmp стирается при перезагрузке. Скрипт и конфиги должны жить в /jffs или на USB-накопителе.
  • Не делают бэкап рабочей конфигурации. Перед тем как запустить скрипт впервые, сохраните текущий dnsmasq-конфиг. Если что-то пойдёт не так — сможете откатиться за минуту.

Что выбрать в вашей ситуации

Роутер слабый (32–64 МБ RAM), USB-порта нет. Ваш путь — dnsmasq + скрипт в /jffs. Один-два списка, cron раз в сутки. Не гонитесь за объёмом — лучше стабильная работа с 50 000 доменами, чем зависший роутер с 300 000.

Роутер средний (128–256 МБ RAM), есть USB. Ставьте AdGuard Home через Entware. Получите интерфейс, статистику и автоматическое обновление без написания скриптов.

Есть Raspberry Pi или домашний сервер. Поднимите Pi-hole на нём, а в DD-WRT просто пропишите его адрес как DNS в настройках DHCP. Роутер здесь только маршрутизирует трафик, вся логика — на отдельной машине.

Нужна максимальная блокировка, включая рекламу в приложениях на телефоне. Комбинируйте DNS-фильтрацию с VPN. Настройте на роутере VPN-сервер, подключайте телефон к нему — и все DNS-запросы пойдут через ваш фильтр, даже когда вы не дома.

Практические рекомендации

  1. Начните со списка StevenBlack — он хорошо поддерживается и умеренно агрессивен.
  2. Добавьте в dnsmasq опцию no-resolv и укажите публичный DNS в server= (например, 1.1.1.1 или 8.8.8.8), иначе после перезапуска dnsmasq не сможет резолвить нормальные домены.
  3. Замерьте время ответа DNS до и после включения блокировки: dig @192.168.1.1 google.com. Если время выросло больше чем на 50–100 мс — список слишком большой для вашего роутера.
  4. Ведите белый список в отдельном файле. Если какой-то сайт перестал работать — добавьте его домен в /jffs/dnsmasq.whitelist.conf с директивой server=/домен/1.1.1.1, чтобы этот домен резолвился в обход блокировки.
  5. Обновляйте списки не чаще раза в сутки. Рекламные домены не меняются каждые час, а каждый запуск скрипта — это нагрузка на флеш-память роутера (запись файлов). Флешка имеет ограниченный ресурс циклов записи.

Итог

Автоматическое обновление блокировок рекламы на DD-WRT — это вопрос пяти минут, если знать, что делать. Скрипт в /jffs + cron для dnsmasq — самый универсальный вариант, работает на любом роутере. AdGuard Home — если хотите красиво и без строчки кода. Pi-hole — если есть отдельное устройство.

Главное правило: начните с малого, проверьте стабильность, потом добавляйте списки. Роутер — не сервер, он должен маршрутизировать трафик, а не выдыхаться под миллионом правил блокировки.

Dfncfg.ru