Борьба с почтовыми троянами на маршрутизаторе в локальной сети ( FreeBSD )

У системного администратора, сопровождающего маршрутизатор офисной или домашней локальной сети рано или поздно появляется необходимость в борьбе с почтовым спамом, исходящим от заражённых троянами машин пользователей.

Долгое время я боролся с этим горем путём закрытия 25 исходящего порта для всех: просил всех пользоваться локальным smtp-сервером, а уже на нём производил анализ\фильтрацию.

Однако, для произвольно выбранного пользователя, как правило, перенастройка почтового клиента (даже по картинкам) – дело не одного часа, не одного нерва. И очевидно, что в итоге этот весь негатив выплёскивается на нас, администраторов.

Вот и решено было как-то от этого перманентного блокирования SMTP порта избавиться. Эта система анализа и блокировки SMTP сервисов для заражённых компьютеров – то, что на данный момент получилось. Здесь я опишу процесс её установки и настройки.

Для получения логов прошедшего трафика я воспользуюсь ipacctd. В ближайшей перспективе я планирую избавиться от этого коллектора (не хочется зависить от ещё одного демона), создав возможность анализировать логи ipfw и pf.

# whereis ipacctd
/usr/ports/net-mgmt/ipacctd
# cd /usr/ports/net-mgmt/ipacctd
# make install clean

