Для чего была написана эта статья - документации по установке и
настройке связки PF+spamd в интернете предостаточно, но при настройке
я столкнулся с некоторыми трудностями ввиду того, что детально процесс
не описан нигде. После парсинга огромного количества документации, всё
же была собрана нужная информация и соединена в единое целое - эта
статья описывает детальную пошаговую настройку с 100% результатом
успеха. В данный момент с помощью такой схемы уже трудится ряд боевых
серверов, которыми управляю я.
Что нам понадобится для того чтобы создать данную защиту - это сам
фаервол PF и спам демон spamd - оба они портированы из
OpenBSD. Будем считать, что вы уже безболезненно перешли с
FreeBSD=4.x на FreeBSD=5.x>6.x, так как поддержка PF в
четвёртой ветке весьма спорная. Поэтому описывать установку PF с
портов я не буду.
Для включения PF вам нужно будет указать следующие опции в ядре:
# Для включения PF добавляем данные опции в ядро:
# The pf packet filter consists of three devices:
# The `pf' device provides /dev/pf and the firewall code itself.
# The `pflog' device provides the pflog0 interface which logs packets.
# The `pfsync' device provides the pfsync0 interface used for
# synchronization of firewall state tables (over the net).
device pf # PF OpenBSD packet-filter firewall
device pflog # logging support interface for PF
device pfsync # Synchronization interface for PF
device carp # Common Address Redundancy Protocol
# Для включения поддержки шейпера через ALTQ добавим:
# altq(9). Enable the base part of the hooks with the ALTQ option.
# Individual disciplines must be built into the base system and can not be
# loaded as modules at this point. In order to build a SMP kernel you must
# also have the ALTQ_NOPCC option.
options ALTQ
options ALTQ_CBQ # Class Bases Queueing
options ALTQ_RED # Random Early Detection
options ALTQ_RIO # RED In/Out
options ALTQ_HFSC # Hierarchical Packet Scheduler
options ALTQ_CDNR # Traffic conditioner
options ALTQ_PRIQ # Priority Queueing
options ALTQ_NOPCC # Required for SMP build
Теперь когда PF поддерживается ядром, для его включения нам будет
достаточно добавить следующие строки в rc.conf:
pf_enable="YES" # Set to YES to enable packet filter (pf)
pf_rules="/etc/pf.rules" # rules definition file for pf
pf_program="/sbin/pfctl" # where the pfctl program lives
pf_flags="" # additional flags for pfctl
pflog_enable="YES" # Set to YES to enable packet filter logging
pflog_logfile="/var/log/pflog" # where pflogd should store the logfile
pflog_program="/sbin/pflogd" # where the pflogd program lives
pflog_flags="" # additional flags for pflogd
Таким образом мы получили работающий полнофункциоанальный фаервол с
возможностью шейпинга трафика через ALTQ и поддержкой протокола
CARP
Теперь когда PF у нас установлен, проведём установку spamd -
найти его можно в портах: /usr/ports/mail/spamd
Для компиляции и установки порта проведём ряд нехитрых команд:
localhost# cd /usr/ports/mail/spamd
localhost# make
localhost# make install
localhost# make clean
Теперь когда мы скомпилировали и установили spamd, создадим
устройство /dev/fd, необходимое для записи демоном данных в таблицы
PF, для это выполним следующую команду:
mount -t fdescfs fdescfs /dev/fd
И добавим в fstab вот эту строку, для автоматического монтирования
устройства при загрузке:
fdescfs /dev/fd fdescfs rw 0 0
Самое время посмотреть конфиг нашего демона, он находится в:
/usr/local/etc/spamd.conf, проведём необходимые изменения в нём, до
нужного нам уровня фильтрации и включения всех необходимых опций:
#
# $FreeBSD: /usr/local/etc/spamd.conf,v 1.1 2006/01/26 13:54:48 Z][ANSWER Exp $
# $OpenBSD: spamd.conf,v 1.12 2005/01/16 17:16:44 deraadt Exp $
#
# spamd config file, read by spamd-setup(8) for spamd(8)
#
# See spamd.conf(5)
#
# Configures whitelists and blacklists for spamd
#
# Strings follow getcap(3) convention escapes, other than you
# can have a bare colon (:) inside a quoted string and it
# will deal with it. See spamd-setup(8) for more details.
#
# "all" must be here, and defines the order in which lists are applied
# whitelists apply to the previous blacklist. more than one whitelist
# may be applied to each blacklist
#
# As of November 2004, a place to search for black lists is
# http://spamlinks.net/filter-bl.htm
#
# Some of the URLs below point to www.openbsd.org locations. Those
# files are likely to be mirrored to other OpenBSD www mirrors located
# around the world. Hence, it is possible to edit this file and rewrite
# www.openbsd.org with, for instance, to www.de.openbsd.org
all:
:spamhaus:spews1:spews2:china:korea:whitelist:blacklist:
# Mirrored from http://spfilter.openrbl.org/data/sbl/SBL.cidr.bz2
spamhaus:
:black:
:msg="SPAM. Your address %A is in the Spamhaus Block Listn
See http://www.spamhaus.org/sbl and
http://www.abuse.net/sbl.phtml?IP=%A for more details":
:method=http:
:file=www.openbsd.org/spamd/SBL.cidr.gz:
# Mirrored from http://www.spews.org/spews_list_level1.txt
spews1:
:black:
:msg="SPAM. Your address %A is in the spews level 1 databasen
See http://www.spews.org/ask.cgi?x=%A for more details":
:method=http:
:file=www.openbsd.org/spamd/spews_list_level1.txt.gz:
# Mirrored from http://www.spews.org/spews_list_level2.txt
spews2:
:black:
:msg="SPAM. Your address %A is in the spews level 2 databasen
See http://www.spews.org/ask.cgi?x=%A for more details":
:method=http:
:file=www.openbsd.org/spamd/spews_list_level2.txt.gz:
# Mirrored from http://www.okean.com/chinacidr.txt
china:
:black:
:msg="SPAM. Your address %A appears to be from Chinan
See http://www.okean.com/asianspamblocks.html for more details":
:method=http:
:file=www.openbsd.org/spamd/chinacidr.txt.gz:
# Mirrored from http://www.okean.com/koreacidr.txt
korea:
:black:
:msg="SPAM. Your address %A appears to be from Korean
See http://www.okean.com/asianspamblocks.html for more details":
:method=http:
:file=www.openbsd.org/spamd/koreacidr.txt.gz:
# Whitelists are done like this, and must be added to "all" after each
# blacklist from which you want the addresses in the whitelist removed.
#
whitelist:
:white:
:file=/var/spool/spamd/whitelist.txt
blacklist:
:black:
:msg="SPAM! Go fsck anyone else!":
:file=/var/spool/spamd/blacklist.txt
relaydb-black:
:black:
:msg="SPAM. Your address %A is in my relaydb list.":
:method=exec:
:file=relaydb -4lb:
relaydb-white:
:white:
:method=exec:
:file=relaydb -4lw:
blacklist:
:black:
:msg="SPAM! Go fsck anyone else!":
:file=/var/spool/spamd/blacklist.txt
Теперь, когда мы отредактировали конфиг и включили все необходимые
опции, нужно создать необходимые нам файлы, а это:
/var/spool/spamd/whitelist.txt и /var/spool/spamd/blacklist.txt, а
также файл, в котором будут храниться статические IP адреса нашей сети
/var/spool/spamd/whitelist, они не будут проходить проверки на спам.
А в наш whitelist мы напишем наши IP адреса которые не должны
проходить проверку через spamd:
192.168.1.2/24
Всё, конфиг демона spamd, нам уже больше не понадобится, поэтому
добавим следующие строки в наш rc.conf, для запуска демона:
pfspamd_enable="YES" # Set to Yes to enable spamd
pfspamd_flags="-v -g -G 5:4:864" # Extra flags passed to start command
Теперь включим в наш боевой комплекс ещё одну новую интересную
способность - это spamlogd демон позволяющий анализировать логи
pflogd, для его запуска мы напишем небольшой rc скриптик:
#!/bin/sh
#
# $FreeBSD: usr/local/etc/rc.d/pfspamlogd.sh.in,v 1.1 2006/05/24 18:44:28 Z][ANSWER Exp $
#
# PROVIDE: pfspamlogd
# REQUIRE: NETWORKING
# BEFORE: mail
# KEYWORD: shutdown
#
# Add the following lines to /etc/rc.conf to enable spamd:
# pfspamlogd_enable (bool): Set to "NO" by default.
# Set it to "YES" to enable spamd
# pfspamlogd_flags (str): Set to "" by default.
# Extra flags passed to start command.
. /etc/rc.subr
name="pfspamlogd"
rcvar=`set_rcvar`
command="/usr/local/libexec/spamlogd"
[ -z "$pfspamlogd_enable" ] && pfspamlogd_enable="NO"
[ -z "$pfspamlogd_flags" ] && pfspamlogd_flags=""
load_rc_config $name
run_rc_command "$1"
И добавим следующие строки в наш rc.conf, для запуска демона:
pfspamlogd_enable="YES" # Set to Yes to enable spamlogd
pfspamlogd_flags="" # Extra flags passed to start command
Осталось последнее, написать необходимые правила для фаервола, для
этого - отредактируем конфиг нашего PF, он находится по адресу:
/etc/pf.rules
Сначала мы создадим необходимые таблицы, в которые будут записываться
демоном нежелательные IP адреса, для в этого в секцию Tables добавим
вот эти строки:
В секцию NAT/RDR добавим следующие правила для редиректа почтового
трафика на наш демон:
# Redirect all connections to our smtp to spamd
no rdr on lo0 from any to any
rdr pass inet proto { tcp } from <spamd-whitelist> to $ins_ip port { smtp } -> $ins_ip port smtp
rdr pass inet proto { tcp } from <spamd> to port { smtp } -> lo0 port spamd
rdr pass inet proto { tcp } from !<spamd-white> to port { smtp } -> lo0 port spamd
А в секцию Packet Filtering добавим вот эти правила, разрешающие
конект к нашему почтовому демону:
# Allow incoming email
pass in log on $out_if inet proto { tcp } from any to $out_if port { smtp pop3 } keep state
pass in log on $ins_if inet proto { tcp } from any to $ins_ip port { smtp pop3 } keep state
Всё, остаётся теперь только выполнить запуск PF и spamd:
Мы можем также добавить в наш crontab запись, чтобы таблицы
пополнялись по расписанию автоматически через spamd-setup:
30 * * * * root /usr/local/sbin/spamd-setup
В случае, если мы хотим, чтобы логи велись спомощью syslogd, то
добавим вот эти строчки в /etc/syslogd.conf и не забудем создать
одноимённый файл в /var/log/:
И для ротации логов воспользуемся системой newsyslog, для этого
добавляем следующее в /etc/newsyslog.conf:
/var/log/spamd.log 664 7 100 * J
Ну вот и всё теперь можем лишь наслаждаться тем, как работает наш спам
демон, вот вывод его работы с помощью простой команды потокового
просмотра файлов в реальном времени tail:
localhost# tail -F /var/log/spamd.log
Jan 28 01:00:02 ns spamd[98534]: 64.174.136.165: connected (6/5)
Jan 28 01:00:09 ns spamd[98534]: (GREY) 64.174.136.165:
<barnes@connellco.com.> -> <tolyk@tolpa.net.>
Jan 28 01:00:09 ns spamd[98534]: 64.174.136.165: disconnected after 7
seconds.
Jan 28 01:00:13 ns spamd[98534]: 81.176.67.249: disconnected after 395
seconds. lists: spews1 spews2
Jan 28 01:00:13 ns spamd[98534]: (BLACK) 81.176.67.249:
<SoftoRooMTeaM@SoftoRooM.NeT.> -> <college@tolpa.net.>
Jan 28 01:00:21 ns spamd[98534]: (BLACK) 81.222.129.37:
<gluck@mail.subscribe.ru.> -> <varenik@tolpa.net.>
Jan 28 01:00:27 ns spamd[98534]: 81.176.67.249: disconnected after 395
seconds. lists: spews1 spews2
Jan 28 01:00:28 ns spamd[98534]: 81.176.67.249: connected (4/4),
lists: spews1 spews2
Jan 28 01:01:04 ns spamd[98534]: 195.5.21.129: connected (5/5), lists:
spews2
Jan 28 01:01:44 ns spamd[98534]: 206.161.124.227: connected (6/6),
lists: spews1 spews2
Jan 28 01:01:56 ns spamd[98534]: 81.176.67.249: To: college@tolpa.net
Jan 28 01:01:56 ns spamd[98534]: 81.176.67.249: Subject: Уведомление о
новых темах на подписанный форум ( From Твой софтовый форум! )
Jan 28 01:01:56 ns spamd[98534]: 81.176.67.249: From: "Твой софтовый
форум!" <SoftoRooMTeaM@SoftoRooM.NeT.>
Jan 28 01:02:05 ns spamd[98534]: 81.222.129.37: From: PEDROSOFT
<alex@kommuna.net.ua.>
Jan 28 01:02:05 ns spamd[98534]: 81.222.129.37: To:
"comp.soft.linux.discuss" <varenik@tolpa.net.> (6983212)
Jan 28 01:02:05 ns spamd[98534]: 81.222.129.37: Subject:
=?koi8-r?Q?=F5=D3=D4=C1=CE=CF=D7=CB=C1=20=D3=D4=C9=CC=C5=CA=20=D7=20?=
Jan 28 01:02:23 ns spamd[98534]: 81.30.160.9: connected (7/6)
Jan 28 01:02:23 ns spamd[98534]: (GREY) 81.30.160.9: <> ->
<pm@all.net.ua.>
Jan 28 01:02:23 ns spamd[98534]: 81.30.160.9: disconnected after 0
seconds.
Jan 28 01:02:31 ns spamd[98534]: 81.246.21.106: connected (7/6)
Jan 28 01:02:31 ns spamd[98534]: (GREY) 81.246.21.106:
<26amos@aastrom.com.> -> <topp@tolpa.net.>
Jan 28 01:02:31 ns spamd[98534]: 81.246.21.106: disconnected after 0
seconds.
Jan 28 01:02:41 ns spamd[98534]: 81.222.64.173: connected (7/7),
lists: spews1 spews2
Jan 28 01:03:14 ns spamd[98534]: 81.176.67.249: disconnected after 398
seconds. lists: spews1 spews2
Jan 28 01:03:15 ns spamd[98534]: 81.222.64.177: connected (7/7),
lists: spews1 spews2
Jan 28 01:03:22 ns spamd[98534]: 81.222.129.37: disconnected after 398
seconds. lists: spews1 spews2
Jan 28 01:03:38 ns spamd[98534]: (BLACK) 69.60.100.35:
<Temple.pxpp@dynamiccorporations.com.> -> <georg_gor@tolpa.net.>
В давершение всего сказано, есть прекрасная командачка для управления
spamd базой GREY LIST - это spamdb, вот вывод её работы на экран:
Вот собственно и всё, если что-то не понятно или вы считаете, что
какой-то момент освещён плохо или вообще у вас есть какие-то замечания
и исправления, пишите, пожалуйста. Буду рад услышать их и исправить
недочёты в данной статье.
Особая благодарность и мой респект уважаемым YO!zha & Uta, за помощь в
создание этой статьи..
With Best Regards,
SysAdmin ISP "Tolpa.neT" aka Z][ANSWER