Настройка связки PF + spamd во FreeBSD

Для чего была написана эта статья - документации по установке и настройке связки 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 List

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 database

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 database

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 China

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 Korea

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, они не будут проходить проверки на спам.

Для это выполняем следующие команды:

localhost# touch /var/spool/spamd/whitelist.txt

localhost# touch /var/spool/spamd/blacklist.txt

localhost# touch /var/spool/spamd/whitelist

В наш whitelist.txt мы добавим следующую строку:

all:

:spamhaus:spews1:spews2:china:korea:whitelist:blacklist:

А в наш 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 добавим вот эти строки:

# Tables for spamd

table <spamd> persist

table <spamd-white> persist

table <spamd-whitelist> persist file "/var/spool/spamd/whitelist"

В секцию 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:

localhost# pfctl -e

localhost# pfctl -f /etc/pf.rules

localhost# /usr/local/etc/rc.d/pfspamd.sh start

localhost# /usr/local/etc/rc.d/pfspamlogd.sh start

localhost# spamd-setup -d

Мы можем также добавить в наш crontab запись, чтобы таблицы пополнялись по расписанию автоматически через spamd-setup:

30 * * * * root /usr/local/sbin/spamd-setup

В случае, если мы хотим, чтобы логи велись спомощью syslogd, то добавим вот эти строчки в /etc/syslogd.conf и не забудем создать одноимённый файл в /var/log/:

!spamd

daemon.err;daemon.warn;daemon.info /var/log/spamd.log

localhost# touch /var/log/spamd.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, вот вывод её работы на экран:

localhost# spamdb

GREY|12.129.219.97|<Eva.Bertalan@lionbridge.com.>|<alex_lysenko@all.net.ua.>|11484

86568|1148500968|1148500968|1|0

GREY|148.221.124.62|<everitt@hsuchi.net.>|<alex@tolpa.net.>|1148484466|1

148498866|

1148498866|1|0

GREY|151.49.99.22|<beta@otakumail.com.>|<alex@tolpa.net.>|1148485328|114

8499728|11

48499728|1|0

WHITE|160.79.37.121|||1148484080|1148484500|1151594950|3|0

WHITE|193.110.72.1|||1148484089|1148485948|1151596391|2|0

GREY|193.252.22.26|<ztrgek@rsc-aachen.de.>|<sven@tolpa.net.>|1148486045|

1148500445

|1148500445|1|0

GREY|193.252.23.69|<stella.santos@juno.com.>|<yavi@all.net.ua.>|11484854

53|1148499

853|1148499853|1|0

WHITE|194.67.45.222|||1148484457|1148485231|1151595671|3|0

WHITE|195.184.209.238|||1148484213|1148484809|1151595250|2|0

GREY|195.184.218.30|<diaf@fnra.com.>|<ne9@all.net.ua.>|1148485122|114849

9522|11484

99522|2|0

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

Особая благодарность и мой респект уважаемым YO!zha & Uta, за помощь в создание этой статьи..

With Best Regards,

SysAdmin ISP "Tolpa.neT" aka Z][ANSWER

Обновлено: 12.03.2015