Настройка MTA/MDA
в этом разделе мы начнём с конца и поставим сначала то, что нужно основному "виновнику торжества" - postfix'у.
cyrus-sasl2
для начала поставим cyrus-sasl2. в зависимости от свежести вашего дерева портов может быть два варианта. для более старого дерева портов вы можете просто сделать:
cd /usr/ports/security/cyrus-sasl2 make -DWITHOUT_OTP -DWITHOUT_CRAM -DWITHOUT_DIGEST -DWITHOUT_NTLM
перед началом сборки должно вылезти красивое текстовое окошечко с кучей опций, из которых для нас важна только одна. остальные желательно убрать, оставив только:
[X] SASLAUTHD
после того, как cyrus-sasl2 собрался, то стандартно:
make install clean
ежели красивого окошечка не выскакивало, то, значит, у вас свежие порты и после всех этих действий у вас все ещё не хватает нужного нам saslauthd. его можно поставить вот таким образом:
cd /usr/ports/security/cyrus-sasl2-saslauthd make install clean
но повторяю, что данный порт есть только в новых портах, в старых портах он включён в порт cyrus-sasl2 и не нужен. теперь поправим конфиг для активации этого самого saslauthd в postfix. редактируем /usr/local/lib/sasl2/smtpd.conf:
pwcheck_method: saslauthd
теперь надо поставить pam-mysql. это делается стандартно:
cd /usr/ports/security/pam-mysql make install clean
после прочтения и осмысливания /usr/local/share/doc/pam_mysql/Readme добавим в /etc/pam.conf следующие строчки:
smtp auth sufficient pam_mysql.so user=mailer passwd=mailer_password db=mail table=users usercolumn=login passwdcolumn=password crypt=1 where=expired=0 smtp account sufficient pam_mysql.so user=mailer passwd=mailer_password db=mail table=users usercolumn=login passwdcolumn=password crypt=1 where=expired=0
не забудем запустить saslauthd:
/usr/local/etc/rc.d/saslauthd.sh start ps ax|grep sasl 363 ?? IWs 0:00,00 /usr/local/sbin/saslauthd -a pam 367 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam 368 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam 369 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam 370 ?? IW 0:00,00 /usr/local/sbin/saslauthd -a pam
если результат примерно такой, то значит всё прошло нормально, cyrus-sasl2 поставлен и теперь можно перейти к настройке postfix.
postfix2
как обычно:
/usr/ports/mail/postfix make install clean
должна вылезти красивая и совсем не юниксоидная ;) менюшка, в которой нам надо выбрать следующие опции:
[X] SASL2 [X] TLS [X] MySQL
если какой-то из опций у вас не обнаружилось, поздравляю, у вас ну очень старые порты и надо обновлять. как это делать - не в этом how-to да и вообще ни в каком, читайте handbook - там всё написано. после установки порт должен сказать, что делать дальше это мы сразу и сделаем. в /etc/rc.conf исправим:
sendmail_enable="NONE"
в /etc/periodic.conf:
daily_clean_hoststat_enable="NO" daily_status_mail_rejects_enable="NO" daily_status_include_submit_mailq="NO" daily_submit_queuerun="NO"
сделаем симлинк для автоматического запуска postfix во время загрузки системы:
cd /usr/local/etc/rc.d ln -s /usr/local/sbin/postfix postfix.sh
откроем /usr/local/etc/postfix/main.cf в каком-нибудь текстовом редакторе, найдём в его теле и исправим следующие параметры:
default_privs = nobody mynetworks = 127.0.0.0/8 alias_maps = hash:/etc/mail/aliases alias_database = hash:/etc/mail/aliases mail_spool_directory = /var/mail smtpd_banner = $myhostname mail sterver
не торопимся сохранять и закрывать /usr/local/etc/postfix/main.cf, а допишем туда:
# с каким кодом отшивать письма от open relays: maps_rbl_reject_code = 554
# принимать письма от: # авторизованных клиентов # от сетей, указанных в параметре mynetworks # отшивать письма от: # не для наших доменов и пользователей # для хостов, который есть в списках open relays # (подробности на www.ordb.org) smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_rbl_client list.dsbl.org, reject_rbl_client relays.ordb.org, reject_rbl_client dynablock.wirehub.net, reject_rbl_client blackholes.wirehub.net, reject_rbl_client dnsbl.njabl.org
# списки транспортов: transport_maps = mysql:/usr/local/etc/postfix/sql/transport.cf
# куда складывать почту транспорту virtual: virtual_mailbox_base = /var/mail/virtual
# списки почтовых ящиков: virtual_mailbox_maps = mysql:/usr/local/etc/postfix/sql/users.cf
# списки алиасов: virtual_alias_maps = mysql:/usr/local/etc/postfix/sql/aliases.cf
# списки uid и gid пользователей: virtual_uid_maps = mysql:/usr/local/etc/postfix/sql/uids.cf virtual_gid_maps = mysql:/usr/local/etc/postfix/sql/gids.cf
# списки наших доменов, для которых мы принимаем почту relay_domains = $transport_maps
# списки наших пользователей: local_recipient_maps = $virtual_mailbox_maps $virtual_maps $transport_maps
# включаем плагин sasl2 для smtpd авторизации smtpd_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous broken_sasl_auth_clients = yes
# использовать transport layer security для отправки почты # (пока все оставляем закомментаренным, ибо ключей у нас ещё нет) #smtp_use_tls = yes
# наши ключи. генерируются с помощью courier-imap (далее) #smtp_tls_key_file = /usr/local/share/courier-imap/pop3d.pem #smtp_tls_cert_file = $smtp_tls_key_file #smtp_tls_CAfile = $smtp_tls_key_file #smtp_tls_note_starttls_offer = yes
# включать возможность авторизации только в режиме tls #smtpd_tls_auth_only = yes
# использовать tls для приёма почты #smtpd_use_tls = yes #smtpd_tls_loglevel = 1 #smtpd_tls_received_header = yes #smtpd_tls_session_cache_timeout = 3600s #tls_random_source = dev:/dev/urandom
# наши ключи. генерируются с помощью courier-imap (далее) #smtpd_tls_key_file = /usr/local/share/courier-imap/pop3d.pem #smtpd_tls_cert_file = $smtpd_tls_key_file #smtpd_tls_CAfile = $smtpd_tls_key_file
сохраняем /usr/local/etc/postfix/main.cf и напишем maps файлы для mysql:
/usr/local/etc/postfix/sql/transport.cf: user = mailer password = mailer_password dbname = mail table = transport select_field = transport where_field = domain hosts = localhost
/usr/local/etc/postfix/sql/users.cf user = mailer password = mailer_password dbname = mail table = users select_field = maildir where_field = login additional_conditions = and expired = '0' hosts = localhost
/usr/local/etc/postfix/sql/aliases.cf: user = mailer password = mailer_password dbname = mail table = aliases select_field = rcpt where_field = alias hosts = localhost
/usr/local/etc/postfix/sql/gids.cf: user = mailer password = mailer_password dbname = mail table = users select_field = 6 where_field = login additional_conditions = and expired = '0' hosts = localhost
/usr/local/etc/postfix/sql/uids.cf: user = mailer password = mailer_password dbname = mail table = users select_field = 1009 where_field = login additional_conditions = and expired = '0' hosts = localhost
по поводу последних двух файлов нужно заметить, что реально полей для gid и uid в таблицах нет, ибо они все одинаковые и прописаны прямо в параметре select_field. чтобы узнать значения gid и uid для вашей системы, вам нужно посмотреть в /etc/passwd и /etc/group какие uid и gid принадлежат пользователю postfix (которого добавляет порт /usr/ports/mail/postfix) и группе mail. и прописать соответствующие значения в последних двух sql файлах.
если вы всё сделали правильно, то ваш MTA и MDA успешно настроен. теперь нужно создать каталог virtual mailbox base и выставить ему атрибутов:
mkdir -pv /var/mail/virtual chown postfix:mail /var/mail/virtual chmod 770 /var/mail/virtual
теперь можно запускать postfix. запускаем для начала 'postfix check' и смотрим, что он скажет на свою конфигурацию. если всё нормально, то запускаем: 'postfix start'. если postfix на что-то ругнулся, то надо это что-то исправить, к тому же postfix он не настолько злобный и на всякую ерунду не ругается.
ну что ж, настала пора проверить SMTP часть нашего MTA:
telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 raven.elk.ru mail sterver mail from: user@aol.com 250 Ok rcpt to: me@raven.elk.ru 250 Ok data 354 End data with <CR><LF>.<CR><LF> test message . 250 Ok: queued as AB11E334F2 quit 221 Bye Connection closed by foreign host.
если у вас в консоли всё примерно так же, как и выше, то SMTP часть у вас работает нормально.
теперь проверим возможность авторизации:
telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 raven.elk.ru mail sterver ehlo aol.com 250-raven.elk.ru 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH LOGIN PLAIN 250-AUTH=LOGIN PLAIN 250-XVERP 250 8BITMIME AUTH PLAIN bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop 235 Authentication successful
строка 'bWVAcmF2ZW4uZWxrLnJ1AG1lQHJhdmVuLmVsay5ydQBwYXNzd29yZDop' справедлива для логина 'me@raven.elk.ru' и пароля 'password:)'. генерируется эта строчка следующим образом:
perl -MMIME::Base64 -e \ 'print encode_base64("логин\0логин\0пароль");'
если диалог с почтовым сервером прошёл как показано выше, то значит авторизация работает. если же нет, то, читайте /var/log/maillog. вероятно, вы что-то не так сделали и очень вероятно, что чтение данного лога поможет выяснить что же конкретно неправильно.