Четверг, 11 Апрель 2013 16:38

Настройка некоторых дополнений к почтовому шлюзу

Автор
Оцените материал
(7 голосов)

Не так давно, я на работе настроил почтовый шлюз для Зимбры. И о настройке этой я подробно описал вот тут:

http://technotrance.su/index.php/moi-stati/freebsd/item/23-mail-gateway-freebsd

Почтовый шлюз работает нормально, со своими задачами справляется. Однако понадобилось к нему прикрутить кое-что ещё:

1) Подключить резервный канал и настроить автопереключение с основного канала на резервный при сбое основного канала.

2) Прикрутить спамфильтр, поскольку Зимбра не очень хорошо справляется со спамом.

3) Настроить удалённый доступ к сети конторы через PPTP-подключение.

Самым хитрым, как выяснилось, оказалось настройка не этих трёх пунктов. Самым хитрым оказался ipfw, который нужно было настроить, чтобы он по прежнему обеспечивал NAT для сервера с Зимброй, проброс портов извне на сервер с Зимброй, доступ через PPTP и работу с двумя каналами интернет.

Собственно, приступлю по порядку. Сначала подключаю вторую сетевуху, прописываю ей ай-пишник в rc.conf и копирую в каталог /usr/home скрипт автопереключения. Про него я вот на днях заметку написал:

http://technotrance.su/index.php/moi-zametki/24-autoswitching-internet

Поэтому, копирую его от туда, подставляю свои значения и прописываю его в кроне. Вот тут надо отметить, что если просто добавить строчку в /etc/crontab, то скрипт срабатывать не будет. Поэтому, например, в каталоге /root создаём файл cron_changeroute и наполняем его вот таким содержимым:

SHELL=/bin/sh
PATH=/etc:/sbin:/bin:/usr/sbin:/usr/bin

0-59 * * * * /usr/home/change_route

где /usr/home/change_route – это скрипт автопереключения. Он будет запускаться каждую минуту. Потом выполняю команду:

crontab /root/cron_changeroute

Эта команда добавит задание для пользователя root. Проверить, что оно добавилось, можно командой:

crontab -l

Собственно, с автопереключением всё. Правила для ipfw я покажу в конце, когда уже будет настроен Spamassassin и PPTP-сервер.

Вторым делом настраиваю Spamassassin. Разобраться с ним мне было уже несложно, поскольку я уже имел дело настройкой спамассассина. Он у меня используется на домашнем сервере, и его установку и настройку я описывал вот в этой статье:

http://technotrance.su/index.php/moi-stati/freebsd/item/15-home-web-mail-ftp-server3

Поэтому, здесь я не буду повторяться о его установке и конфигурировании. Здесь я опишу именно настройку связки spamassassin + procmail + postfix. Ну, и ещё некоторые мелочи.
Одна из этих мелочей — это параметр trusted_networks в конфиге /usr/local/etc/mail/spamassassin/local.cf спамассассина. У меня он настроен вот так:

trusted_networks 127.0.0.1 192.168.199.101

где, напомню, 192.168.199.101 — это адрес Зимбры. Его я внёс в список доверительных, чтобы спамассассин не проверял исходящие письма с зимбера.

Также, я уделил внимание параметру rewrite_header:

rewrite_header Subject ----SPAM----

Объясняю, почему заменил звёздочки на чёрточки: дело в том, что в procmail я буду отсеивать письма, которые в названии темы содержат «----SPAM----». А как известно, в procmail условия задаются в виде регулярного выражения. А в регулярных выражениях звёздочка — это служебный символ, в то время, как чёрточка — нет. Поэтому, чтобы рег.выражение выглядело проще, то лучше использовать чёрточки в пометке спама.

Следующая тонкость заключается в том, что обращение к spamassassin происходит именно из procmail. А procmail у меня запускается под пользователем nobody. И когда происходит обращение к спамассассину, то он хочет создать файл /nonexistent/.spamassassin/user_prefs для каких-то своих служебных целей. /nonexistent — это домашний каталог пользователя nobody, которого нет в системе по умолчанию, поэтому создаю его и даю права:

