Четверг, 21 Март 2013 17:43

Настройка почтового шлюза на FreeBSD

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

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

http://technotrance.su/index.php/moi-stati/linux-fedora/item/10-server-mail-ftp-jabber%20mail-gateway2

Собственно говоря, первый этап, на котором осуществляется вся первичная настройка сервера, мною уже описан вот тут:

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

Так будет несколько побезопаснее, и пусть будет Подмигиваю

Прочитано 18583 раз Последнее изменение Пятница, 25 Декабрь 2015 18:24

You have no rights to post comments

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