Если вы прошили роутер DD-WRT и хотите избавиться от рекламы на всех устройствах в сети — без установки расширений на каждый браузер и приложений на телефоны — вам нужен скрипт, который будет сам качать свежие списки блокировки и обновлять правила. Раз в неделю, раз в сутки, когда вам удобно. Без ручного вмешательства.
Расскажу, как это работает под капотом, какие есть варианты и какой путь выбрать под вашу ситуацию.
- Что вообще происходит, когда роутер блокирует рекламу
- Три рабочих подхода
- Настройка dnsmasq через скрипт в /jffs
- Шаг 1. Подготовьте место для скрипта
- Шаг 2. Создайте скрипт обновления
- Шаг 3. Подключите конфиг к dnsmasq
- Шаг 4. Настройте автоматический запуск по расписанию
- Если хотите использовать ipset вместо dnsmasq
- AdGuard Home через Entware
- Частые ошибки и как их избежать
- Что выбрать в вашей ситуации
- Практические рекомендации
- Итог
Что вообще происходит, когда роутер блокирует рекламу
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:
- Установите Entware на USB-накопитель (инструкции есть на форуме DD-WRT).
- Подключитесь по SSH и выполните:
opkg install adguardhome - Запустите:
/opt/etc/init.d/S80adguardhome start - Откройте
http://IP_РОУТЕРА:3000и пройдите мастер настройки. - В настройках 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-запросы пойдут через ваш фильтр, даже когда вы не дома.
Практические рекомендации
- Начните со списка StevenBlack — он хорошо поддерживается и умеренно агрессивен.
- Добавьте в dnsmasq опцию
no-resolvи укажите публичный DNS вserver=(например, 1.1.1.1 или 8.8.8.8), иначе после перезапуска dnsmasq не сможет резолвить нормальные домены. - Замерьте время ответа DNS до и после включения блокировки:
dig @192.168.1.1 google.com. Если время выросло больше чем на 50–100 мс — список слишком большой для вашего роутера. - Ведите белый список в отдельном файле. Если какой-то сайт перестал работать — добавьте его домен в
/jffs/dnsmasq.whitelist.confс директивойserver=/домен/1.1.1.1, чтобы этот домен резолвился в обход блокировки. - Обновляйте списки не чаще раза в сутки. Рекламные домены не меняются каждые час, а каждый запуск скрипта — это нагрузка на флеш-память роутера (запись файлов). Флешка имеет ограниченный ресурс циклов записи.
Итог
Автоматическое обновление блокировок рекламы на DD-WRT — это вопрос пяти минут, если знать, что делать. Скрипт в /jffs + cron для dnsmasq — самый универсальный вариант, работает на любом роутере. AdGuard Home — если хотите красиво и без строчки кода. Pi-hole — если есть отдельное устройство.
Главное правило: начните с малого, проверьте стабильность, потом добавляйте списки. Роутер — не сервер, он должен маршрутизировать трафик, а не выдыхаться под миллионом правил блокировки.