mkdir /nonexistent && mkdir /nonexistent/.spamassassin && chown -R nobody:nobody /nonexistent

Теперь, что касается конфига /usr/local/etc/postfix/master.cf. Его я привёл вот в такой вид:

smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=procmail:
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
#628       inet  n       -       n       -       -       qmqpd
pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap     
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache
#
procmail unix - n n - - pipe flags=Rq user=nobody argv=/usr/local/bin/procmail -f SENDER=${sender} -t RECIPIENT=${recipient} -m /usr/local/etc/procmailrc
spamassassin unix - n n - - pipe user=spamd argv=/usr/local/bin/spamc -f -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}

Добавленные строчки выделил зелёным. Честно говоря, секцию в середине, наверно, можно было бы и не трогать, добавив лишь строчку внизу. Но, по крайней мере, хуже не стало от этого Улыбаюсь

Ну и подходим к развязке. Чтобы входящие письма проверялись на спам, а потом отсеивались, то в правилах procmail, в самый их верх, нужно добавить два вот таких правила:

:0fw
| /usr/local/bin/spamc

:0H
* ^.*----SPAM----.*$
/dev/null

Первое правило направляет письмо к спамассассину, а второе правило убивает письмо, если в его теме присутствует пометка ----SPAM----. В логе /usr/local/etc/postfix/procmail/procmail.log всё это дело будет наглядно отражаться вот в таком виде:

From SENDER=specialtyass7@narod.ru  Tue Apr 16 12:09:25 2013
 Subject: ----SPAM---- =?koi8-r?B?8PLl5Ozh5+Hl7SDw7yDk7/P09fDu+e0g4+Xu4e0sIPDv8
  Folder: /dev/null                                                        5844
From SENDER=specialtyass7@narod.ru  Tue Apr 16 12:09:27 2013
 Subject: ----SPAM---- =?koi8-r?B?8PLl5Ozh5+Hl7SDw7yDk7/P09fDu+e0g4+Xu4e0sIPDv8
  Folder: /dev/null                                                        5844
From SENDER=specialtyass7@narod.ru  Tue Apr 16 12:09:30 2013
 Subject: ----SPAM---- =?koi8-r?B?8PLl5Ozh5+Hl7SDw7yDk7/P09fDu+e0g4+Xu4e0sIPDv8
  Folder: /dev/null                                                        5844
From SENDER=specialtyass7@narod.ru  Tue Apr 16 12:09:33 2013
 Subject: ----SPAM---- =?koi8-r?B?8PLl5Ozh5+Hl7SDw7yDk7/P09fDu+e0g4+Xu4e0sIPDv8
  Folder: /dev/null                                                        5844
From SENDER=refuelling264@gmail.com  Tue Apr 16 12:09:35 2013
 Subject: ----SPAM---- =?koi8-r?B?8PLl5Ozh5+HgIPDvIOTv8/T18O757SDj5e7h7Swg8O/y7
  Folder: /dev/null                                                        5682
From SENDER=refuelling264@gmail.com  Tue Apr 16 12:09:38 2013
 Subject: ----SPAM---- =?koi8-r?B?8PLl5Ozh5+HgIPDvIOTv8/T18O757SDj5e7h7Swg8O/y7
  Folder: /dev/null                                                        5689
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:46 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null                                                        2331
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:48 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null                                                        2331
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:50 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null                                                        2331
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:52 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null                                                        2331
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:54 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null                                                        2331
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:56 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null                                                        2331
From SENDER=hotcake40@ya.ru  Tue Apr 16 12:09:58 2013
 Subject: ----SPAM---- =?koi8-r?B?19nTz8vP08vP0s/T1M7PyiDJztTF0s7F1CA=?=
  Folder: /dev/null

Поэтому, если у вас спама реально много, то обязательно следует настроить ротацию этого лога. Чтобы это сделать, надо в файл /etc/newsyslog.conf добавить вот такую строчку:

/usr/local/etc/postfix/procmail/procmail.log    nobody:mail    600    5    100    *   JC

