Чистим домашний интернет от очень назойливой рекламы (Ad's blocker для OpenWRT)



    Дело было вечером, делать было нечего... © С. В. Михалков
    Навеяно публикацией «Как я bind`ом вирусы искал…», а конкретно этой веткой комментариев. Надеюсь, не поздно размещаю.

    Сидел я и думал, телевизор Samsung, WinPhone, (а впоследствии может кофеварка и пылесос) показывают суперназойливую рекламу, надо с этим чтото делать, и раз в WinPhone и телевизор(кофеварку, пылесос) плагина AdBlock нету, то он должен быть там где ходит их трафик, на роутере.

    Оказалось ничего сложного тут нету, роутер у меня TP-Link 1043, с usb портом, флешка монтирована в /root, у кого флешки нет, можно использовать /tmp, замените пути.

    Для начала научим стандартный dnsmasq работать с внешним host файлом.
    В файле /etc/config/dhcp добавить строку:

    в секции 
    config dnsmasq
            list addnhosts '/root/hosts/adfree'
            list addnhosts '/root/hosts/unchanged'
    

    Файл /root/hosts/unchanged я использую для добавления собственных hosts правил, или которых нет в adfree.
    По пути /root/hosts/ создаем скриптик upd-adfree.sh который качает свежие списки adfree (ссылка которую использует android телефон) и модифицирует под вид hosts, затем перезагружает dnsmasq для того чтоб он прочитал новые файлы.

    ##adfree
    wget http://winhelp2002.mvps.org/hosts.txt -O adfree-tmp
    sed 's/^\(.*\).$/\1/' adfree-tmp > adfree
    
    ## dns restart to update
    /etc/init.d/dnsmasq restart
    

    И дать права на выполнение:

    chmod +x /root/hosts/upd-adfree.sh
    

    в файле /etc/crontabs/root добавить строку
    0 0 * * * /root/hosts/upd-adfree.sh

    Что означает запускать скрипт каждый день в 0:00.
    Активировать cron:

    /etc/init.d/cron enable
    

    Собственно, всё. Конечно блокируется не всё, не сравнить с AdBlockPlus в десктопный браузерах, для этого надо проксю ставить, но и нагрузка небольшая идет.

    Плюсы для меня: WinPhone не показывает рекламу в играх, девушке на компе не выскакивает видеореклама всяких 1000$ за сутки ничегонеделанья с какого то форума, который не работает если видит в плагинах adblock, ютуб на телевизоре не орет рекламу на весь дом.

    Минусы, обнаруженные мною: Некоторые сайты умеют определять adblock по размеру рекламных окон, такие будут возмущаться.

    Ну и по традиции ошибки прошу писать в личные сообщения, я их исправлю.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 48
    • 0
      Спасибо за пост.
      Буду пытаться сделать нечто подобное на моем старике Linksys wrt54gl.
      • +3
        Для ddwrt:
        1. Включить dnsmasq, local dns в Services
        2. Сохранить в Administration/Commands/Firewall:
        if test -s /tmp/hosts0
        then
            rm /tmp/hosts0
        fi
        
        wget -O - http://someonewhocares.org/hosts/zero/hosts >/tmp/hosts0
        grep addn-hosts /tmp/dnsmasq.conf || echo "addn-hosts=/tmp/hosts0" >>/tmp/dnsmasq.conf
        killall dnsmasq
        dnsmasq --conf-file=/tmp/dnsmasq.conf
        
        
        • 0
          Ссылка выдает 403, так что берите ту, что указана в посте
          • 0
            У меня работает
            • 0
              Действительно, с сервера проверил, все ок.
              Тогда это вероятно у меня что-то не так.
              • 0
                Страничка проверяет Referer, надо пустой отправлять.
        • 0
          Кому вообще лень заморачиваться, есть dns от яндекса. При чем, в нескольких вариантах.
          • 0
            А там же по моему порезанные все IP заблокированные роскомнадзором не? ;)
            Еще бы решить как на rt-n16 с олеговской сделать подобное с автопополнением, идея конечно понятна, нужно вот раскопать где это там ;)
            • +1
              … или поставить openwrt :-)
              на dir320 и wl500V2 у меня олеговские прошивки не вытягивали то, с чем хорошо справлялся еще openwrt10. Вот только например на tplink1043 не работает апаратный nating что не дает толком большой скорости, может и у rt-n16 какие проблемы…
              • 0
                хм, помню opewrt не все может, мне не удалось запустить например нормально на своем железе Multicast to HTTP Proxy, отключение вафли по времени и что то еще. Может конечно плохо искал или думал.
                • 0
                  Вот только например на tplink1043 не работает апаратный nating что не дает толком большой скорости

                  А вот про это можете подробнее? Сам использую TPLink 1043nd v1 c OpenWrt BarrierBreaker 14.07, скорость закачки торрентов, к примеру, аналогична стандартной прошивке. Чем мне может грозить отсутствие аппаратного nating, есть ли какие-то сравнения, подробности?
              • +1
                А как он поможет? Судя по описанию там только блокировка adult-рекламы.
              • 0
                А какой формат у /root/hosts/unchanged? Вида: 0.0.0.0 s.adframesrc.com, я правильно понял?
                • +1
                  да, собственно как файл hosts в системе.
                  к этому виду приводу и списки adfree по ссылке
                • 0
                  Утащил в избранное. Попробую провернуть подобное. Реклама достала уже
                  • +2
                    Еще несколько хостов со списком рекламы (выдрано из приложения adaway под андроид)

                    hosts-file.net/ad_servers.txt
                    adaway.org/hosts.txt
                    pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext

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

                    • +1
                      Сам использую томато / на асус н16

                      Проблема с хостс, то что нельзя применять wildcards и блокировать вес домейн.

                      Например, analytics от Adobe: 2o7.net, у него куча саб-домейнов, и все их в hosts муторно писать

                      Что нас спасёт? dnsmasq.conf

                      address=/2o7.net/127.0.0.1

                      с этих пор, любой DNS запрос с *.2о7.нет будет отдаваться как 127.0.0.1

                      • +1
                        Удваиваю, особенно стоит учесть такую директорию, как /etc/dnsmasq.d, откуда dnsmasq при включённой соответствующей опции подтягивает конфиги, добавляя их к основному. Стоит создать там файл — будет фильтрация по * и возможность лёгкого обновления скриптом.
                      • 0
                        файлик adfree-tmp можно и удалять, зачем лишний мусор?
                        • 0
                          А еще лучше качать этот файлик на /tmp/ ;-)
                          • 0
                            Или так :)

                            wget http://winhelp2002.mvps.org/hosts.txt -O - | sed 's/^\(.*\).$/\1/' adfree-tmp > /root/hosts/adfree
                            
                            • +1
                              С учетом всего вышесказанного правим /etc/config/dhcp
                              list addnhosts '/tmp/adfree'
                              и правим /root/hosts/upd-adfree.sh

                              ##adfree
                              wget http://winhelp2002.mvps.org/hosts.txt -O - | sed 's/^\(.*\).$/\1/' adfree-tmp > /tmp/adfree
                              ## dns restart to update
                              /etc/init.d/dnsmasq restart
                              


                              А в кроне я сделал раз в неделю, чаще обновлять смысла не вижу
                              0 1 * * 7 /root/hosts/upd-adfree.sh
                              Кстати вариант автора сохраняет результат скрипта в /root/, а не там как задуманно в /root/hosts/
                              • 0
                                и еще не забыть скрип в автозагрузку сунуть, чтоб при ребуте все поднялось, иначе в /tmp/ не будет списка блокируемых доменов
                                • +1
                                  вот это точно работает :)
                                  cd /tmp
                                  wget http://winhelp2002.mvps.org/hosts.txt -O adfree-tmp
                                  sed 's/^\(.*\).$/\1/' adfree-tmp > adfree
                                  rm -f adfree-tmp
                                  /etc/init.d/dnsmasq restart
                                  
                                  • 0
                                    Возможен ли сценарий что роутер повиснет если сервер вернет слишком большой файл?
                                    Жаль что у wget в openwrt нет флага ограничения на размер полученного файла.
                                    Кстати почему вы сразу не перенаправляете вывод wget на sed без использования промежуточного файла?
                                    • 0
                                      там файлик то всего чуть больше 500 кб, почему сервер должен возвратить большой файл? А по второму вопросу — работает и ладно, не жалко оперативки для временного файла.
                                      • +1
                                        Где-то читал про авиакатастрофу вызванную переполнением буфера. Поднимаешься на определенную высоту и хлоп, переполнение. Когда писали софт просто не рассчитывали что самолет сможет подняться на такую высоту. В недорогих моделях обычно 16-32мб, в дорогих — 128. Будет плохое настроение или плохое чувство юмора у владельца сервера и оставит он вас без связи.
                                        • 0
                                          это список из официального приложения для андроид AdFree. Не будут же они делать г*вно своим пользователям. А если сделают случайно или ошибочно, ничего страшного не произойдет, а вот репутация будет подмочена.
                                          • +1
                                            По user agent можно разный контент возвращать, для своего приложения одно, для вашего роутера другое.
                                            Знакомый вебмастер такое сделал когда заметил что картинки с нашего сайта используются на чужом сайте, заменил изображение чайником.
                                            Да и сильно-ли пострадала репутация этого Magic Lantern?
                                            • +1
                                              полгода работает, не жалуюсь. перестанет — найду другие способы. Или как в поговорке — «волков бояться — в инет не ходить» :)
                                  • 0
                                    А зачем в конце adfree-tmp оставили?
                                    А зачем рестартовать демона, когда можно просто sighup послать?

                                    wget http://winhelp2002.mvps.org/hosts.txt -O - | sed 's/^\(.*\).$/\1/' > /tmp/adfree
                                    killall -SIGHUP dnsmasq
                            • +1
                              в начало скрипта стоит добавить задержку на случайное время, чтобы сервер с файлом hosts не ронять

                              random1000=`dd if=/dev/urandom count=1 2>/dev/null | uuencode -m - | head -n 2 | tail -n 1| tr -cd 0-9 | head -c 3`
                              randomSec=`dc -e $random1000 -e '3600 * 1000/p'`
                              
                              sleep $randomSec
                              
                              • 0
                                В зависимости, от урезанности шелла, может быть в наличии такая переменная
                                echo $RANDOM
                              • 0
                                Обратный вопрос: А есть список сайтов с большим количеством рекламы? Хочется списки проверить :)
                                • 0
                                  Вот пара примеров ad-помоек — zaycev.net да allday2.com
                                • +3
                                  Уважаемые %habrapeople%, после прочтения поста в голове возник вопрос:

                                  «А что если вместо хостов dnsmasq для достижения аналогичного результата использовать таблицу статических DNS маршрутов на Mikrotik hAP lite (650MHz @ RAM 32 Mb)?»

                                  Блочить на уровне файрвола железки — не всё так просто, а держать прозрачный web-прокси для этого — решение, но только для http трафика.
                                  Для решения в настройках dhcp первым dns был прописан адрес маршрутизатора, подготовлены списки и переведены политкорректный для импорта формат:

                                  # Скачиваем списки, и аккуратно складываем их под именами ./hosts_list.1 , ./hosts_list.2 и т.д.
                                  $ src=('http://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext' 'https://adaway.org/hosts.txt'); i=0; for file in ${src[*]}; do i=$((i+1)); wget --no-check-certificate -O "./hosts_list.$i" "$file"; done;
                                  

                                  # Грепаем всё что начинается на '127.0.0.1 ', удаляем комменты, оставляем только имена доменов,
                                  # убираем дубликаты, убираем пустые строки, и оформляем каждый домен в виде команды для импорта
                                  $ in="./hosts_list.*" && out="./adblock_dns.rsc" && host='127.0.0.1'; echo "/ip dns static" > $out && grep '127.0.0.1 ' $in | grep -v '^#' | cut -d' ' -f 2 | sort -u | grep . | sed "s/^/add address=$host name=/" >> $out && rm -f $in; wc -l $out;
                                  

                                  Полученный файл adblock_dns.rsc был залит по ftp на железку, в шеле выполнено:
                                  # грохаем все имеющиеся записи в таблице статических DNS маршрутов
                                  /ip dns static remove [/ip dns static find]
                                  # Импортируем загруженный файл
                                  /import adblock_dns.rsc
                                  # Убираем за собой
                                  /file remove adblock_dns.rsc
                                  

                                  Итого у нас 2802 статических маршрутов на loopback в таблице (эмпирически доказано что при импортировании ~5500 записей — железка встает почти колом), после ребута и тестового прогона на пару часов имеем Free Memory 6.0 MiB, CPU Load 0..2%. Как автоматически выполнять аналогичную по смыслу операцию без использования дополнительной машины (только средствами самого микротика) по расписанию — ещё не придумал.

                                  Очень хотелось бы услышать мнения более опытных товарищей — на сколько таковое решение пригодно к жизни? На данный момент железка стоит дома, трафика ходит не много, активный серфинг возможен лишь с 2х устройств в одну единицу времени
                                  • +1
                                    Спасибо за скрипт. Автоматически — там же есть скрипты и расписание, правда переписать придется.
                                    Ну и /ip dns static remove делать тоже не очень хорошая идея — мало ли что у человека там может быть. У меня там немного, но важное.
                                    • +1
                                      Согласен, дроп имеющихся записей указал скорее по инерции после экспериментов. Кстати, не лишним будет к указанному выше списку добавить записи:

                                      s1.2mdn.net
                                      pubads.g.doubleclick.net
                                      static.doubleclick.net
                                      devads.skypeassets.net
                                      devapps.skype.net
                                      qawww.skypeassets.net
                                      qaapi.skype.net
                                      preads.skypeassets.net
                                      preapps.skype.net
                                      static.skypeassets.com
                                      serving.plexop.net
                                      preg.bforex.com
                                      ads1.msads.net
                                      flex.msn.com
                                      apps.skype.com
                                      api.skype.com
                                      cdn.mbstatic.org
                                      marathonbet.com
                                      megogo.net
                                      adselector.ru
                                      pluso.ru
                                      flash.begun.ru
                                      ad.adriver.ru
                                      

                                      Сказав рекламе в скайпе, youtube.com (лишь через браузер), и паре назойливых сервисов — до свидания :)
                                      • 0
                                        Кстати, по поводу скачивания файлов хостов — проблемы то нет:

                                        [admin@router] > /tool fetch url="https://adaway.org/hosts.txt" mode=https 
                                              status: finished
                                          downloaded: 13KiB-z pause]
                                               total: 13KiB
                                            duration: 0s
                                        
                                        [admin@router] > /file print                                              
                                         # NAME       TYPE       SIZE     CREATION-TIME       
                                         0 skins      directory           jan/01/1970 05:00:01
                                         1 hosts.txt  .txt file  13.2KiB  jul/24/2015 18:25:51
                                        

                                        Проблема в том, чтоб распарсить файл. Можно, конечно, если аппаратные средства позволяют — с помощью MetaRouter поднять хоть тот же dd-wrt и уже его средствами делать всю «магию». Но, как мне кажется, эффективнее бы для этих целей создать простенький веб-сервис для «нуждающихся», где в «личном кабинете» была бы возможность задать свои правила (которые необходимы в добавок к публичным) + некоторые подготовленные шаблоны (как со скайпом или рекламой на youtube, которые поддерживаются в актуальном виде).
                                        И формируя необходимого вида запрос — получать готовый скрипт импорта актуальных маршрутов, который бы обновлялся с заданной периодичностью. Делать для себя одного — слишком жирно будет, а для двух-трех гиков, которым данная идея покажется интересна — таки надо ли? :)
                                        • 0
                                          Имхо, веб-сервис — это слишком сложно. Да и приставка веб- тут явно лишняя — просто скрипт, можно даже тот же самый, что и выше, который запускается на сервере по крону и кладет результат в папку с фтп-доступом. Делов на полчаса.
                                          А логичнее(но сложнее) сделать тоже самое на скриптах микротика. А потом просто забить в шедулер:
                                      • +1
                                        Ковыряясь в свежей прошивке своего 951-го обнаружил, что он вполне себе понимает регэкспы в именах!

                                        [sarcasm]Традиционно для RouterOS как-то всё не очевидно[/sarcasm], но, по крайней мере, «звёздочка» в начале доменного имени работает:

                                        add address=127.0.0.1 name=".*liveadvert\\.com"
                                        add address=127.0.0.1 name=".*top.*\\.mail\\.ru"
                                        


                                        А это уже сильно уменьшает требуемый список.
                                        Сколько при этом отъестся CPU не скажу — на фоне моих 3-6% загрузки разницы не заметил
                                      • +1
                                        Похожий алгоритм, только больше хостов и опять же без рандомной задержки вначале скрипта — значит при массовом распространении сделают перегрузку серверу.
                                        • 0
                                          Задержка вызвана работой curl, а для того чтоб не было перегрузки сервера — результаты его работы кэшируются на, «по умолчанию» — 15 секунд. По текущий момент — полет нормальный
                                          • 0
                                            Каналья! Прошу прощения, ошибся топиком.
                                          • +1
                                            В итоге: кто и что из всех примеров испрользует и рекомендует?
                                            • 0
                                              Я ничего не менял после написания статьи, лень, а на роутерах у которых usb нет в cron прописываю вариант solalex
                                              • 0
                                                только немножко исправить строку консоли

                                                wget winhelp2002.mvps.org/hosts.txt -O /tmp/adfree-tmp && sed 's/^\(.*\).$/\1/' /tmp/adfree-tmp > /tmp/adfree && /etc/init.d/dnsmasq restart
                                            • 0
                                              Круто. Спасибо за мануал.

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