Это первая статья из серии статей по борьбе со всякой гадостью.

Итак, что же такое BFilter? BFilter — это фильтрующий прокси сервер. Изначально он разрабатывался только для удаления рекламных объявлений, но с тех пор его функционал был значительно расширен. В отличие от большинства подобных инструментов, он не полагается на черные списки (хотя и поддерживает их). Проблема с черными списками состоит в том, что рекламодатели всегда на один шаг вперед. Если рекламное объявление проходит через черные списки, то вы их просто обновляете, или в случае, если это не помогло, вы сами добавляете новое правило. BFilter обнаруживает рекламные объявления эвристическим методом, как это делается большинством современных антивирусных программ, позволяя обнаружить вирусы, даже если они изначально не находятся в базе данных антивируса.

Установка

# cd /usr/ports/net/bfilter
# make install clean

Опций установки нет. Но BFilter потянет за собой следующие пакеты ACE (не ниже версии 5.4), libsigc++ (версии 2.x.x) и zlib.

Настройка

Добавляем строчку в /etc/rc.conf:

bfilter_enable="YES"

Конфигурационные файлы хранятся в папке /usr/local/etc/bfilter/, разберемся с файлом config:

[global]
; Формат параметра: listen_address = хост:порт
; Где принимать запросы
; Пустой хост будет означать, что запросы будут приниматься на всех ip-адресах, принадлежащих системе
; Можно указать несколько адресов, разделяя их запятыми
; Например: listen_address = 192.168.0.1:8000, 10.0.0.1:9000
listen_address = 127.0.0.1:9000

