The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Использование OpenBSD spamd вместе с IPFW V2 в режиме грейлистинга. (spam spamd ipfw mail)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: spam, spamd, ipfw, mail,  (найти похожие документы)
From: Alex Samorukov <samm@os2.kiev.ua.> Newsgroups: email Date: Mon, 2 Feb 2007 14:31:37 +0000 (UTC) Subject: Использование OpenBSD spamd вместе с IPFW V2 в режиме грейлистинга. Количество спама в моём ящике стало невыносимо большим. Традиционные методы борьбы, такие как списки rbl, проверка валидности HELO, spf, spamassasin и подобные уловки стали менее эффективны (или просто спама стало больше?). Вобщем, решил я настроить грейлистинг. Так как на серверах используется FreeBSD, а делать решение зависимое от почтовика мне не хотелось - выбор пал на OpenBSD spamd Принцип работы spamd в режиме greylisting Демон spamd запускается и слушает tcp порт 8025. В Firewall стоит правило, разворачивающее все соединения пришедшие на порт 25 и не находящиеся в таблице whitelist на порт 8025 к spamd. Spamd, получив соединение, запоминает ip и адрес получателя/отправителя, после чего выдаёт сообщение о том, что сервис временно недоступен. Если при повторной попытке, произошедшей через указанное время, IP и адреса совпадут - заносим получателя в "белый" список на длительное время. Установка Казалось бы - что может быть тривиальнее чем установить BSD порт. "ничто не предвещало беды", как сказал бы диктор передачи 911. # cd /usr/ports/mail/spamd # make WITH_IPFW=you install clean WITH_IPFW обозначает "собрать с поддержкой IPFW". Дело в том, что на моих серверах используется IPFW и включать PF только ради spamd мне совершенно не хотелось. Пакет собрался и установился. Ура? Теперь самое время прописать правила для firewall в rc.firewall. Комментируем правило, разрешающее входящие соединения на 25 порт и вместо него пишем что-то вроде # bsd spamd rules set. Use table 9 and 10 fow white and black listing ${fwcmd} add fwd 127.0.0.1,8025 tcp from table\(10\) to me 25 in ${fwcmd} add allow tcp from table\(9\) to me 25 in ${fwcmd} add fwd 127.0.0.1,8025 tcp from any to me 25 in Таблицы 9 и 10 я выбрал потому, что таблицы 1-2, используемые по умолчанию, у меня уже используются для совсем других задач. Вот тут и начались первые проблемы. Утилита spamd-setup, которая заполняет таблицу "плохих" хостов на основе списков rbl при добавлении ключика -t падала с много обещающим сообщением "core dumped". GCC, gdb и send-pr - патч готов, едем дальше. Для того, чтобы логи писались "куда надо" добавляем в файл /etc/syslog.conf строки: !spamd daemon.err;daemon.warn;daemon.info /var/log/spamd и перезапускаем syslogd. Теперь прописываем в /etc/rc.conf pfspamd_enable="YES" pfspamd_flags="-t 9 -g -n bsd -v" pfspamd_setup_flags="-t 10" Как выяснилось - если на машине запущен spamd от SpamAssassin - BSD spamd просто не стартанёт. Дело в том, что стартовый rc скрипт считает, что демон уже запущен. Для исправления ситуации и добавления поддержки флагов в spamd-setup я сделал патч. Дальше - интереснее. После запуска spamd в логах стали появляться загадочные сообщения вида: spamd[3146]: IPFW socket unavailable (Operation not permitted) ps axu 3146 дал понять, что spamd пытается "работать" с ipfw под пользователем nobody. Так как для работы с BSD IPFW требуется тип сокета raw_sockets, доступный только супер-пользователю, система посылает его в сад-огород. Изучение исходников spamd показало, что он ищет системного пользователя _spamd и если не находит его - запускает детишек с правами nobody. Для решения проблемы я добавил в систему пользователя _spamd с uid 0 (естественно, без пароля и с shell nologin), перезапустив spamd. В это сложно поверить, но после стольких мучений оно заработало! "Процесс" вы можете отслеживать в spamd.log, а для управления списками очень удобно использовать утилиту spamdb. Злоключение. Хотелось бы пожелать автором портов проверять их работоспособность до отправки. Надеюсь, что эта заметка была полезной для читателя. Буду благодарен за дельные замечания и советы. Alex Samorukov, <samm@os2.kiev.ua.>

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Samm (?), 12:21, 02/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    И ещё немного. Оказалось, что утилита spamlogd, которая отвечает за продление white листинга для валидных IP также не работает без PF (точнее, /dev/pflogd0) и требует патчинга :-/
     
  • 1.2, Samm (?), 12:35, 02/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Правильный URL первого PR - http://www.freebsd.org/cgi/query-pr.cgi?pr=ports/108657
     
  • 1.3, Samm (?), 12:42, 02/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вот и третий PR на эту тему, пока без патча (буду рад помощи) http://www.freebsd.org/cgi/query-pr.cgi?pr=108679
     
     
  • 2.8, Vlad V. Teterya (?), 17:26, 03/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    ДД, Алекс
    С аналогичными граблями сталкивался при попытке экспериментировать со spamd (лечил грязными хаками, до PR руки не дошли, а мейнтейнер в личку не ответил). Портик ооочень сырой, так что если исправите грабли и заберёте порт после 2-х недель таймаута - Родина вас не забудет (если не пожалеете личного времени, конечно :)). Подумываю об альтернативах spamd (postgrey?)
     

  • 1.4, Zhukov Alexandr (?), 13:22, 02/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Спасибо за статью.
    Правда сам совсем недавно уже через это прошёл.
    А работает неплохо spamd.
     
     
  • 2.5, Samm (?), 13:25, 02/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Через работу с ipfw? а где PR? :)
    Кстати, Вам удалось запустить spamlogd?
     

  • 1.6, Yuri Khachaturyan (?), 17:06, 02/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    При запуске spamd-setup -t орет illegal option -- t

    Пытался запустить на FreeBSD-6.2, собирал все строго по доке со всеми указанными патчами.

     
     
  • 2.7, Samm (?), 17:12, 02/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >При запуске spamd-setup -t орет illegal option -- t
    >
    >Пытался запустить на FreeBSD-6.2, собирал все строго по доке со всеми указанными
    >патчами.


    Не думаю. Забыли WITH_IPFW=you :)

     
     
  • 3.9, GateKeeper (??), 09:25, 04/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Мне лишь интересно, откуда Вы такое значение откопали - "you"? Почитать Makefile, так там достаточно make -DWITH_IPFW, или более привычное WITH_IPFW=yes...
     
     
  • 4.10, Samm (?), 12:43, 04/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >Мне лишь интересно, откуда Вы такое значение откопали - "you"? Почитать Makefile,
    >так там достаточно make -DWITH_IPFW, или более привычное WITH_IPFW=yes...

    Йоу! "Почитав Makefile" :) Нет, это прекрасно, что вам "лишь это" интересно из всей статьи. Бывает же такое ) "Почитав Makefile" вполне понятно что ему совершенно индифирентно - you, yes или flooders_must_die.

     

  • 1.11, dark_stealth (?), 12:21, 05/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Во первых- автору респект.

    Во вторых- ничего не понимаю! Как в анекдоте "сколько не собирали велосипед- все равно танк выходит"
    # make -DWITH_IPFW (либо WITH_IPFW=yes ;) )
    при запуске spamd-setup
    # spamd-setup: illegal option -- t
    Все патчи наложены
    FreeBSD 5.4

     
  • 1.12, Yuri Khachaturyan (?), 13:10, 05/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Я же написал - собирал все строго по статье, ничего нигде не забыл. Мало того, пытался руками собрать с нужными флагами - не прокатывает =(
     
     
  • 2.13, Samm (?), 13:38, 05/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Ну чудес-то не бывает.
    1) Проверьте версию порта mail/spamd.
    2) Пришлите подробный лог сборки - глянем.
     
     
  • 3.19, Yuri Khachaturyan (?), 11:40, 07/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    1. Версия 3.7.2
    2. Сборка по make WITH_IPFW=you (-DIPFW выдает тоже самое):

    ===>  Extracting for spamd-3.7_2
    => MD5 Checksum OK for spamd_3.7.tar.bz2.
    => SHA256 Checksum OK for spamd_3.7.tar.bz2.
    ===>  Patching for spamd-3.7_2
    ===>  Applying FreeBSD patches for spamd-3.7_2
    ===>  Configuring for spamd-3.7_2
    ===>  Building for spamd-3.7_2
    ===> spamd (all)
    Warning: Object directory not changed from original /usr/ports/mail/spamd/work/spamd_3.7/spamd
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi  -c spamd.c
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi  -c sdl.c
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi  -c grey.c
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi   -o spamd spamd.o sdl.o grey.o
    gzip -cn spamd.8 > spamd.8.gz
    ===> spamd-setup (all)
    Warning: Object directory not changed from original /usr/ports/mail/spamd/work/spamd_3.7/spamd-setup
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi -D_NO_NAMESPACE_POLLUTION  -c spamd-setup.c
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi -D_NO_NAMESPACE_POLLUTION   -o spamd-setup spamd-setup.o -lz
    gzip -cn spamd-setup.8 > spamd-setup.8.gz
    ===> spamdb (all)
    Warning: Object directory not changed from original /usr/ports/mail/spamd/work/spamd_3.7/spamdb
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi -I/usr/ports/mail/spamd/work/spamd_3.7/spamdb/../spamd  -c spamdb.c
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi -I/usr/ports/mail/spamd/work/spamd_3.7/spamdb/../spamd   -o spamdb
    spamdb.o
    gzip -cn spamdb.8 > spamdb.8.gz
    ===> spamlogd (all)
    Warning: Object directory not changed from original /usr/ports/mail/spamd/work/spamd_3.7/spamlogd
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi -I/usr/ports/mail/spamd/work/spamd_3.7/spamlogd/../spamd  -c
    spamlogd.c
    cc -O2 -pipe  -Wall -Wstrict-prototypes -ansi -I/usr/ports/mail/spamd/work/spamd_3.7/spamlogd/../spamd   -o
    spamlogd spamlogd.o
    gzip -cn spamlogd.8 > spamlogd.8.gz

     

  • 1.14, Instruktor (?), 13:46, 05/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Чудно, что появилась эта статья. Респекты!
    Как раз собирался занятья этим вопросом.
    Кстати как быть с spamlogd ? Удалось что-то сделать?
     
     
  • 2.15, Samm (?), 14:28, 05/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >Чудно, что появилась эта статья. Респекты!
    >Как раз собирался занятья этим вопросом.
    >Кстати как быть с spamlogd ? Удалось что-то сделать?
    Пока нет. Проблема вот какая - spamd запускает tcpdump (более поздние версии - просто используют pcap()) на интерфейсе pflog, который создаёт PF. Суть проблемы в том, что там используется модификатор pass, который указывает на то, что трафик успешно прошёл через firewall. Снимать подобное с реального интерфейса бессмысленно, так как pcap на em0 будет работать _ДО_ IPFW. Пока я думаю, как можно это обойти.

    Варианты такие:
    1) переписать spamlogd как плагин syslog и запихнуть его в syslog.conf (я такой фокус сделал в bruteblock). А в IPFW добавить правило log до pass. Вариант мне не нравится тем, что будет куча флуда от ipfw и не будет работать при выключенном логе. Из плюсов - быстрая скорость реализации, простота (хуже воровства ;-)). Можно даже сделать в режиме тейла на /var/log/security
    2) Использовать divert сокеты и команду tee. Как по мне - вполне себе вариант. Минусы - я не работал с диверт сокетами и мне потребуется время чтобы переписать spamlogd для этой цели.
    Кроме того, диверт не везде вкомпилен, но это, думаю, не проблема.

    я думаю,. что если мейнтейнер не ответит - я заберу порт, обновлю его до latest cvs version (там много чего улучшили) и сделаю метапорты spamd-ipfw и spamd-pf. И в spamd-ipfw сделаю другой spamlogd. Если хватит времени, конечно. Помощь - приветствуется. как и идеи по поводу  spamlogd, возможно есть более простое и красивое решение.

     

  • 1.16, Andrey Y. Ostanovsky (?), 00:32, 06/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    http://www.binkd.spb.ru/howto/pfspamd_3.7.diff

    Я вот так курочил, но, поскольку в сях полный ноль - то ограничился косметическими правками. С pf - работает.

     
  • 1.17, RedRat (ok), 10:45, 06/02/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    На редкость полезная и своевременная статья!

    Будем надеяться, что автору в скором времени удастся победить spamlogd.

     
     
  • 2.18, Samm (?), 10:58, 06/02/2007 [^] [^^] [^^^] [ответить]  
  • +/
    >На редкость полезная и своевременная статья!
    Спасибо )
    >
    >Будем надеяться, что автору в скором времени удастся победить spamlogd.

    Победим. Главное - найти час времени на то, чтобы разобраться с divert сокетами )

     

  • 1.20, Александр (??), 02:33, 14/03/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Может я чего не понял, но spamd-setup сбрасывает таблицу перед загрузкой каждого списка из spamd.conf
    В итоге имеем последний список, остальное улетает.
     
  • 1.21, Aleksey (??), 18:13, 28/09/2007 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Столкнулся с такой проблемой:
    стоит spamd-4.1.2 якобы с полной поддержкой ipfw
    (бравда написано что это ещё всё же beta)
    всё прекрасно работает...некоторое время,
    потом в логе появляются такие сообщения:

    spamd[2042]: IPFW setsockopt(IP_FW_TABLE_ADD) (File exists)

    которые говорят о том, что spamd пытается добавлять в таблицу ipfw нечто уже существующее

    в результате сверяясь с базой и с таблицей ipfw
    обнаружил недостачу половины адресов помеченных как WHITE в /var/db/spamdb
    при попытке добавлять их вручную некоторые адреса снова исчезали и письма от "белых" адресов не прошли...
    вобщем, если кто-то сталкивался с этим или просто есть какие-то идеи, буду благодарен)

     
     
  • 2.22, Dewayne (?), 11:17, 25/11/2007 [^] [^^] [^^^] [ответить]  
  • +/
    Yes. I have worked on this for most of the day.  At best I can find
    14 entries in ipfw table 1; but 18 Whitelisted entries are reported
    from spamd -d -v.  

    I have no solution but will share as I must use this or decide on another option.

     
     
  • 3.23, Aleksey (??), 20:03, 27/11/2007 [^] [^^] [^^^] [ответить]  
  • +/
    I have solved this problem. Just comment return(-1) in grey.c(string 365).
    But then I have another problem:) The data base not refresh dinamicly!
    I have solved this problem by adding string to my cron tab to exec restart of spamd for example each three minutes, because it can't correct refresh db dinamicly, only when startup. Such are the crutches.
    Другмим словами здесь поможет только хирургическое вмешательство. Глубоко вникать в механизымы работы spamdb у меня не было времени, отделался этими кастылями:)
    Если кто-то разобрался, то честь ему и хвала, если он здесь напишет как.
     
     
  • 4.24, Vladimir (??), 10:47, 14/07/2008 [^] [^^] [^^^] [ответить]  
  • +/
    Вот такой наш ответ чемберлену:

    --- spamd/grey.c.orig       2008-07-14 00:20:22.000000000 +0500
    +++ spamd/grey.c    2008-07-14 11:18:48.000000000 +0500
    @@ -348,6 +348,7 @@
                syslog_r(LOG_INFO, &sdata, "IPFW setsockopt(IP_FW_TABLE_FLUSH) (%m)");
                if (debug)
                        fprintf(stderr, "IPFW setsockopt(IP_FW_TABLE_FLUSH) (%s)\n",strerror(errno));
    +           close(ipfw_socket);
                return(-1);
        }

    @@ -362,10 +363,12 @@
                if (setsockopt(ipfw_socket, IPPROTO_IP, IP_FW_TABLE_ADD,  &ent, sizeof(ent)) < 0)
                {
                        syslog_r(LOG_INFO, &sdata, "IPFW setsockopt(IP_FW_TABLE_ADD) (%m)");
    +                   close(ipfw_socket);
                        return(-1);
                }
        }

    +   close(ipfw_socket);
        return(0);
    }

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру