Собственно, в этой статье я опишу настройку почтового шлюза для Зимбры, но уже не на Fedora, а на FreeBSD. На линуксе настройку такого же почтового шлюза я рассматривал вот тут:
Собственно говоря, первый этап, на котором осуществляется вся первичная настройка сервера, мною уже описан вот тут:
http://technotrance.su/index.php/moi-stati/freebsd/item/13-home-web-mail-ftp-server1
Поэтому, установку, тюнинг ядра, русификацию и т.д. делаем точно также, как указано в ссылке выше. Правда сейчас я уже выполнял установку 9.1-RELEASE, но в ней всё делается точно также, как и в 9.0-RELEASE. Единственное отличие, которое надо будет учесть для настройки почтового шлюза – это опции включения фаервола в ядре. Их надо сделать вот такими:
# включить фаервол
options IPFIREWALL
# делать логи пакетов, для которых в правилах есть опция 'log'
options IPFIREWALL_VERBOSE
# Ограничение повторяющихся логов на случай атак типа флудинга.
options IPFIREWALL_VERBOSE_LIMIT=50
# включение перенаправления (проброса) пакетов.
options IPFIREWALL_FORWARD
# включение возможности NAT
options IPFIREWALL_NAT
options LIBALIAS
# Включение возможности ограничивать скорость трафика.
options DUMMYNET
options ROUTETABLES=2
options HZ="1000"
После установки системы и базовой её настройки ставим postfix. Этот вопрос я тоже уже рассматривал вот в этой своей статье:
http://technotrance.su/index.php/moi-stati/freebsd/item/15-home-web-mail-ftp-server3
Там, в самом начале, как раз и описывается установка postfix. Здесь же, опции сборки будут отличаться лишь тем, что dovecot нам не нужен:
А остальное всё делаем также, вплоть до настроек файла /etc/rc.conf:
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
postfix_enable="YES"
Перезагружаем сервер после этого.
Вот теперь приступим к конфигурированию. Сразу определимся, что у меня в системе стоит две сетевухи. Первая em0 подключена к интернету и имеет белый адрес. На этот белый адрес у меня уже зарегистрированы несколько доменов второго уровня и к ним имеются MX- и PTR-записи. И пусть они называются mydomain.ru, mydomain1.ru, mydomain2.ru, mydomain3.ru. Ну, а сетевая карта re0 подключена к локальной сети и пусть имеет адрес 192.168.199.150.
Найдём файл /usr/local/etc/postfix/main.cf и отредактируем в нём некоторые строчки. Показываю лишь те, что я редактировал, остальное же не трогаем ничего:
# имя хоста почтового шлюза. Это имя будет использоваться в течении сессии ehlo/helo smtp:
myhostname = mydomain.ru
# наш домен
mydomain = mydomain.ru
# подставляется к адресу отправителя или получателя если он указан не полностью.
myorigin = $myhostname
# сетевые интерфейсы, с которыми может работать postfix
inet_interfaces = all
# Задаём имена доменов, для которых мы будем принимать почту. В моём случае, их несколько разных.
mydestination = $myhostname, localhost, mydomain1.ru, mydomain2.ru, mydomain3.ru
# Так как на шлюзе требуется только пересылка почты, отключаем локальную доставку сообщений
local_recipient_maps =
mynetworks_style = host
# сети, которым разрешено выполнять пересылку через данный сервер. Обычно сюда включают
# только внутреннюю локальную сеть, или вообще только IP внутреннего почтового сервера.
# В нашем случае, это сервер с зимброй.
mynetworks = 192.168.199.101, 127.0.0.1
# в данной директиве определяем домены, для которых необходимо принимать почту.
relay_domains = $mydestination
# В самый конец конфига добавляем ещё одну строчку. В этом файле мы укажем хост с зимброй,
# на который надо доставлять сообщения для доменов mydomain.ru, mydomain1.ru, mydomain2.ru, mydomain3.ru
transport_maps = hash:/usr/local/etc/postfix/transport
Сохраняем этот конфиг. Затем, создаём файл /usr/local/etc/postfix/transport и наполняем его вот таким содержимым:
mydomain.ru smtp:[192.168.199.101]
mydomain1.ru smtp:[192.168.199.101]
mydomain2.ru smtp:[192.168.199.101]
mydomain3.ru smtp:[192.168.199.101]
Сохраним и выполним команду:
postmap hash:/usr/local/etc/postfix/transport
затем перезапускаем postfix:
service postfix restart
Теперь, что касается настроек зимбры. В настройках первого сервера делаем также, как на этом скриншоте:
Только в список доверенных сетей агента передачи данных добавим ещё и наш почтовый шлюз. Вот такой этот список должен быть:
127.0.0.1/8 192.168.199.101/32 192.168.199.150/32
Собственно, после этого, связка зимбра+почтовый шлюз должна уже заработать. Но поскольку я на почтовый шлюз хочу прикрутить ещё и procmail, то, в моём случае, конфигурирование ещё не заканчивается. Ставлю procmail:
cd /usr/ports/mail/procmail
make install clean
Затем, настроим постфикс на работу с procmail. В конфиге постфикса /usr/local/etc/postfix/main.cf находим строчку:
# mailbox_command = /some/where/procmail
и правим её вот так:
mailbox_command = /usr/local/bin/procmail
Затем, найдём строчку:
# mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
И исправим её на:
mailbox_transport = procmail
либо просто додавляем эту строчку ниже.
А ещё, после неё, добавим вот эту строчку:
procmail_destination_recipient_limit = 1
Это чтобы procmail разбивал массовую рассылку письма на отдельные письма.
Сохраняем и идём редактировать следующий файл /usr/local/etc/postfix/master.cf. В нём в самом начале находим строчку:
smtp inet n - n - - smtpd
и прямо под ней добавляем новую строчку (впереди строчки три пробела):
-o content_filter=procmail:
и в самый конец файла добавляем строчку:
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
Сохраняем. Вкратце, мы всем этим сделали следующее: указали постфиксу на почтовый фильтр procmail, указали что procmail будет использоваться в качестве транспорта и в файле master.cf этот самый транспорт и прописали.
Теперь создаём файл /usr/local/etc/procmailrc и наполняем его вот таким содержимым:
MAILDIR=/usr/local/etc/postfix/procmail
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/procmail.lock
SHELL=/bin/sh
# тремя строчками выше мы задали необходимые переменные
# а ниже мы прописали правила, которые позволят пропускать почту,
# адресуемую на @mydomain.ru, @mydomain1.ru, @mydomain2.ru, @mydomain3.ru и почту и обратно.
:0H
* ^.*@mydomain\.ru.*$
! $RECIPIENT
:0H
* ^.*@mydomain1\.ru.*$
! $RECIPIENT
:0H
* ^.*@mydomain2\.ru.*$
! $RECIPIENT
:0H
* ^.*@mydomain3\.ru.*$
! $RECIPIENT
# последнее правило будет уничтожать всё остальное.
:0
/dev/null
Это пока самые простейшие правила для доменов. В дальнейшем их можно будет плодить сколь угодно всяких разных.
Не забываем создать каталог /usr/local/etc/postfix/procmail и назначить на него права:
mkdir /usr/local/etc/postfix/procmail
chown nobody:mail /usr/local/etc/postfix/procmail
chmod 770 /usr/local/etc/postfix/procmail
Далее, мне бы хотелось прикрутить шифрование к почтовому шлюзу. Для этого, в конец файла /usr/local/etc/postfix/main.cf добавляем строчки:
smtp_use_tls = yes
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_cert_file = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_CAfile = /usr/local/etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom
и создаём самоподписанный доверенный сертификат. Находясь в каталоге /usr/local/etc/postfix, необходимо выполнить команду:
openssl req -new -nodes -x509 -out smtpd.pem -keyout smtpd.pem -days 9999
На задаваемые вопросы отвечаем примерно так:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Sverdlovskaya
Locality Name (eg, city) []:EKB
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Office
Organizational Unit Name (eg, section) []:noname
Common Name (eg, YOUR name) []:mydomain.ru
Email Address []:yourmail@mydomain.ru
Самым важным параметром является значение Common Name — оно должно совпадать с FQDN сервера.
Ещё в конфиге /usr/local/etc/postfix/main.cf ещё можно прописать вот эти параметры:
default_destination_concurrency_limit = 100
# максимальное количество писем, которые почтовый шлюз может отправить одновременно.
default_destination_recipient_limit = 100
# максимальное количество писем, которые почтовый шлюз может принять одновременно.
default_process_limit = 200
# количество дочерних процессов, которые может запускать postfix
max_use = 500
# количество одновременных подключений, которые может обрабатывать postfix
После всех этих правок не забываем перезапустить постфикс. Вобщем то, и на этом настройка постфикса заканчивается.
Но настройка самого шлюза ещё продолжается, в моём случае. Поскольку у меня на сервере с зимброй будет ещё и openfire, и ftp-шник, а сам этот сервер будет «прятаться» за почтовым шлюзом, то мне надо настроить:
а) NAT для сервера с зимброй, чтобы он мог видеть внешний мир;
б) Проброс портов извне к серверу с зимброй, чтобы пользователи извне могли попадать на вэб-интерфейс, подключаться к жабберу и заходить на ФТП.
В этом мне помогли вот эти статьи:
http://habrahabr.ru/post/111580 http://ifreebsd.org/freebsd/настройка-natтрансляция-адресов-маскар
Для начала, в /etc/rc.conf добавим строчки:
firewall_nat_enable="YES"
gateway_enable="YES"
А в /etc/sysctl.conf добавим строчку:
net.inet.ip.fw.one_pass=1
А фаервол приводим вот к такому виду:
# сброс всех правил
-f flush
# разрешить любой доступ через интерфейс-петлю
add 00050 allow all from any to any via lo0
# 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
add 00053 nat 1 tcp from any to any via em0
# второй NAT, чтобы проходил ping везде
nat 2 config if em0 reset same_ports
add 00054 nat 2 icmp from any to any icmptypes 0,8 via em0
# разрешить любой исходящий трафик с сервера
add 00055 allow all from me to any
# разрешить прохождение пакетов со статусом 'установлен'
add 00075 allow tcp from any to any established
# разрешить весь icmp трафик
add 00100 allow icmp from any to any
# разрешить серверу обмениваться любым трификом со DNS-сервером
add 00150 allow all from 192.168.199.100 to me via re0
# открытые порты к серверу.
add 00160 allow tcp from any to me 25,465 via em0
add 00161 allow tcp from any to me 22,10000,25,465 via re0
# разрешить любой трафик с зимброй
add 00171 allow all from 192.168.199.101 to any via re0
add 00172 allow all from any to 192.168.199.101 via re0
# Запретить всё остальное
add 10000 deny all from any to any
Затем, даём команду:
service ipfw restart
Чтобы корректно работал проброс порта 21 для ФТП-сервера, нужно загрузить модуль ядра alias_ftp.ko. Для этого, надо создать файл /boot/loader.conf и прописать в него вот такую строчку:
alias_ftp_load="YES"
С этой опцией модуль alias_ftp.ko будет загружаться при старте системы. Не забудем, после этого, перезагрузить сервер.
Собственно, после этого, можно уже и проверить работу почтового шлюза на предмет всех его перечисленных требований.
У меня на этапе проверки прохождения почты была замечена ошибка:
postfix/local[20404]: error: open database /etc/aliases.db: No such file or directory
postfix/local[20404]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
postfix/local[20404]: warning: hash:/etc/aliases is unavailable. open database /etc/aliases.db: No such file or directory
решается она так:
rm -f /etc/mail/aliases.db
затем, находим файл /etc/aliases и комментируем в нём строчку:
# nobody: root
А потом выполняем команду:
newaliases
Также, следует снизить «таймаут агента вэб-почты» в настройках зимбры, чтоб задержек в прохождении писем меньше было:
Собственно, на этом и всё. Если найду какие недоработки, то потом подправлю эту статью.
Добавлено 11.04.2013:
Настройка некоторых дополнений к почтовому шлюзу.
Не так давно, я на работе настроил почтовый шлюз для Зимбры. И о настройке этой я подробно описал вот тут:
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 начали корректно работать.
Добавлено 25.12.2015: Поправил безопасность.
Однажды искал решение одной своей проблемы и наткнулся вот на эту замечательную заметку:
http://vova33.blogspot.ru/2014/03/postfix.html
Автора, судя по нику, зовут Владимиром. Респект ему и благодарность!
В конец конфига main.cf у Постфикса добавляю строчки:
# Ограничения для этапа HELO/EHLO.
# Разрешаем доверенные сети и тем, кто прошёл аутентификацию
# Отбрасываем неправильное (несуществующее) имя хоста (например hjfhg.r)
# Отбрасываем не полностью определённое доменное имя хоста
# Отбрасываем, если хост по HELO/EHLO не имеет А или МХ записи в ДНС
smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname
# Ограничения для этапа MAIL FROM.
# Разрешаем доверенные сети и тем, кто прошёл аутентификацию
# Отбрасываем отправителя с несуществующего домена
# Отбрасываем несуществующих отправителей
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unknown_sender_domain, reject_unlisted_sender
# Ограничения для этапа RCPT TO
# Разрешаем доверенные сети и тем, кто прошёл аутентификацию
# Отбрасываем не полностью определённое имя отправителя и получателя
# Отбросить, если получатель отсутствует в списке нашего домена или списке пересылки. Чтобы сервер на стал открытым релеем
# Отвергаем запрос, когда клиент посылает команды SMTP раньше времени, ещё не зная, поддерживает ли Постфикс
# Отбрасываем неправильное (несуществующее) имя хоста (например hjfhg.r)
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_sender, reject_non_fqdn_recipient, reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname
# отключить возможность клиенту, подключившийся к серверу, командой vrfy определить, существует ли заданный адрес в системе.
disable_vrfy_command=yes
Так будет несколько побезопаснее, и пусть будет.
#FreeBSD #Postfix #Ipfw #Procmail #MPD5 #pptp #Spamassassin #настройка #установка