Поднятие spamd на FreeBSD 5 в связке с IPFW v1

Была конкретная задача, поднять 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

Статьи которые сильно помогли:

http://www.samag.ru/art/07.2005/07.2005_05.html

http://devnull.lt/misc/spamd_on_freebsd_4_with_ipfw

http://myforum.net.ua/index.php?showtopic=5843&pid=46782&st=0&#entry46782

Человек пытается портировать

http://www.mail-archive.com/freebsd-ipfw@freebsd.org/msg00904.html

Оригинал: http://ged.nnov.ru/text/freebsd/install_spamd_with_ipfw1.html

Обновлено: 12.03.2015