среда, 12 ноября 2014 г.

Баннерорезалка масштаба сети на BIND и nginx

Давно у меня зрело желание порезать рекламу в едином месте - на шлюзе домашней сети.
Задача эта так и висела бы, наверное, в TODO листе, если бы не мобильное приложение Real Racing 3. Какое-то время я рубился в эти гоночки, и все было отлично, но в один прекрасный день я узрел на экране гигантский баннер, а потом охапку баннеров поменьше в разных местах. Этого я стерпеть не мог..
Но мне не хотелось ставить squid ради этого дела, я особо не исследовал, но там же, наверное, придется всем клиентам сети прокси настроить? Явно не мой путь.

Итак, дано: шлюз (роутер) под debian (с поднятым DNS bind9), XEN-виртуалка для веб-разработки (debian, с поднятым nginx).
Требуется: порезать рекламу на всем, что подключается к серверу дома, хоть по WiFi, хоть по проводу.

Достигнутый итог: нет рекламы в skype на десктопе и в телефоне, мобильных приложениях, браузере (AdBlock отключен).
А подробнее - далее.

Принцип затеи:
 - поскольку DNS-запросы сети обслуживает личный bind9, то настраиваем ему гору доменных рекламных зон так, чтобы они указывали на наш вебсервер
 - на вебсервере настраиваем vhost на отдельном IP и пусть отдает 204 заголовок (No Content)

Все. Теперь обращение любого приложения из сети за рекламой (например скайп лезет на rad.msn.com, но там еще нюансы есть, см.далее) пойдет через DNS-резолвинг на шлюзе, получит внутрисетевой адрес вебсервера (например 10.0.0.33) и полезет за рекламой туда, а там заготовленная дырка, которая либо отдает 204 No Content, либо empty_gif, как угодно.

BIND

Список "плохих" доменов в формате конфига bind можно получить тут: http://pgl.yoyo.org/adservers/

Также удобно скачать hosts-файл по прямой ссылке и через инструмент конвертации преобразовать в конфиг bind  - http://pgl.yoyo.org/adservers/hosts2bind.php
Удобно тем, что там можно задать путь к файлу зоны bind.
Конфиг кладется в bind, создается файл зоны (пример http://pgl.yoyo.org/adservers/null.zone.file), где вместо 127.0.0.1 пишется IP внутрисетевого вебсервера (10.0.0.33 например).

nginx

Почему IP отдельный? Чтобы знать, что все запросы к нему - это наши рекламные ловушки. Я прописал в XEN конфиге для виртуалки еще один сетевой интерфейс и создал в уже имеющемся nginx один vhost. Вот и вся канитель.

В nginx надо прописать этот отдельный IP для vhost, пример listen 10.0.0.33:80
Также для скайпа нужно слушать HTTPS, как оно все поднимается, это уже другая тема.
Мой конфиг:
server {
        listen  10.0.0.33:80;
        listen  10.0.0.33:443 ssl;

        ssl_protocols       SSLv3 TLSv1;
        ssl_certificate     /etc/nginx/ssl/cert.pem;
        ssl_certificate_key /etc/nginx/ssl/cert.key;

        server_name def103;

        access_log      /var/log/nginx/antiad.access.log main;
        location / {
                return 204; # no content
                #empty_gif;
        }
}
Теперь в логе antiad.access.log можно лицезреть поток говна, проходящего мимо ваших глаз.
Надо сказать список доменов не такой уж полный, мне пришлось поотлавливать руками и дописать еще с десяток доменов.
zone "marketgid.com" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "mg.yadro.ru" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "ad.ddestiny.ru" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "pf.media-storage.org" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "banerator.net" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "mg.dt00.net" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "rtb-media.ru" { type master; notify no; file "/etc/bind/db.antiad"; };
zone "betweendigital.com" { type master; notify no; file "/etc/bind/db.antiad"; };

Еще подобная тема: для отдельно взятого виндового компа можно скачать файл hosts, который решит ту же задачу в масштабах отдельного компа... я так думаю.. не проверял, признаться :) Полезно для ноутов: вне зависимости от того, через как ноут выходит в инет, у него всегда будет решена проблема с рекламой.
Ссыль на файл hosts - http://pgl.yoyo.org/adservers/serverlist.php?showintro=0;hostformat=hosts

SOLVED

Комментариев нет:

Отправить комментарий