Только, лучше использовать знак табуляции между параметрами. Вот и всё со спамассассином. Кстати, для него на фаерволе надо будет один порт открыть. Но к этому я вернусь ниже. 

Теперь, что касается PPTP-сервера. С ним тоже всё оказалось довольно просто. Завёлся он с пол пинка, и помогла в этом вот эта статья:

http://yurasik.org.ua/pptp-server-na-freebsd-mpd5

Сначала надо пересобрать ядро, добавив в него вот такие опции:

options NETGRAPH
options NETGRAPH_ASYNC
options NETGRAPH_BPF
options NETGRAPH_ECHO
options NETGRAPH_ETHER
options NETGRAPH_HOLE
options NETGRAPH_IFACE
options NETGRAPH_KSOCKET
options NETGRAPH_L2TP
options NETGRAPH_LMI
options NETGRAPH_MPPC_ENCRYPTION
options NETGRAPH_ONE2MANY
options NETGRAPH_PPP
options NETGRAPH_PPTPGRE
options NETGRAPH_RFC1490
options NETGRAPH_SOCKET
options NETGRAPH_TEE
options NETGRAPH_TTY
options NETGRAPH_UI
options NETGRAPH_VJC

Как пересобирать ядро, я описывал вот тут:

http://technotrance.su/index.php/moi-stati/freebsd/item/13-home-web-mail-ftp-server1

Там ничего сложного, на самом деле.
После сборки ядра, убедившись, что система с ним загрузилась корректно, обновляю порты:

portsnap fetch update

Затем устанавливаю MPD5:

cd /usr/ports/net/mpd5
make install clean

Опции сборки оставил по умолчанию.
После сборки mpd5, добавляю в /etc/rc.conf вот эти строчки:

mpd_enable="YES"
mpd_flags="-b"

Потом перехожу в каталог /usr/local/etc/mpd5 и вижу там файлы mpd.conf.sample, mpd.secret.sample и mpd.script.sample. Нас интересуют только первые два. Файл mpd.conf.sample копируем в этот же каталог с названием mpd.conf и открываем для редактирования. Как видно из содержимого этого файла, на mpd5 можно поднимать не только pptp-сервер, но и много других: тот же PPPoE например... Но мне нужен именно PPTP, поэтому я убираю из файла всё лишнее и оставляю лишь это:

startup:
        # configure mpd users
        set user foo bar admin
        set user foo1 bar1
        # configure the console
        set console self 127.0.0.1 5005
        set console open
        # configure the web server
        set web self 127.0.0.1 5006
        set web open


default:
        load pptp_server

pptp_server:
# Диапазон IP адрессов, котрые выдаются VPN клиентам
        set ippool add pool1 192.168.199.170 192.168.199.190
        
# Create clonable bundle template named B
        create bundle template B
        set iface enable proxy-arp
        set iface idle 1800
        set iface enable tcpmssfix
        set ipcp yes vjcomp
# Здесь указывается локальный адрес PPTP-сервера с маской
        set ipcp ranges 192.168.199.150/24 ippool pool1
        # тут указываем локальный DNS-сервер 
        set ipcp dns 192.168.199.100
        # а тут указываем NetBIOS-сервер, т.к. екоторые Microsoft PPP клиенты запрашивают информацию о нём
        set ipcp nbns 192.168.199.199
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
        set bundle enable compression
        set ccp yes mppc
        set mppc yes e40
        set mppc yes e128
        set mppc yes stateless

# Create clonable link template named L
        create link template L pptp
# Set bundle template to use
        set link action bundle B
# Multilink adds some overhead, but gives full 1500 MTU.
        set link enable multilink
        set link yes acfcomp protocomp
        set link no pap chap eap
        set link enable chap
# We can use use RADIUS authentication/accounting by including
# another config section with label 'radius'.
#       load radius
        set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation.
        set link mtu 1460
# Прослушивать pptp-соединения на всех адресах. Если же нужно слушать на каком-то одном
# адресе, то здесь надо явно задать этот адрес.
        set pptp self 0.0.0.0
# Allow to accept calls
        set link enable incoming

