[recovery mode] Блокировщик рекламы для дома на коленке

Предыстория

Прожорливый Bind9


Пришлось мне пару лет назад покинуть свой родной дом и переехать в другой город. В результате свой самосборный медиа-центр пришлось оставить, а на новом месте купить телеприставку AuraHD Plus. Весьма не плохой девайс за свои деньги, особенно если учесть, что в нем встроены приложения для доступа к сервисам с фильмами и т.п.


Все бы ничего, но реклама там крутится на каждый чих. Пришлось изобретать, как же ее «порезать». Первая мысль была — поднять свой DNS сервер и отправлять все неугодные домены в /dev/null на 127.0.0.1. К этому моменту мой домашний серверок вернулся ко мне и занял свое почетное место на шкафу в качестве NAS сервера.


Сказано — сделано. Поднят Bind9, прописаны конфиги для нескольких доменов, все отлично. Летим.


Спустя пару недель пришла мысль в голову, а почему бы не использовать этот метод для фильтрации рекламы для всех устройств дома? Дело не хитрое же.


Поиск списков с рекламными доменами привел меня к нескольким урлам и я взялся их парсить. Где-то на просторах Хабра была статья, которая помогла мне с парсингом и написанием скриптов для генерации конфигов для Bind9 (спасибо автору, но я не смог найти ссылку, пусть меня простит).


Все сделано и пришло время запускать Bind9. Старт и все отлично. Кроме одного. Этот прожорливый монстр съел всю оперативку и попросил своп. 5 гигабайт памяти на 400 тысяч доменов!


По-мучая таким образом свой бедный сервер на Intel Atom я решил, что это не дело.


Миграция на PowerDNS


Погуглив и поизучав другие варианты, я пришел к выводу, что Bind9 не совсем то, что нужно. Нужен более легкий по ресурсам DNS сервер, который смог бы лопатить такое количество доменов.


PowerDNS подошел как нельзя к стати, т.к. он умеет сам читать конфиги Bind9 и использовать их в работе. Поставил, настроил (собственно в этом нет никакой сложности) backend Bind9 запустил.


Результат превзошел все ожидания — 700 MB потребляемой памяти после 5 гигабайт! Это ли не мечта? Особенно при наличии всего 4 GB в сервере. :)


Несколько месяцев так все и проработало, пока я не задумался, что конфиги Bind9 это конечно хорошо, но старт PowerDNS какой-то ну совсем медленный. Время на «всасывание» всех доменов до неприличия большое и стоит как-то оптимизировать этот процесс.


Из оптимизации оставалось влить только все эти домены с рекламой в MySQL. Это дало бы возможность более гибко управлять списком доменов, добавлять, удалять, поддерживать свои внутренние домены.


Закатали рукава и приступили. Оказалось все довольно просто — zone2sql решает все проблемы :) Оставалось завернуть все это в доккер и поднять. Сделал довольно быстро и без особых проблем.


Так оно летит уже с полгода дома и радует. Но сегодня вышла статья на Хабре о блокировщике рекламы для смартфонов Samsung и мне предложили в комментариях выдать мое поделие в открытый доступ.


Что ж, делюсь.


Зависимости

docker


Поскольку все это крутится внутри контейнеров docker, то эта штука нам 100% понадобится. Все действия относятся к Ubuntu Linux, т.к. именно его я использую дома и в работе.


Устанавливается она согласно документации достаточно просто:


curl -sSL https://get.docker.com/ | sh

После завершения работы скрипта docker будет готов и им можно пользоваться.


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


docker-compose


Docker Compose предназначен для планирования и организации процессов в контейнерах Docker (запуска, отключения, создания межконтейнерных соединений и томов, и т.п.).


Установка не сложнее самого докера:


curl -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Запуск собственного фильтра рекламы

Клонируем репозиторий


Логичное действие и не нуждается, наверное, в пояснениях, зачем это делать. :)


sudo mkdir /opt/docker
sudo chown  /opt/docker
git clone https://github.com/DmitriyLyalyuev/powerdns-no-ads /opt/docker/pdns
cd /opt/docker/pdns

Создаем базу данных


docker-compose up -d mysql

Пользователь базы данных


Для доступа к консоли MySQL сервера нужно выполнить:


docker exec -ti pdns_mysql_1 mysql -u root -p

Пароль по умолчанию для пользователя root — 12345.


Создаем пользователя и базу:


CREATE USER 'powerdns_user'@'%' IDENTIFIED BY 'powerdns';
GRANT ALL PRIVILEGES ON powerdns.* TO 'powerdns_user'@'%';
CREATE DATABASE powerdns;
exit

Стартуем DNS сервер


docker-compose up -d

Обновление списков рекламных доменов

Для обновления списков запускаем:


docker exec -ti pdns_pdns_1 bash
cd /etc/powerdns/bind
./getnewlist.sh && ./import.sh && ./clean.sh
exit

White listing

Список для исключения доменов содержится в начале файла /opt/docker/pdns/powerdns-server/bind/getnewlist.sh.


Пользуйтесь, экспериментируйте и давайте сделаем интернет чище. Хотя бы у себя дома. ;)

Комментарии (9)

  • 2 ноября 2016 в 14:16 (комментарий был изменён)

    0

    Спасибо!


    Создание базы можно подсунуть в скрипт


        volumes:
          - /opt/docker/mysql/data:/var/lib/mysql
          - /opt/docker/mysql/structure/:/docker-entrypoint-initdb.d

    тогда база будет создаваться сама.


    UPD: а, у вас maria, надо посмотреть, умеет ли их image такую штуку
    UPD2: да, умеет, тут у них с mysql совместимость

    • 2 ноября 2016 в 14:17

      0

      Спасибо, посмотрю в эту сторону. :)
  • 2 ноября 2016 в 14:29

    –1

    когда вы повыедетесь уже! :) ©
    • 2 ноября 2016 в 15:35

      0

      Глупость, повторенная дважды, не становиться шуткой.
      • 2 ноября 2016 в 15:36

        0

        Блокировка рекламы — это вам не шутки.
        • 2 ноября 2016 в 15:37

          0

          Да, это вынужденная необходимость.
  • 2 ноября 2016 в 14:53

    0

    dnsmasq потребляет память в килобайтах, делает всё то же самое, работает даже на роутерах с 16 мб оперативки.
    зачем этот велосипед было городить — непонятно.
    • 2 ноября 2016 в 14:58

      +1

      Вы в него пробовали запихнуть 400 тысяч доменов?
      Пробовали управлять всем этим делом?
      Как быстро он стартует с таким багажом?

      Сомневаюсь, что он сможет это все адекватно переваривать.

      • 2 ноября 2016 в 15:43

        0

        root@router:/etc/dnsmasq.d# cat ad* | wc -l
        635317
        стартует минуту на слабом железе.

© Habrahabr.ru