; client_compression = yes | no
; Если активировано, то это значит, что все текстовые данные (Content-Type: text/*) будут
; сжаты перед тем как отдаваться клиенту
; Данная опция может быть полезна, если пользователи имеют малую пропускную способность, а
; bfilter имеет быстрое подключение. В любом другом случае, активация данной опции может
; добавить лишь дополнительную задержку в запросах.
client_compression = no

; ad_border = rrggbb | none
; По умолчанию, рисуются рамки вокруг удаленной рекламы.
; Можно поменять цвет рамки или вообще ее отключить.
ad_border = 676767

; page_cleanup = off | safe | maximum
; Позволяет удалять рекламу полностью, а не заменять ее каким-то изображением.
; Если параметр имеет значение "maximum", то он ухудшает точность удаления рекламы.
; Это означает, что могут удаляться лишние элементы на страницах.
; Если параметр имеет значение "safe", то это не ухудшает точность удаления рекламы,
; но часть рекламы может быть не удалена. Для такой рекламы все равно можно использовать параметр
; "ad_border = none", чтобы сделать рекламу невидимой (но на нее можно будет нажимать).
page_cleanup = safe

; tray_icon_animation = yes | no
; Включаем или выключаем анимацию в системном трее.
; Анимация будет говорить о том, что трафик идет через bfilter.
tray_icon_animation = no

; max_script_fetch_size = размер_в_кб
; Ограничиваем размер внешних скриптов, обрабатываемых bfilter.
; Большие скрипты обычно не используются для отображения рекламы.
max_script_fetch_size = 60

; max_script_eval_size = размер_в_кб
; Это просто защита против сжатых скриптов, которые в оригинале имеют большой размер.
max_script_eval_size = 180

; max_script_nest_level = число
; Задаем уровень вложенности скриптов.
; Более маленькое значение, например 3, сделает bfilter быстрее,
; а большее значение, например 9, позволит отлавливать больше рекламы. Автор bfilter
; никогда не видел рекламного объявления, которое было бы на уровне выше 6.
; Установка значения в 0, запретит вообще обработку скриптов.
max_script_nest_level = 6

; save_traffic_threshold = размер_в_кб
; Иногда bfilter должен загрузить изображение или флеш-файл, чтобы определить
; является ли это рекламой или нет. Т.к. bfilter пытается все это делать "на лету", то
; он обычно знает ответ еще ДО того как файл будет полностью загружен. Когда он определяет это, то
; он проверяет какой размер файла еще осталось загрузить, и если размер превышает
; данный параметр (или если размер неизвестен), то bfilter просто отменит загрузку, для
; экономии трафика. Значение по умолчанию должно подойти большинству пользователей, но
; если вы используете dialup или GPRS подключение, то можно понизить данное значение до 8...
; Хотя, если у вас очень быстрое подключение, то можно увеличить этот параметр до 40.
save_traffic_threshold = 15

; report_client_ip = yes | no | fixed_ip
; Добавляем заголовки X-Forwarded-For с ip-адресом пользователя.
report_client_ip = no

; allowed_tunnel_ports = порт1, порт2, от..до
; Ограничиваем порты для CONNECT запросов. Порты, разрешенные по умолчанию - 443 и 563,
; которые используются для https и nntps.
allowed_tunnel_ports = 443, 563

; cache_size = размер_в_мб
; BFilter может кешировать внешние скрипты, которые он получает для анализа.
; Этот параметр устанавливает размер кеша (в мегабайтах). Чтобы отключить кеширование,
; установите значение в 0
cache_size = 5
[/code]

Чтобы BFilter заработал совместно со Squid, в конфигурационном файле Squid /usr/local/etc/squid/squid.conf надо добавить следующие строчки:

[code lang="c" light="1"]
# куда обращаться, формат следюущий:
# cache_peer куда parent http-порт icp-порт разные_опции
# no-query и no-digest говорят, что не надо посылать никакие icp-запросы
cache_peer 127.0.0.1 parent 9000 0 no-query no-digest
# указываем, что никогда не посылаем запросы напрямую в интернет...
never_direct allow all

Используем списки AdBlock

Для начала скачиваем вот этот скрипт и вот этот. Помещаем их в директорию /usr/local/etc/bfilter/ и даем им право на выполнение:

# fetch http://www.convoglio.com/bfilter/adblock2bfilter.pl
# fetch http://www.convoglio.com/bfilter/bfilterUpdateLists.sh
# mv adblock2bfilter.pl /usr/local/etc/bfilter/
# mv bfilterUpdateLists.sh /usr/local/etc/bfilter/
# cd /usr/local/etc/bfilter/
# chown root:wheel adblock2bfilter.pl
# chown root:wheel bfilterUpdateLists.sh
# chmod 755 adblock2bfilter.pl
# chmod 755 bfilterUpdateLists.sh

Изменяемые параметры в файле adblock2bfilter.pl:

Блокировка — строгая. По умолчанию: ++++++
Блокировка — слабая. По умолчанию: +++
Исключение — строгое. По умолчанию: РАЗРЕШЕНО
Исключение — слабое. По умолчанию: —

В файле bfilterUpdateLists.sh меняем первую строчку на

#!/bin/sh

А так же меняем строчку, указывающие на расположение perl-скрипта и файла со списками AdBlock, а так добавляем параметр для wget, чтобы он загружал списки из указанного нами файла:

EASYLIST_URL="/usr/local/etc/bfilter/lists"
CONVERTER="/usr/local/etc/bfilter/adblock2bfilter.pl"
${WGET} -q -O – -i ${EASYLIST_URL} | ${CONVERTER} >${TEMP_FILE}

Теперь создаем файл со списками:

# touch /usr/local/etc/bfilter/lists

И наполняем его. Вот мое содержание файла lists:

http://ruadlist.googlecode.com/svn/trunk/adblock.txt
http://easylist.adblockplus.org/adblock_rick752.txt
http://nsis.narod.ru/clean_internet/aag.txt
http://nsis.narod.ru/clean_internet/aas.txt
http://nsis.narod.ru/clean_internet/ac.txt
http://nsis.narod.ru/clean_internet/ae.txt
http://nsis.narod.ru/clean_internet/ao.txt

Скрипт bfilterUpdateLists.sh копирует текущую версию списка Adblock Plus во временный файл, затем создает новую версию urls.local, используя cat для слияния этого файла с содержимым файла urls.local.save. Если у вас уже есть файл urls.local с образцами для фильтрации, то переименуйте его в urls.local.save.

Параметры для скрипта следующие:

Ссылка списка фильтров для скачивания. По умолчанию: http://easylist.adblockplus.org/adblock_rick752.txt
Файл с выводом. По умолчанию: /usr/local/etc/bfilter/urls.local
Ваш собственный файл с образцами для фильтрации. По умолчанию: /usr/local/etc/bfilter/urls.local.save
Временный файл. По умолчанию: /tmp/bfilterList.tmp
Путь до wget. По умолчанию: /usr/local/bin/wget
Путь до cat. По умолчанию: /bin/cat
Путь до перл-скрипта. По умолчанию: /usr/local/etc/bfilter/adblock2bfilter.pl
Путь до скрипта запуска bfilter. По умолчанию: /usr/local/etc/rc.d/bfilter

Ну и теперь добавляем в cron задачу для еженедельного обновления списков:

@weekly /usr/local/etc/bfilter/bfilterUpdateLists.sh

Ссылки

1. Официальный сайт BFilter (на английском)
2. Интеграция BFilter c AdBlock
3. Тут рассказывается как прикрутить ко всему этому еще и Ziproxy