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