Сохраняем конфиг.
Потом, в этом же каталоге, копируем файл mpd.secret.sample с названием mpd.secret и открываем для редактирования. Убираем в нём всё лишнее и оставляем только:

User1	"password"
User2	"password"	192.168.199.171

Где User1 и User2 – это имена пользователей, password – пароли.
Так же можно задавать статические IP-адреса после password. Между пользователем, паролем и адресом разделение должно осуществляться без пробелов, а с помощью табуляции.

Теперь добавим логи mpd. в файле /etc/syslog.conf в конце добавляем следующие строки:

!mpd
*.* /var/log/mpd.log

Соответственно, создаём файл-пустышку для лога и назначаем права соответствующие:

touch /var/log/mpd.log
chmod 600 /var/log/mpd.log

Не забудем перезапустить syslog:

/etc/rc.d/syslogd reload

И вот теперь дело дошло до настройки IPFW. Значитс, у меня:

em0 – основной канал
em1 – резервный канал
re0 – локальная сеть
ng0, ng1, ng2, ng3, ng4, ng5 – интерфейсы, появляющиеся при pptp-подключении

Итак, вот какие правила я у себя прописал:

# сброс всех правил
-f flush

# разрешить любой доступ через интерфейс-петлю
add 00150 allow all from any to any via lo0

# здесь, в самом верху, я прописал правило для своего компа, чтоб с него доступ был превыше всего.
add 00151 allow all from 192.168.199.117 to any

# и вот важный момент. Четыре правила ниже определяют дальнейшее направление трафика
# в зависимости от того, что это за трафик. Первые две строчки – это правила для
# PPTP-соединения: они перекидывают трафик дальше к правилу 185, минуя все NATы.
# Третья строчка перекидывает весь трафик, проходящий через основной канал, ниже –
# на правило 163, где этот трафик дальше пойдёт в NAT для интерфейса em0.
# Ну а четвёртая строчка, аналогично третьей, перекидывает весь трафик, идущий через
# резервный канал, на правило 173, где этот трафик дальше пойдёт в NAT для резервного канала.
add 00155 skipto 00185 tcp from any to me 1723 via em0
add 00156 skipto 00185 tcp from any to me 1723 via em1
add 00157 skipto 00163 all from any to any via em0
add 00158 skipto 00173 all from any to any via em1


# NAT для основного канала – NAT для зимбера и проброс портов.
# В этих строчках указываются опции NATа, а также,
# какие порты и куда пробрасываем. Поскольку стоит deny_in, то нужно также указать,
# что порты 25 и 465 пробрасываются на сам почтовый шлюз.
# Опцию переноса строк "\" надо убрать, все должно быть в одну строчку:
nat 1 config if em0 reset same_ports deny_in \
\ redirect_port tcp 192.168.199.101:443 443 \
\ redirect_port tcp 192.168.199.101:80 80 \
\ redirect_port tcp <белый ip основного канала>:25 25 \
\ redirect_port tcp <белый ip основного>:465 465 \
\ redirect_port tcp 192.168.199.101:21 21 \
\ redirect_port tcp 192.168.199.101:5222-5223 5222-5223 \
\ redirect_port tcp 192.168.199.101:7070 7070 \
\ redirect_port tcp 192.168.199.101:7777 7777

# заворачиваем трафик в nat 1 (описание которого выше)
add 00163 nat 1 tcp from any to any via em0

# а это второй NAT для основного канала, чтобы проходил ping везде
nat 2 config if em0 reset same_ports

# заворачиваем трафик в nat 2 (описание которого строчкой выше)
add 000164 nat 2 icmp from any to any icmptypes 0,8 via em0

# NAT для резервного канала – аналогичный нату для основного канала,
# только для резервного интерфейса em1
nat 3 config if em1 reset same_ports deny_in \
\ redirect_port tcp 192.168.199.101:443 443 \
\ redirect_port tcp 192.168.199.101:80 80 \
\ redirect_port tcp <белый ip резервного канала>:25 25 \
\ redirect_port tcp <белый ip резервного канала>:465 465 \
\ redirect_port tcp 192.168.199.101:21 21 \
\ redirect_port tcp 192.168.199.101:5222-5223 5222-5223 \
\ redirect_port tcp 192.168.199.101:7070 7070 \
\ redirect_port tcp 192.168.199.101:7777 7777

