Детки подрастают, а в современной школе, по моим отцовским наблюдениям, гуглить приходится с первого класса. Учитывая возможности роутера выбор средств для фильтрации не велик:
- либо DNS-spoofing, отрезающий доступ к определённым доменам,
- либо URL\content-filtering, режущий html-контент по ключевым словам и\или релевантности.
Далее расскажу про реализацию обоих способов программными средствами, которые мы пока в разговорах обходили.
Первый способ менее ресурсоёмок, но режет более топорно. Простое "замыкание" нежелательного хоста на 127.0.0.1 записями в /etc/hosts заставляет браузер искать на локальном компьютере web-серврер и ждать от него ответа. Решение напрашивается довольно простое, наткнулся на него в ЖЖ: при разрешении доменного имени DNS-сервер на роутере должен мгновенно давать ответ NXDOMAIN, т.е. ответ о том, что домен не существует. Учитывая, что ОС\браузер кэширует ответы DNS-сервера (в т.ч. негативные), браузер не будет ожидать ответа от заблокированного домена ни при первом, ни при дальнейших обращениях. Под выполнение этих нужд заточен adsuck - DNS сервер, которому достаточно подсунуть свои hosts-файлы. Причём если записи будут содержать разрешение доменного имени на 127.0.0.1, то сервер будет давать ответ NXDOMAIN, если же ip-адрес в записи будет отличен от 127.0.0.1, то будет подставлен указанный ip-адрес. Так авторы adsuck предлагают опциональную защиту от подмены DNS-адреса для наиболее распространённых банковских и других "денежных" сайтов. На роутере adsuck можно использовать автономно, "придушив" DNS-сервис dnsmasq, либо совместно с dnsmasq. Детали расскажу позже, если они будут кому-то интересны. Мне было интересно узнать, как adsuck в связке с dnsmasq будет тормозить или ускорять загрузку web-страниц. В части ожидания разрешения DNS-имён по бенчмарку - никак. В части ускорения загрузки контента на канале в 20МБит/c субъективной разницы нет. Единственный минус - с помощью шквала DNS-запросов adsuck можно "завалить" так, что все его треды уйдут в <defunct>, а сам родительский процесс окажется через некоторое время в списках как zombie.
Ещё один интересный вариант DNS-спуфинга - это использование сторонних сервисов, самостоятельно ведущих списки нежелательных ресурсов. К примеру, сервис OpenDNS, которым пользуется каждая третья школа в штатах. Сервис в варианте Home бесплатен, и, насколько я понял, достаточно прописать в /etc/resolv.conf общедоступные DNS-серверы сервиса для того, чтобы сервис начал работать. Этот вариант я самостоятельно не проверял, если у кого-то есть более развёрнутая информация - поделитесь.
Варианты фильтрации контента по релевантности реализованы функционалом squid, privoxy и ещё рядом проксиков, включая DansGuardian, который рекомендован как СПО для использования в российском образовании. DansGuardian умеет отсевать контент по релевантности к эталонным "плохим" словам\фразам\картинкам, причём всё достаточно неплохо настраивается. В том числе, можно настраивать группы пользователей и применять к ним разную "силу" фильтрации. Всё это конечно здорово, но на роутере "летает" уже не так резво. Субъективно web-сёрфинг стал еле заментно подтормаживать, а фичу отсева "взрослых" картинок по цифровым подписям я вовсе не ощутил. Средства URL\content-фильтрации для роутера всё же тяжеловаты, но востребованы. Скажем, дома не десктопе в браузерах установлен всемогущий adBlock plus и все страницы выглядят красиво. Но на планшете после минуты созерцания странички на gismeteo.ru мои глаза начинают кровоточить - я уже успел позабыть о том, сколько там рекламы.
Последнее замечание: последствия добавления большого и чорного списка в /etc/hosts. Смотрим размер кучи памяти у dnsmasq без подгрузки доп.записей в /etc/hosts:
Code:
$ cat /proc/`pidof dnsmasq`/smaps | awk 'NR%8==1,NR%8==2'
...
00434000-00444000 rwxp 00434000 00:00 0 [heap]
Size: 64 kB
Перезапускаем dnsmasq, вгружая 130.000-строчный host-файл. Смотрим размер кучи:
Code:
$ wc -l /opt/etc/adsuck/Hosts.pub
130063 /opt/etc/adsuck/Hosts.pub
$ killall dnsmasq
$ dnsmasq --addn-hosts=/opt/etc/adsuck/Hosts.pub
$ cat /proc/`pidof dnsmasq`/smaps | awk 'NR%8==1,NR%8==2'
...
00434000-00cc8000 rwxp 00434000 00:00 0 [heap]
Size: 8784 kB
Приемлемо? И кстати, где надыбать качественный Hosts-файл для рунета? Желательно с вырезанием счётчиков\статистики.
ЗЫ Давайте опустим холивар по поводу дуализма брони и снаряда. Ясно, что proxy можно отключить, но ответной мерой можно завернуть весь TCP:80 трафик на прокси с помощью iptables. Ясно, что URL-filtering иногда можно обойти, вводя вместо доменного имени ip-адрес, или используя URL-encoding. Речь не об этом.
ЗЗЫ DansGuardian, adsuck, privoxy собраны для нового репозитория.