Коллектор установлен. Запустим его (не забываем добавить строку вызова ipacctd в rc., дабы после перезагрузки не было головной боли.

# mkdir /var/log/utility
# /usr/local/sbin/ipacctd -p 666 -f /var/log/utility/spam.log -r /var/run/ipacctd.spam

Теперь можно смело направлять почтовый трафик демону ipacctd. Я делаю это, используя ipfw (divert) – в table(66) анализатор будет добавлять заблокированные хосты.

# ipfw add 1000 deny tcp from table\(66\) to any dst-port 25 recv ng\*
# ipfw add 1002 divert 666 tcp from any to any dst-port 25 recv ng\*

Теперь подготовим сам анализатор.

# wget http://www.purple.org.ua/wp-content/uploads/2009/09/mailblock.tar.gz
# mkdir /usr/local/utility
# tar -zxf mailblock.tar.gz -C /usr/local/utility
# touch /var/log/utility/spam_result.log

Теперь редактируем конфиг main.conf по своему вкусу.

Добавляем в crontab строчку для вызова (у меня отрабатывает раз в 5 минут – пока жалоб нет).

На этом всё. Для проверки работоспособности можно с пользовательского компьютера сделать что-нибудь вроде:

# telnet smtp.mail.ru 25 ^C telnet smtp.yandex.ru 25 ^C telnet smtp.rambler.ru 25 ^C

На этом настройка и проверка закончена. Если всё заработало, можно и насладиться первыми сообщениями о блокировке. А теперь можно go на всякие cbl.abuseat.org чистить свои реальные ip-адреса от претензий 🙂

If you found an error, highlight it and press Shift + Enter or click here to inform us.

20 Responses to Борьба с почтовыми троянами на маршрутизаторе в локальной сети ( FreeBSD )

  1. Марат says:

    Здравствуйте!
    Возникло пара вопросов.
    Как дальше уходят пакеты которые не были признаны спамом? Вернее как они возвращаются в обработку IPFW.
    Сработает ли данный скрипт без подключения к MySQL?
    Мы не используем VPN. У нас выдаються статические серые IP/

  2. @Марат
    Здравствуйте, Марат

    При использовании divert пакет возвращается в обработку файрволом на строку, следующую после divert
    Другое дело, если IP был заблокирован скриптом, то он хранится в table(66) и поэтому его “словит” deny, который описан выше divert (и обработка на divert уже не пойдёт)

    Без подключения к mysql этот скрипт и работает. Хранение данных о заблокированных адресах в файле.

    Без VPN нет никакой проблемы использовать. Просто интерфейс будет не ng* а нужный Вам (physical lan\vlan – не имеет значения)

    Спасибо Вам за вопрос.

    P.S.: Если у Вас возникнут сложности с адаптацией скрипта под Ваши нужды – обращайтесь. Это нормальная практика – помогаю в такого рода вопросах. Это не коммерция, а стремление к чему-то большому и светлому. 🙂

  3. Марат says:

    Спасибо большое начали тестировать ваш скрипт.
    Пока правда без забаненных.
    И плюс под свои нужды мы его переделали чуток тк у нас используються vlan.
    Буду добивать его в среду.
    Один вопрос: Зачем тогда подсоединение к базе биллинга?

  4. Я делал такой функционал для того, чтоб уведомления админстратору шли не с IP адресами, а с логинами пользователей. Так читабельнее.

    Но можно и не использовать. Всё равно ведь в интерфейсе биллинга поиск по адресу есть. 🙂

    Спасибо. Пишите.

  5. Марат says:

    То есть я правильно понял?
    Если скрипт не сможет найти базу мускула то он просто выведет IP?

  6. Марат says:

    Кстати. Ты писал что хочешь отвязаться от демона ipacctd? Это было сделано?

  7. @Марат
    Привет

    Такого поведения необходимо добиться. Просто отредактируйте скрипт – избавьтесь от mysql вызовов

    От ipacctd я так и не отказался. Это в процессе.

  8. Марат says:

    Скрипт отредактировал. Все запросы к mysql закоментил. Не пишет логов вообще.
    Что тут может быть? В кроне скрипт запускается.

  9. Работу ipacctd проверили? логи пишет?
    Можете доступ предоставить я гляну?
    skype: eugene.kovalenja

  10. Марат says:

    Спсибо разобрался!
    Другой вопрос: формат логов. Что значит ассоциативный массив (IP -> Число соединений).
    Первый IP от кого идет запрос второй куда? а вот следующие две цифры? количество соединений? Обе цифры?

  11. Какого конкретно лога?

  12. Марат says:

    %DATE%.spam.log

    10.0.79.18 58.8.111.97 144 3
    10.0.79.18 58.8.164.63 144 3
    10.0.97.122 64.12.139.193 168 4
    10.0.97.122 64.12.90.98 168 4
    10.0.79.18 80.26.212.123 144 3
    10.0.79.18 2.49.173.176 144 3
    10.0.97.122 65.55.92.184 385 8

    Вот этого

  13. vanvan says:

    Тема хороша (для тех кто хоть раз попадал в черные списки)
    У меня около 150 машинок так, что пока не сделал нечто подобное на ipacctd
    постоянно раз в 2 недели выковыривал себя из блэк листов

    Только я использовал не диверт а TEE
    Во первых нужна была надежность работы сервера
    Каждые 30 минут обрабатывал данные и если ловил (10 писем на разные айпи во внешнем мире с одного, то однозначно троян) И автоматом помещал в одно из правил
    ipfw блоктровки
    Ну и далее можно вообще потом изгаляться на мускуле на формирования отчетности
    на любой вкус
    Неплохо изложена идея у лисяры

  14. Анатолий says:

    Для блокировки спаммеров изнутри сети я делал гораздо проще
    Средствами PF делаем “ловушку” для IP, которые устанавливают более дозволенного количества коннектов на разные внешние IP. Все эти IP попадают в таблицу адресов, и эти адреса блокируются по 25-му порту. Таблицу можно чистить по крону или скриптом или вручную – на ваш вкус.

    кусок конфига PF:

    block drop in log quick inet proto tcp from to ! 192.168.11.1 port = smtp
    pass in quick inet proto tcp from to ! 192.168.11.1 port = smtp flags S/SA keep state (source-track rule, max-src-conn 10, max-src-conn-rate 8/20, overload flush, src.track 20)

    – таблица с адресами, которым дозволено ходить в интернет через NAT
    192.168.11.1 – свой почтовик, через него можно всегда отправлять, т.к. он проверяет отправителя по своим критериям.

    • Здравствуйте, Анатолий.

      Безусловно, это путь.
      Однако Ваш способ не позволяет в онлайн информировать службу техподдержки о “проблемных” пользователях (для того, чтоб техподдержка могла сообщать пользователю о вероятно вирусе и помогать устранить проблему).
      В случае интернет-провайдеров такая лояльность по отношению к абоненту – это шаг к их положительной оценке провайдера, что немаловажно (маркетинг с расходом 0.00? 🙂 )

  15. Анатолий says:

    Eugene L Kovalenja :
    Здравствуйте, Анатолий.
    Безусловно, это путь.
    Однако Ваш способ не позволяет в онлайн информировать службу техподдержки о «проблемных» пользователях (для того, чтоб техподдержка могла сообщать пользователю о вероятно вирусе и помогать устранить проблему).
    В случае интернет-провайдеров такая лояльность по отношению к абоненту – это шаг к их положительной оценке провайдера, что немаловажно (маркетинг с расходом 0.00? )

    Список заблокированных IP легко узнать
    gw# pfctl -t spammers -Ts
    192.168.11.199

    или разблокировать
    gw# pfctl -t spammers -Td 192.168.11.199
    1/1 addresses deleted.

    и далее любой обвес по вкусу нагородить. Я лишь указал на метод обнаружения и блокировки/разблокировки. А обвес в каждом конкретном случае свой.

  16. Окей. Другой случай:
    – обычно абонент == один компьютер
    – как быть с вашим примером в случае если провайдер подключил офис и для офиса порог отправляемых писем должен быть выше (несколько человек в офисе отправляют почту)? Дополнительное правило?

  17. andred says:

    Я только начинаю осваивать FreeBSD. Такой вопрос, как сделать это действие “Добавляем в crontab строчку для вызова (у меня отрабатывает раз в 5 минут – пока жалоб нет).”?

Leave a Reply