# заворачиваем трафик резервного канала в nat 3 (описание которого выше)
add 00173 nat 3 tcp from any to any via em1

# а это второй NAT для резервного канала, чтобы проходил ping везде
nat 4 config if em1 reset same_ports

# заворачиваем трафик в nat 4 (описание которого строчкой выше)
add 000174 nat 4 icmp from any to any icmptypes 0,8 via em1

# разрешить любой исходящий трафик с сервера
add 00185 allow all from me to any

# разрешить прохождение пакетов со статусом 'установлен'
add 00195 allow tcp from any to any established

# разрешить весь icmp трафик
add 00200 allow icmp from any to any

# разрешить серверу обмениваться любым трификом с DNS-сервером
add 00250 allow all from 192.168.199.100 to me via re0

# открытые порты к серверу.
add 00260 allow tcp from any to me 25,465,1723 via em0
# udp порт 6277 нужен для службы DCC, которая помогает спамассассину разгребать спам
# более подробную инфу о ней можно легко нагуглить
add 00261 allow udp from any 6277 to me via em0
add 00262 allow tcp from any to me 25,465,1723 via em1
add 00263 allow udp from any 6277 to me via em1
add 00264 allow tcp from any to me 22,10000,25,465 via re0

# разрешить GRE-протокол. Нужен для работы PPTP
add 00283 pass gre from me to any via em0
add 00284 pass gre from any to me via em0
add 00285 pass gre from me to any via em1
add 00286 pass gre from any to me via em1

# правила ниже разрешают прохождение любого трафика через
# интерфейс локальной сети, который идёт от PPTP-интерфейсов ng0, ng1, ng2, ng3, ng4, ng5.
add 00291 pass all from any to any via ng0
add 00292 allow tcp from any to any recv ng0 via re0
add 00293 pass all from any to any via ng1
add 00294 allow tcp from any to any recv ng1 via re0
add 00295 pass all from any to any via ng2
add 00296 allow tcp from any to any recv ng2 via re0
add 00297 pass all from any to any via ng3
add 00298 allow tcp from any to any recv ng3 via re0
add 00299 pass all from any to any via ng4
add 00300 allow tcp from any to any recv ng4 via re0
add 00301 pass all from any to any via ng5
add 00302 allow tcp from any to any recv ng5 via re0

# разрешить любой трафик с зимброй
add 00371 allow all from 192.168.199.101 to any via re0
add 00372 allow all from any to 192.168.199.101 via re0

# Запретить всё остальное
add 10000 deny all from any to any

После открытия udp порта 6277 нужно выполнить команду:

cdcc "load /usr/local/dcc/map.txt"

Собственно, что мы получили такой настройкой фаервола:

1. NAT для зимбера как с основного канала, так и с резервного
2. Проброс портов извне для зимбера как через основной канал, так и через резервный. Правда, если основной канал в дауне, то извне придётся коннектиться именно через адрес резервного канала.
3. Сам сервер извне будет открыт только по tcp портам 25, 465 и 1723
4. Также к серверу открыт udp порт 6277 для Distributed Checksum Clearinghouses ( dcc ).
5. Обеспечено подключение по PPTP к серверу. PPTP-клиенту будет доступна локальная сеть. Также PPTP-подключение можно будет осуществлять и через резервный канал, но надо будет коннектиться именно на адрес резервного канала.
6. Из локалки, сам сервер будет доступен только портам 22,10000,25,465, кроме компа админа, сервера с зимброй и локального DNS-сервера – для них почтовый шлюз будет доступен полностью.

На этом всё. Не забудьте перезагрузить сервер, чтобы установленный Spamassassin и MPD начали корректно работать.

Прочитано 12077 раз Последнее изменение Суббота, 01 Ноябрь 2014 12:05

You have no rights to post comments

Вы здесь: Home Мои статьи FreeBSD Настройка некоторых дополнений к почтовому шлюзу