Не так давно, я на работе настроил почтовый шлюз для Зимбры. И о настройке этой я подробно описал вот тут:
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 начали корректно работать.
Донаты принимаются на кошельки:
Yoomoney:
4100118091867315
Карта Т-Банк (бывший Тиньков):
2200 7017 2612 2077
Карта Альфа-Банк:
2200 1539 1357 2013