Поднятие spamd на FreeBSD 5 в связке с IPFW v1 (spam freebsd mail ipfw)

  	Была конкретная задача, поднять spamd на своем сервере, при этом уже использовался IPFW 1. Так как сервер стоял и работал достаточно
 исправно, то на него хотело ставить всего по минимуму.
 Все примеры которые встречались, были основаны на использовании PF.
 Оно и понятно. Spamd, так же как и PF был портирован с OpenBSD. Но мне хотелось использовать именно IPFW. На freebsd.org нашел, что spamd
 должен работать в том числе и только с IPFW без PF.
 Т.к. периодически качать списки адресов спамеров душила жаба, то остановился на использовании только серых списков.
 Ставилось из портов.
   # cd /usr/ports/mail/spamd/
 После долгих поисков нашел что для IPFW компилировать нужно так
   # make -DWITH_IPFW
 Из-за того что был IPFW 1, который не поддерживает таблицы,
 компилироваться оно отказывалось ругаясь:
   grey.c: In function `configure_pf':
   grey.c:189: error: syntax error before "ent"
   grey.c:201: error: `ent' undeclared (first use in this function)
   grey.c:201: error: (Each undeclared identifier is reported only once
   grey.c:201: error: for each function it appears in.)
   grey.c:202: error: `IP_FW_TABLE_FLUSH' undeclared (first use in this function)
   grey.c:216: error: `IP_FW_TABLE_ADD' undeclared (first use in this function)
· Error code 1
 Когда ставил с IPFW 2 во время работы оно ругалось:
   IPFW socket unavailable (Operation not permitted)
 Т.к. основная задача была чтобы работало, то было решено просто отключить места общения с фаерволом.
 Для этого содержимое функции configure_pf была изменена в следующих файлах:
   /usr/ports/mувail/spamd/work/spamd_3.7/spamd/grey.c (строка 186)
   /usr/ports/mail/spamd/work/spamd_3.7/spamd-setup/spamd-setup.c (строка 692)
 на
   return (0);
 Т.е. оставлена как заглушку. После изменений компилируем и сразу ставим
   # make -DWITH_IPFW install
 У меня почему-то новый пользователь не создался, пришлось создавать самому:
   # echo _spamd::::::Spamd Daemon:/nonexistent:nologin: | adduser -w random -f
 Для того чтобы spamd мог нормально работать создаем файл базы данных и разрешаем к нему доступ пользователю.
  # touch /var/db/spamd
  # chown _spamd:_spamd /var/db/spamd
 Для того чтобы spamd писал свои логи в отдельный файл через syslog добавляем в файл /etc/syslog.conf строки:
   !spamd
   *.* /var/log/spamd.log
 Создаем файл и перезапускаем syslogd:
   # touch /var/log/spamd.log
   # /etc/rc.d/syslogd restart
 И для ротации логов в файл /etc/newsyslog.conf добавляем:
   /var/log/spamd.log 640 5 100 * JC
 Для того чтобы spamd стартовал нужно в /etc/rc.conf добавить:
   pfspamd_enable="YES"
    pfspamd_flags="-v -g"
 Настраиваем файл конфигурации /usr/local/etc/spamd.conf. В связи с тем что я хотел использовать только серые списки, то у меня файл выглядит
 так:
   # cat /usr/local/etc/spamd.conf
   all:
   :blacklist:whitelist:
   blacklist:
   :black:
   :msg="SPAM. Blocked by me":
   :file=/usr/local/etc/spamd/blacklist.txt:
   whitelist:
   :white:
   :file=/usr/local/etc/spamd/whitelist.txt:
 Соответственно в один файл заносим то, что нужно пропускать сразу, а в другой, то что пропускать вообще не надо.
 В IPFW перед правилом разрешающим ходить почте на наш сервер, создаем правило перенаправления почтового трафика на spamd:
   ipfw add fwd 127.0.0.1,8025 tcp from any to me dst-port 25
 Т.к. у нас spamd получился без возможности общения с фаерволом, то мы разрешающие правила мы должны создавать сами. Для этого используем
 следующий скрипт:
   # cat /usr/data/script/spam_whitelist.sh
   #!/bin/sh
   ipfw_rulez=6030
   ipfw_rulez_skipto=6051
   ipfw_cmd="/sbin/ipfw add ${ipfw_rulez} skipto ${ipfw_rulez_skipto} tcp from "
   ipfw_cmd_end="to me 25"
   /sbin/ipfw delete ${ipfw_rulez} >/dev/null 2>&1
   for ip in `/usr/local/sbin/spamdb | /usr/bin/grep WHITE | /usr/bin/awk -F| '{ print $2; }'`; do
    ${ipfw_cmd} $ip ${ipfw_cmd_end} >/dev/null 2>&1
   done
 и вставляем его в /etc/crontab
   */5 * * * * root /usr/data/script/spam_whitelist.sh
 Соответственно нужно правильно выставить номера правил. ipfw_rulez - должно быть меньше номера правила перенаправления на spamd, а
  ipfw_rulez_skipto должно быть наоборот, больше номера правила перенаправления на spamd.
 Теперь можно пытаться запустить spamd:
   # /usr/local/etc/rc.d/pfspamd.sh start
 Смотреть результаты работы можно через лог-файл:
   # cat /var/log/spamd.log
 а так же через:
   /usr/local/sbin/spamdb
Обновлено: 12.03.2015