Как стать автором
Обновить

Комментарии 49

Спасибо за пост.
Буду пытаться сделать нечто подобное на моем старике Linksys wrt54gl.
Для 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

Ссылка выдает 403, так что берите ту, что указана в посте
У меня работает
Страничка проверяет Referer, надо пустой отправлять.
Кому вообще лень заморачиваться, есть dns от яндекса. При чем, в нескольких вариантах.
А там же по моему порезанные все IP заблокированные роскомнадзором не? ;)
Еще бы решить как на rt-n16 с олеговской сделать подобное с автопополнением, идея конечно понятна, нужно вот раскопать где это там ;)
… или поставить openwrt :-)
на dir320 и wl500V2 у меня олеговские прошивки не вытягивали то, с чем хорошо справлялся еще openwrt10. Вот только например на tplink1043 не работает апаратный nating что не дает толком большой скорости, может и у rt-n16 какие проблемы…
хм, помню opewrt не все может, мне не удалось запустить например нормально на своем железе Multicast to HTTP Proxy, отключение вафли по времени и что то еще. Может конечно плохо искал или думал.
Вот только например на tplink1043 не работает апаратный nating что не дает толком большой скорости

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

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

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

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

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

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

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

address=/2o7.net/127.0.0.1

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

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

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

wget http://winhelp2002.mvps.org/hosts.txt -O - | sed 's/^\(.*\).$/\1/' > /tmp/adfree
killall -SIGHUP dnsmasq
в начало скрипта стоит добавить задержку на случайное время, чтобы сервер с файлом 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
В зависимости, от урезанности шелла, может быть в наличии такая переменная
echo $RANDOM
Обратный вопрос: А есть список сайтов с большим количеством рекламы? Хочется списки проверить :)
Вот пара примеров ad-помоек — zaycev.net да allday2.com
Уважаемые %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х устройств в одну единицу времени
Спасибо за скрипт. Автоматически — там же есть скрипты и расписание, правда переписать придется.
Ну и /ip dns static remove делать тоже не очень хорошая идея — мало ли что у человека там может быть. У меня там немного, но важное.
Согласен, дроп имеющихся записей указал скорее по инерции после экспериментов. Кстати, не лишним будет к указанному выше списку добавить записи:

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 (лишь через браузер), и паре назойливых сервисов — до свидания :)
Кстати, по поводу скачивания файлов хостов — проблемы то нет:

[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, которые поддерживаются в актуальном виде).
И формируя необходимого вида запрос — получать готовый скрипт импорта актуальных маршрутов, который бы обновлялся с заданной периодичностью. Делать для себя одного — слишком жирно будет, а для двух-трех гиков, которым данная идея покажется интересна — таки надо ли? :)
Имхо, веб-сервис — это слишком сложно. Да и приставка веб- тут явно лишняя — просто скрипт, можно даже тот же самый, что и выше, который запускается на сервере по крону и кладет результат в папку с фтп-доступом. Делов на полчаса.
А логичнее(но сложнее) сделать тоже самое на скриптах микротика. А потом просто забить в шедулер:
Ковыряясь в свежей прошивке своего 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% загрузки разницы не заметил
Похожий алгоритм, только больше хостов и опять же без рандомной задержки вначале скрипта — значит при массовом распространении сделают перегрузку серверу.
Задержка вызвана работой curl, а для того чтоб не было перегрузки сервера — результаты его работы кэшируются на, «по умолчанию» — 15 секунд. По текущий момент — полет нормальный
Каналья! Прошу прощения, ошибся топиком.
В итоге: кто и что из всех примеров испрользует и рекомендует?
только немножко исправить строку консоли

wget winhelp2002.mvps.org/hosts.txt -O /tmp/adfree-tmp && sed 's/^\(.*\).$/\1/' /tmp/adfree-tmp > /tmp/adfree && /etc/init.d/dnsmasq restart
НЛО прилетело и опубликовало эту надпись здесь
Так работает только для IPv4 адресов. У кучи рекламных сетей уже поднят IPv6 и он так нифига не блочится.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.