Да-да. Именно так. Программы, позволяющие отсеивать рекламу используя интеллектуальные алгоритмы вместо чёрных списков существуют достаточно давно. Есть они и для Linux.
В этой заметке будет рассмотрена установка прозрачного прокси сервера, позволяющего отсеивать рекламу используя интеллектуальное распознавание рекламы вместо чёрных список адресов. Решение будет описано на базе системы Gentoo Linux и в его основе будет прокси-сервер bfilter.
Сначала несколько слов о преимуществах интеллектуального распознавания рекламы по сравнению с чёрными списками:
- При использовании чёрных списков вы всегда отстаёте на один шаг, добавляя в списки адреса уже показанной рекламы. Таким образом эффективность чёрных списков просто не может быть высокой. Заметно уступая эвристическим методам, которые позволяют ограничивать рекламу с любых адресов, в том числе и неизвестных, определяя её по ряду признаков.
- При достаточно большом трафике и разнообразии посещаемых сайтов чёрные списки имеют свойство занимать достаточно большие объёмы, соответственно проверка каждого адреса на принадлежность чёрному списку начинает занимать значительное время и нагрузка на прокси-сервер растёт.
Хорошими характеристиками и функционалом обладает прокси-сервер bfilter, который может работать и как системный демон, и как пользовательское приложение. В последнем случае он показывает свою иконку в системном лотке и имеет полноценный графический интерфейс для конфигурирования. Но такой способ подходит скорее для персонального использования и рассматриваться здесь не будет.
У bfilter есть два недостатка:
- Не поддерживются нормальные acl. Т.е. фактически он работает как анонимный прокси.
- Не поддерживается кэширование, которое было бы весьма полезным.
Для решения обеих этих проблем можно собрать каскад из двух прокси-серверов: bfilter и squid. Первый будет убирать рекламу, а второй управлять доступом пользователей и кэшировать запросы. Поскольку squid так же может работать в "прозрачном" режиме, то прокси можно установить не меняя настроек на клиентских машинах.
Итак. Приступим. Допустим что Gentoo Linux уже установлен на уровне базовой системы и в ядре включена поддержка iptables. Теперь установим bfilter, squid и iptables:
emerge bfilter squid iptables
Далее приступаем к настройке. Сначала настраиваем bfilter. По умолчанию он запускается в chroot-окружении, но не работает:) Для решения этой проблемы "достаём" его из chroot. Для этого в файле /etc/conf.d/bfilter заменяем строчку:
BFILTER_OPTS="-u bfilter -g bfilter -r /etc/bfilter"
На строку:
BFILTER_OPTS="-u bfilter -g bfilter"
Затем открываем в редакторе файл /etc/bfilter/config и правим следующим образом: меняем значение параметра "ad_border" на "none", т.е. отключаем отображение границ вырезаной рекламы (уж больно не эстетично они выглядят:)). Так же меняем значение параметра "page_cleanup" на "safe", чтобы не просто блокировать рекламу, но и по возможности вырезать её код, из кода загружаемых страниц. Здесь так же ещё возможно значение "maximum", но в этом случае возможны поломки кода, что нежелательно.
На этом настройка bfilter заканчивается и можно его запускать:
rc-update add bfilter default /etc/init.d/bfilter start
Переходим к настройке squid. Тут тоже нет ничего сложного. Открываем файл /etc/squid/squid.conf в редакторе и приступаем:) Во-первых указываем порт, на котором слушать:
http_port 3128 transparent
Параметр "transparent" пригодится при настройке прозрачного проксирования. Далее указываем что все запросы необходимо пересылать на bfilter:
cache_peer 127.0.0.1 parent 8080 0 no-query no-digest
Ну и на последок разрешим использование нашего прокси-сервера нашей же локальной сетью:
acl localnet src 192.168.100.0/255.255.255.0 http_access allow all localnet
Запускаем squid:
rc-update add squid default /etc/init.d/squid start
Практически всё готово. Осталось настроить правила iptables. Для этого создадим скрипт ~/firewall.sh следующего содержания:
#!/bin/sh # Сбрасываем цепочки правил iptables -F iptables -F -t nat # Устанавливаем политики по умолчанию: запрет входящих запросов и разрешение исходящих iptables -P INPUT DROP iptables -P OUTPUT ACCEPT # Разрешаем принимать ответы на запросы iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Полностью разрешаем весь трафик на loopback iptables -A INPUT -i lo -j ACCEPT # Разрешаем трафик со стороны локальной сети (она подключена интерфейсу eth1) iptables -A INPUT -s 192.168.100.0/255.255.255.0 -i eth1 -j ACCEPT # Все запросы на 80-й порт перенапрвляем на squid iptables -t nat -A PREROUTING -s 192.168.100.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128 # NAT для всех остальных запросов iptables -t nat -A POSTROUTING -s 192.168.100.0/255.255.255.0 -j MASQUERADE
Остаётся только применить эти правила:
rc-update add iptables boot /etc/init.d/iptables start ~/firewall.sh /etc/init.d/iptables save
Всё. Офис может спокойно вздохнуть, избавившись от потока рекламы и начав экономить на трафике:)
Автор не претендует на истинность всё написанного. Однако всё это было реализовано автором в реальных условиях и проблем замечено не было.
Shlomo 2007-11-26 21:15:33 (#)