Anton Yuzhaninov (ospf_ripe) wrote,
Anton Yuzhaninov
ospf_ripe

Category:

Фильтрация DNS запросов с помощью ng_ipfw+ng_bpf

Недавно настроил для ИКС фильтрацию DNS запросов по типу. Возможно этот опыт пригодится еще кому то. Аналогичным образом можно фильтровать не только DNS, но и любые пакеты по их содержимому, если условие можно выразить в виде понятном bpf. Сама статья лежит на citrin.ru, а здесь только пара слов о том, зачем и почему это было мне нужно.

То ли пользователи в своей массе глупеют, то ли программисты разрабатывающие трояны умнеют, но за последние полгода в ИКС резко увеличилось число машин на которых установлены трояны, используемые для рассылки спама и DDoS-аттак (и другой подобной деятельности).

Когда число зараженных машин (и скорость появления новых членов "ботнета") превысила разумные пределы было принято решение закрыть пользователям 25-й порт. Мера это крайняя, но она было вынуждена. А более мягкие решения, например, автоматическое выявление спам-ботов и блокировка 25-го порта только машин рассылающих спам, с возможностью снятия блокировки через веб-интерфейс, небольшой сети сети с маленьким бюджетом, просто не по карману.

После того как 25-й порт был закрыт, я думал, что о проблеме спамботов у пользователей ИКС можно будет забыть если не на всегда, то на долго.

Однако у них оказался побочный эффект. Несмотря на то, что рассылать спам у них уже не получается они по прежнему пытаются это делать. При этом посылают к ДНС серверу много запросов на MX-записи. Чем вызывают повышенную загрузку сервера (и в небольшой степени внешнего канала).

Отсюда возникло желание зафильтровать запросы на MX-записи. Честные пользователи страдать от этого не должны - им MX-записи не нужны. Даже если кто то отправлял почту через локальный MTA (таких не больше нескольких человек из тысячи), то после закрытия 25-го порта им пришлось прописать relayhost/smarthost. Так что MX-записи не нужны даже им.

Но оказалось это не так просто сделать сделать. Все же в итоге задача была решена с помощью связки ipfw+ng_ipfw+ng_bpf. О том как это можно сделать я написал небольшую заметку у себя на сайте.

Надо сказать, что задача отняла у меня сравнительно много времени (часа два тольк ушло на ручное составление bpf-программы) - в сумме часов 5 наверно (всё ни как не приучу себя учитывать потраченное время). И овчинка не стоила выделки - нагрузка на сервер от спамботов была не на столько большой чтобы довести сервер до состояния 0% idle, можно было было на них просто забить. Но мне давно хотелось разобраться с тем, как фильтровать пакеты по их содержимому с помощью bg_bpf и был хороший повод этим заняться :)

Заодно разобрался с тем как работает bpf и узнал про багу особенность работы libpcap когда она собрана с поддержкой IPv6: функция pcap_compile для DLT_RAW сначала проверяет каждый пакет как будто это пакет IPv6 (даже если на самом деле это IPv4), а потом проверяет как IPv4. И за этого под правило попадает большое пакетов чем нужно (хоть и с низкой вероятностью). Разработчики пишут, что в CVS это уже исправлено.
Tags: freebsd, netgraph, ng_bpf, ng_ipfw
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 9 comments