Данный документ описывает установку и настройку почтовой системы на основе Postfix, Cyrus-SASL, MySQL, Courier-IMAP, postfixadmin, clamav, spamassassin, amavisd-new. При этом нет разницы, сколько почтовых доменов заведено в системе, как называются пользователи, мы будем использовать виртуальных пользователей, которые с системными никак не пересекаются. Все логи и прочее были взяты с рабочей системы. Я ничего не выдумывал и не придумывал - это все реально работает.
Но аналогично построенные системы работают на CentOS-4.Х и на других RedHat подобных дистрибутивах. Сейчас данная связка у меня работает больше года на СentOS-4.0, пока ни одного сбоя замечено не было. Поэтому не вижу причин, почему бы данной связке не работать на других системах.
Перед началом настройки данной связки рекомендую обновить дерево портов.
Имеем freebsd-5.4.
# uname -a
FreeBSD freebsd.turbogaz.net 5.4-RELEASE-p11
FreeBSD 5.4-RELEASE-p11 #0: Sat Mar 4 17:38:23 EET 2006
root@:/usr/obj/usr/src/sys/kernel-04.03.2006 i386
192.168.127.230 - внутренний ip
217.20.223.100 - внешний ip, выданный провайдером.
Итак, начнем по порядку. Скорее всего, perl уже стоит у вас в системе, т.к. на него завязано слишком много пакетов. В линуксе он вообще сразу ставится с системой. Если perl не установлен, то ставим его
# cd /usr/ports/lang/perl5.8/
# make install clean
# rehash
Устанавливаем openssl. Он нам понадобится для генерации сертификатов/ключей, а также для поддержки SSL/TLS.
# cd /usr/ports/security/openssl/
# make install clean
# rehash
Устанавливаем и настраиваем MySQL. На unix системах, наверное, одна из самых распространенных СУБД. В MySQL мы будем хранить все данные о пользователях и почтовых ящиках.
# cd /usr/ports/databases/mysql41-server/
# setenv BUILD_OPTIMIZED yes
# setenv WITH_OPENSSL yes
# setenv WITH_CHARSET cp1251
# make install clean
# rehash
Устанавливаем набор вспомогательных скриптов, которые помогают настроить MySQL.
# cd /usr/ports/databases/mysql41-scripts/
# make install clean
# rehash
Производим первоначальную настройку MySQL сервера. Настраиваем запуск MySQL вместе с системой
# echo 'mysql_enable="YES"' >> /etc/rc.conf
Создаем конфигурационный файл, исправляем по своему желанию
# cp /usr/local/share/mysql/my-large.cnf /etc/my.cnf
Единственное, что я подправил, так это указал лог файл и в целях безопасности указал, чтобы mysql слушал только localhost. Если вы не собираетесь "выставлять" mysql наружу, то лучше привязать его или к внутреннему интерфейсу или к localhost.
Создаем соответствующий файл и выставляем необходимые права
# touch /var/log/mysql.log
# chown mysql:mysql /var/log/mysql.log
Запускаем MySQL
# /usr/local/etc/rc.d/mysql-server.sh start
Starting mysql.
# cat /var/log/mysql.log
/usr/local/libexec/mysqld, Version: 4.1.16-log, started with:
Tcp port: 3306 Unix socket: /tmp/mysql.sock
Time Id Command Argument
А теперь воспользуемся скриптом для настройки безопасности MySQL сервера
# /usr/local/bin/mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user. If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n]Y
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n]Y
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n]Y
... Success!
By default, MySQL comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n]Y
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!
Все, с MySQL мы разобрались, идем дальше.
Собираем и настраиваем Cyrus-SASL.
...
Patch5: cyrus-sasl-2.1.7-gdbm.patch
Patch6: cyrus-sasl-2.1.10-des.patch
Patch7: cyrus-sasl-2.1.20-gssapi-dynamic.patch
...
Patch15: cyrus-sasl-2.1.19-md5crypt.patch
...
%patch5 -p1 -b .gdbm
%patch6 -p1 -b .des
%patch7 -p1 -b .gssapi-dynamic
...
%patch15 -p1 -b .md5crypt
После этого необходимо пересобрать и обновить cyrus-sasl.
# rpmbuild -ba cyrus-sasl.spec
# rpm -Uvh cyrus-sasl-xxx.rpm
# cd /usr/ports/security/cyrus-sasl2/
# setenv WITHOUT_NTLM yes
# setenv WITH_MYSQL yes
# setenv WITHOUT_OTP yes
# make install clean
# rehash
В самом конце инсталляции увидим следующее сообщение
You should also check the
/usr/local/lib/sasl2/*.conf files for the correct pwcheck_method.
Последуем их совету и создадим необходимый файл.
# touch /usr/local/lib/sasl2/smtpd.conf
После осмысленного прочтения следующего документа
у нас должен получиться файл со следующим содержимым:
# cat /usr/local/lib/sasl2/smtpd.conf
pwcheck_method: auxprop
mech_list: CRAM-MD5 DIGEST-MD5 PLAIN LOGIN
auxprop_plugin: sql
sql_engine: mysql
sql_hostname: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'
log_level: 3
log_level: 3 - очень удобно при отладке, после настройки системы его лучше убрать.
Собираем expect, он необходим для возможности изменения пароля через web
# cd /usr/ports/lang/expect/
# make install clean
# rehash
Собираем и настраиваем courier-authlib
# cd /usr/ports/security/courier-authlib/
# make config
Options for courier-authlib 0.58
[ ] GDBM Use gdmb instead of system bdb
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PosrgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
# make install clean
# rehash
Настраиваем courier-authlib. Делаем автоматический запуск authdaemond при старте системы
# echo 'courier_authdaemond_enable="YES"' >> /etc/rc.conf
После осмысленного прочтения следующих документов:
Редактируем следующие файлы:
# cat /usr/local/etc/authlib/authdaemonrc
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
DEBUG_LOGIN=2
DEFAULTOPTIONS="wbnodsn=1"
LOGGEROPTS=""
# cat /usr/local/etc/authlib/authmysqlrc
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD postfix
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_PORT 3306
MYSQL_OPT 0
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD '1981'
MYSQL_GID_FIELD '1981'
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD '/var/spool/mail'
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD quota
MYSQL_WHERE_CLAUSE active='1'
Запускаем authdaemond
# /usr/local/etc/rc.d/courier-authdaemond.sh start
Starting courier_authdaemond.
Если вы все правильно настроили, то в логах должно быть следующее
# cat /var/log/maillog | grep authdaemond
Nov 20 15:59:52 freebsd authdaemond: modules="authmysql", daemons=5
Nov 20 15:59:52 freebsd authdaemond: Installing libauthmysql
Nov 20 15:59:52 freebsd authdaemond: Installation complete: authmysql
Устанавливаем и настраиваем courier-imap. Несмотря на название, courier-imap также поддерживает и pop3, хотя основной акцент делается на работу с imap.
# cd /usr/ports/mail/courier-imap/
# make config
Options for courier-imap 4.0.6_1,1
[X] OPENSSL Build with OpenSSL support
[ ] FAM Build in fam support for IDLE command
[X] TRASHQUOTA Include deleted mails in the quota
[ ] GDBM Use gdbm db instead of system bdb
[ ] IPV6 Build with IPv6 support
[ ] AUTH_LDAP LDAP support
[X] AUTH_MYSQL MySQL support
[ ] AUTH_PGSQL PostgreSQL support
[ ] AUTH_USERDB Userdb support
[ ] AUTH_VCHKPW Vpopmail/vchkpw support
# make install clean
# rehash
В зависимости от того, что вы хотите использовать pop3 или imap, редактируем соответствующие файлы. Лично я использую pop3, поэтому редактируем следующий файл
/usr/local/etc/courier-imap/pop3d
# cat /usr/local/etc/courier-imap/pop3d
PIDFILE=/var/run/pop3d.pid
MAXDAEMONS=40
MAXPERIP=4
POP3AUTH="CRAM-MD5 PLAIN LOGIN CRAM-SHA1 CRAM-SHA256"
POP3AUTH_ORIG="CRAM-MD5 PLAIN LOGIN CRAM-SHA1 CRAM-SHA256"
POP3AUTH_TLS=""
POP3AUTH_TLS_ORIG=""
POP3_PROXY=0
PORT=110
ADDRESS=192.168.127.230
TCPDOPTS="-nodnslookup -noidentlookup"
LOGGEROPTS="-name=pop3d"
POP3DSTART=YES
MAILDIRPATH=Maildir
Настраиваем автоматический запуск pop сервера при старте системы
# echo 'courier_imap_pop3d_enable="YES"' >> /etc/rc.conf
Запускаем pop сервер
# /usr/local/etc/rc.d/courier-imap-pop3d.sh start
Starting courier_imap_pop3d.
Проверяем, запустился ли pop3 сервер
# sockstat | grep 110
root couriertcp 902 3 tcp4 192.168.127.230:110 *:*
Ну а теперь собираем сердце нашей системы - Postfix
# cd /usr/ports/mail/postfix
# make install clean
# rehash
Postfix configuration options
Please select desired opptions:
[ ] NOPCRE DISABLE Perl Compatible Regular Expressions
[ ] SASL Cyrus SASLv1 (Simple Authentication and Security Layer)
[X] SASL2 Cyrus SASLv2 (Simple Authentication and Security Layer)
[ ] SASLKRB If your SASL requires Kerberos select this option
[ ] SASLKRB5 If your SASL requires Kerberos5 select this option
[ ] SASLKRB5MIT If your SASL requires MIT Kerberos5 select this option
[ ] SPF SPF support
[X] TLS SSL and TLS
[ ] DB3 Berkeley DB3 (required if SASL also built withDB3)
[ ] DB40 Berkeley DB4.0 (required if SASL also built withDB4.0)
[ ] DB41 Berkeley DB4.1 (required if SASL also built withDB4.1)
[ ] DB42 Berkeley DB4.2 (required if SASL also built withDB4.2)
[ ] DB43 Berkeley DB4.3 (required if SASL also built withDB4.3)
[X] MySQL MySQL map lookups (choose version with WITH_MYSQL_VER)
[ ] PgSQL PostgreSQL map lookups (choose with DEFAULT_PGSQL_VER)
[ ] OpenLDAP OpenLDAP map lookups (choose ver. with WITH_OPENLDAP_VER)
[ ] CDB CDB map lookups
[ ] NIS NIS map lookups
[X] VDA VDA (Virtual Delivery Agent)
[ ] Test SNMP/LMTP test server and generator
В конце установки на вопрос
Would you like to activate Postfix in /etc/mail/mailer.conf [n]?
Я ответил no.
Отключаем запуск sendmail при старте системы, иначе postfix и sendmail будут конфликтовать между собой. Для этого добавляем следующие строчки в rc.conf
# cat /etc/rc.conf | grep sendmail
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
Отключаем специфические для sendmail опции
# touch /etc/periodic.conf
# cat /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, а именно main.cf
#
# /usr/local/etc/postfix/main.cf
#
# LOCAL PATHNAME INFORMATION
#
# Указываем месторасположения директории очереди postfix. Также данная
# директория является корнем, когда postfix запускается в chroot окружении.
queue_directory = /var/spool/postfix
# Задает месторасположение всех postXXX команд (postmap, postconf, postdrop)
command_directory = /usr/local/sbin
# Задаем корень конфигурационных файлов, для более "быстрой навигации".
# Например, теперь можно использовать
$base/header_checks
вместо
#
/usr/local/etc/postfix/header_checks
. Мелочь, а приятно.
base = /usr/local/etc/postfix
# Задает месторасположение всех программ демонов postfix. Это программы,
# перечисленные в файле master.cf. Владельцем этой директории должен быть root
daemon_directory = /usr/local/libexec/postfix
# QUEUE AND PROCESS OWNERSHIP
#
# Задает владельца очереди postfix, а также большинства демонов postfix.
# В целях безопасности, необходимо использовать выделенную учетную запись.
# Т.е. от данного пользователя не должны запускаться какие-либо процессы
# в системе, а также он не должен являться владельцем каких-либо файлов.
mail_owner = postfix
# Права по умолчанию, использующиеся local delivery agent. Не указывайте
# здесь привилегированного пользователя или владельца postfix.
default_privs = nobody
# INTERNET HOST AND DOMAIN NAMES
#
# Задает имя хоста в формате FQDN. По умолчанию, используется значение,
# возвращаемой функцией gethostname().
myhostname = mail.turbogaz.net
# Задает имя нашего домена. По умолчанию используется значение $myhostname
# минус первый компонент.
mydomain = turbogaz.net
# SENDING MAIL
#
# Данный параметр указывает имя домена, которое используется при отправлении
# почты с этой машины. По умолчанию, используется имя локальной машины -
# $myhostname. Для согласованности между адресами отправителя и получателя,
# myorigin также указывает доменное имя, которое добавляется к адресу
# получателя для которого не указана доменная часть.
#
myorigin = $myhostname (отправлять письма от: "alex@mail.turbogaz.net")
#
myorigin = $mydomain (отправлять письма от: "alex@turbogaz.net")
myorigin = $mydomain
# RECEIVING MAIL
#
# Указывает адреса сетевых интерфейсов, на которых будет принимать почту
# наша почтовая система. По умолчанию используются все активные интерфейсы
# на машине. При изменении этого праметра необходимо перезапустить postfix
inet_interfaces = all
# Данный параметр указывает список доменов, для которых почта будет доставляться
# локально, а не пересылаться на другой хост.
Не указывайте здесь виртуальные
#
домены, для этого есть специальный параметр
virtual_mailbox_domains
mydestination = $myhostname, localhost.$mydomain, localhost
# REJECTING MAIL FOR UNKNOWN LOCAL USERS
#
# Указывает код ответа SMTP сервера для несуществующих пользователей
unknown_local_recipient_reject_code = 550
local_recipient_maps = $virtual_mailbox_maps, $virtual_alias_maps, $alias_maps
# TRUST AND RELAY CONTROL
#
# Данный параметр задает список "доверенных" клиентов, которые обладают
# некоторыми привилегиями. В частности доверенным SMTP клиентам дозволено
# пересылать почту через postfix. Если вы не доверяете никому, то оставьте
# только 127.0.0.0/8
mynetworks = 127.0.0.0/8
# ALIAS DATABASE
#
# Данный параметр указывает список алиасов, используемый local delivery agent
# После внесения изменений в данный файл необходимо выполнить команду newaliases
# или postalias /etc/mail/aliases
alias_maps = hash:/etc/mail/aliases
alias_database = hash:/etc/mail/aliases
# JUNK MAIL CONTROLS
#
# The controls listed here are only a very small subset. The file
# SMTPD_ACCESS_README provides an overview.
header_checks = regexp:$base/header_checks
# SHOW SOFTWARE VERSION OR NOT
#
# Желательно сообщать как можно меньше информации о нашем почтовом сервере.
# Согласно требованиям SMTP протокола вы должны указать $myhostname вначале текста
smtpd_banner = $myhostname ESMTP
# DEBUGGING CONTROL
#
# Задает уровень информативности, когда имя или адрес SMTP клиента
# или сервера соответствует шаблону, заданному в параметре debug_peer_list.
# Следует использовать только во время отладки.
debug_peer_level = 2
debug_peer_list = 127.0.0.1, turbogaz.net
# RESTRICTIONS
#
# client, helo, sender, recipient, data, end-of-data
#
# Дополнительные ограничения доступа smtp сервера в контексте
# smtp запроса клиента
smtpd_client_restrictions = permit_mynetworks,
permit_sasl_authenticated,
check_client_access hash:$base/client_access,
reject_unknown_client
# Дополнительные ограничения, применяемые сервером Postfix
# в контексте SMTP команды HELO
smtpd_helo_restrictions = check_helo_access hash:$base/hello_access,
permit_mynetworks,
reject_invalid_hostname,
reject_unknown_hostname,
reject_non_fqdn_hostname
# Дополнительные ограничения, применяемые сервером Postfix
# в контексте команды MAIL FROM
smtpd_sender_restrictions = permit_mynetworks,
check_sender_access hash:$base/sender_access,
reject_authenticated_sender_login_mismatch,
reject_unknown_sender_domain,
reject_unlisted_sender,
reject_unverified_sender
# Дополнительные ограничения, применяемые сервером Postfix
# в контексте команды RCPT TO
smtpd_recipient_restrictions = permit_mynetworks,
permit_sasl_authenticated,
permit_auth_destination,
reject_unauth_destination,
check_recipient_access hash:$base/recipient_access,
reject_unlisted_recipient,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient,
reject_unverified_recipient,
reject
# Дополнительные ограничения, применяемые сервером Postfix
# в контексте SMTP команды DATA. См. примечание.
smtpd_data_restrictions = reject_unauth_pipelining,
reject_multi_recipient_bounce
# Отклонять команду ETRN
smtpd_etrn_restrictions = reject
# Заставляем отклонять почту с неизвестным адресом отправителя.
# Позволяет бороться с червями и некоторыми вирусами.
smtpd_reject_unlisted_sender = yes
# Отключает SMTP команду VRFY. В результате чего, невозможно определить
# существование определенного ящика. Данная техника (применение команды
# VRFY) используется спамерами для сбора имен почтовых ящиков.
disable_vrfy_command = yes
# Требуем чтобы адреса, передаваемые в SMTP командах MAIL FROM и RCPT TO
# заключались в <>, а также не содержали стилей или фраз RFC 822.
strict_rfc821_envelopes = yes
# Скрываем отображение имени таблицы получателей в ответе "User unknown"
#
yes
: User unknown in virtual mailbox table
#
no
: User unknown
show_user_unknown_table_name = no
# Данный адрес будет использоваться при проверки существования адреса отправителя.
address_verify_sender = <>
# Числовой код ответа SMTP сервера Postfix в случае, когда адрес
# получателя отвергнут ограничением reject_unverified_sender.
unverified_sender_reject_code = 550
# Требуем, чтобы удаленный SMTP клиент представлял себя
# в начале SMTP сессии с помощью команды HELO или EHLO.
smtpd_helo_required = yes
# Всегда отправлять EHLO вначале SMTP сессии
smtp_always_send_ehlo = yes
# Максимальное количество ошибок, которое может сделать удаленный SMTP клиент.
# При превышение данного числа Postfix разорвет соединение.
smtpd_hard_error_limit = 8
# Интервал времени в течение которого SMTP сервер Postfix должен послать ответ,
# а удаленный SMTP клиент получить запрос
smtpd_timeout = 120s
# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду HELO или EHLO и получить ответ сервера.
smtp_helo_timeout = 60s
# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду RCPT TO и получить ответ сервера.
smtp_mail_timeout = 60s
# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду MAIL FROM и получить ответ сервера.
smtp_rcpt_timeout = 90s
# Включаем поддержку sasl аутентификации
smtpd_sasl_auth_enable = yes
# Имя приложения, используемого для инициализации SASL сервера.
# Данный параметр задает имя конфигурационного файла. Имя smtpd
# будет соответсвовать конфигурационному файлу SASL - smtpd.conf.
smtpd_sasl_application_name = smtpd
# Включает функциональную совместимость с SMTP клиентами, которые
# используют устаревшую версию команды AUTH (RFC 2554),
# например, outlook express 4 и MicroSoft Exchange version 5.0.
broken_sasl_auth_clients = yes
# Отвергаем методы, позволяющие анонимную аутентификацию
smtpd_sasl_security_options = noanonymous
# Optional lookup table with the SASL login names
# that own sender (MAIL FROM) addresses
smtpd_sender_login_maps = mysql:$base/mysqlLookupMaps/sender.conf
# Указываем, где postfix должен брать информацию о транспорте
transport_maps = mysql:$base/mysqlLookupMaps/transport.conf
# Указываем, где postfix должен брать информацию о алиасах
virtual_alias_maps = mysql:$base/mysqlLookupMaps/alias.conf
# Указываем, где postfix должен брать информацию о доменах
virtual_mailbox_domains = mysql:$base/mysqlLookupMaps/domain.conf
# Указываем, где postfix должен брать информацию о почтовых ящиках
virtual_mailbox_maps = mysql:$base/mysqlLookupMaps/mailbox.conf
virtual_mailbox_base = /var/spool/mail
# Настраиваем поддержку квот
virtual_mailbox_limit_maps = mysql:$base/mysqlLookupMaps/quota.conf
virtual_maildir_extended=yes
virtual_mailbox_limit_override=yes
virtual_create_maildirsize = yes
virtual_overquota_bounce = yes
virtual_maildir_limit_message="Sorry, the user's maildir has overdrawn
his diskspace quota, please try again later"
# Ограничиваем максимальный размер письма до 5 Мб
message_size_limit = 5242880
# 1981 - uid и gid пользователя и группы virtual соответственно
virtual_gid_maps = static:1981
virtual_uid_maps = static:1981
virtual_minimum_uid = 1000
Инициализируем базу данных псевдонимов
# newaliases
/etc/mail/aliases: 26 aliases, longest 10 bytes, 266 bytes total
Создаем необходимые файлы
# cd /usr/local/etc/postfix
# touch hello_access sender_access
# touch recipient_access client_access
# postmap hello_access
# postmap sender_access
# postmap recipient_access
# postmap client_access
# mkdir /usr/local/etc/postfix/mysqlLookupMaps
# cat /usr/local/etc/postfix/mysqlLookupMaps/alias.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
# cat /usr/local/etc/postfix/mysqlLookupMaps/domain.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = description
where_field = domain
additional_conditions = and active = '1' and backupmx = '0'
# cat /usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'
# cat /usr/local/etc/postfix/mysqlLookupMaps/quota.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
# cat /usr/local/etc/postfix/mysqlLookupMaps/sender.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = username
where_field = username
additional_conditions = and active = '1'
# cat /usr/local/etc/postfix/mysqlLookupMaps/transport.conf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = transport
where_field = domain
Создаем папку, где у нас будет храниться почта, и выставляем необходимые права.
# chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/
# chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf
# chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/
# pw group add virtual -g 1981
# pw user add virtual -g virtual -s /sbin/nologin -u 1981
# mkdir /var/spool/mail
# chown virtual:virtual /var/spool/mail/
# chmod 740 /var/spool/mail/
Создаем симлинк и запускаем postfix
# cd /usr/local/etc/rc.d
# ln -s /usr/local/sbin/postfix postfix.sh
# /usr/local/etc/rc.d/postfix.sh start
postfix/postfix-script: starting the Postfix mail system
Если все правильно настроено, то в логах должно быть следующее
# cat /var/log/maillog | grep postfix
Nov 21 11:57:20 freebsd postfix/postfix-script: starting the Postfix mail system
Nov 21 11:57:20 freebsd postfix/master[9213]: daemon started -- version 2.2.8,
configuration /usr/local/etc/postfix
Устанавливаем веб сервер apache, он нам понадобится для postfixadmin.
# cd /usr/ports/www/apache13-modssl/
# setenv WITH_APACHE_MODDEFLATE yes
# make install clean
# rehash
# unsetenv WITH_APACHE_MODDEFLATE
# make WITH_APACHE_MODDEFLATE=yes # make install clean То вас ждет неудача. По правилам, при инсталляции надо задавать такие же параметры, что и при сборке, т.е. WITH_APACHE_MODDEFLATE=yes. Но при сборке некоторых портов можно обойтись и без этого.
Можно конечно каждый раз писать make WITH_xxx и make install WITH_xxx, но если таких параметров много, то это очень неудобно. Лучше объявить эти переменные с помощью команды setenv или export, в зависимости от того, какую оболочку вы используете.
Настраиваем автоматический запуск apache сервера при старте системы
# echo 'apache_enable="YES"' >> /etc/rc.conf
Редактируем файл /usr/local/etc/apache/httpd.conf под свои нужды.
Устанавливаем php
# cd /usr/ports/lang/php4
# make config
Options for php4 4.4.1_3
[ ] D
EBUG Enable debug
[X] M
ULTIBYTE Enable zend multibyte support
[ ] I
PV6 Enable ipv6 support
[ ] O
PENSSL Build static OpenSSL extension
# make install clean
В самом конце установки обращаем внимание на следующие строчки
***************************************************************
Make sure index.php is part of your DirectoryIndex.
You should add the following to your Apache configuration file:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
***************************************************************
Вносим необходимые изменения в httpd.conf
# cat /usr/local/etc/apache/httpd.conf| grep DirectoryIndex
# DirectoryIndex: sets the file that Apache will serve if a directory
DirectoryIndex index.php index.html
# cat /usr/local/etc/apache/httpd.conf| grep httpd-php
AddType application/x-httpd-php .php
Создаем php.ini и включаем magiс quotes для postfixadmin
# cd /usr/local/etc
# cp php.ini-dist php.ini
# cat php.ini | grep magic_quotes_gpc
; - magic_quotes_gpc = Off [Performance]
magic_quotes_gpc = On
Теперь устанавливаем необходимые расширения для php.
# cd /usr/ports/lang/php4-extensions/
# make config
Options for php4-extension 1.0
[X] BCMATH bc style precision math functions
[X] BZ2 bzip2 library support
[X] CALENDAR calendar conversion support
[ ] CRACK crack support
[X] CTYPE ctype functions
[X] CURL CURL support
[ ] DBA dba support
[ ] DBASE dBase library support
[ ] DBX dbx support
[ ] DIO Direct I/O support
[X] DOMXML DOM support
[X] EXIF EXIF support
[ ] FILEINFO fileinfo support
[ ] FILEPRO filePro support
[ ] FRIBIDI FriBidi support
[X] FTP FTP support
[X] GD GD library support
[X] GETTEXT gettext library support
[X] GMP GNU MP support
[X] ICONV iconv support
[ ] IMAGICK ImageMagick support
[X] IMAP IMAP support
[ ] INTERBASE Interbase 6 database support (Firebird)
[ ] LDAP OpenLDAP support
[X] MBSTRING multibyte string support
[X] MCAL Modular Calendar Access Library support
[X] MCRYPT Encryption support
[X] MCVE MCVE support
[X] MHASH Crypto-hashing support
[ ] MING ming shockwave flash support
[ ] MNOGOSEARCH mnoGoSearch support
[ ] MSSQL MS-SQL database support
[X] MYSQL MySQL database support
[ ] NCURSES ncurses support (CLI only)
[ ] ODBC unixODBC support
[X] OPENSSL OpenSSL support
[ ] ORACLE Oracle support
[ ] PANDA panda support
[ ] PCNTL pcntl support (CLI only)
[X] PCRE Perl Compatible Regular Expression support
[ ] PDF PDFlib support (implies GD)
[ ] PGSQL PostgreSQL database support
[ ] POSIX POSIX-like functions
[ ] PSPELL pspell support
[ ] READLINE readline support (CLI only)
[ ] RECODE recode support
[X] SESSION session support
[ ] SHMOP shmop support
[ ] SNMP SNMP support
[X] SOCKETS sockets support
[ ] SYBASE_CT Sybase database support
[X] SYSVMSG System V message support
[X] SYSVSEM System V semaphore support
[X] SYSVSHM System V shared memory support
[ ] TIDY TIDY support
[X] TOKENIZER tokenizer support
[ ] WDDX WDDX support (implies XML)
[X] XML XML support
[ ] XMLRPC XMLRPC-EPI support
[ ] XSLT XSLT Sablotron support
[ ] YAZ YAZ support (ANSI/NISO Z39.50)
[ ] YP YP/NIS support
[ ] ZIP ZIP support
[X] ZLIB ZLIB support
# make install clean
# rehash
Проверяем нашу связку apache + php. Для этого создаем тестовый файл, со следующим содержимым.
# touch /usr/local/www/data/test.php
# cat /usr/local/www/data/test.php
<?
phpinfo();
?>
Запускаем apache
# /usr/local/etc/rc.d/apache.sh start
Starting apache.
В любимом интернет проводнике набираем http://192.168.127.230/test.php. Если все правильно настроено, то мы должны увидеть подобную страничку
Устанавливаем веб интерфейс для администрирования почтовых ящиков.
# cd /usr/ports/mail/postfixadmin
# make install clean
Внимательно читаем файл /usr/local/www/postfixadmin/INSTALL.TXT. После этого следуем инструкциям и настраиваем postfixadmin
Вносим необходимые изменения в httpd.conf.
#
# /usr/local/etc/apache/httpd.conf
#
Alias /postfix-admin/ "/usr/local/www/postfixadmin/"
<Directory "/usr/local/www/postfixadmin">
Options Indexes
AllowOverride Authconfig
Order allow,deny
Allow from 192.168.127.100
</Directory>
В целях безопасности изменяем стандартный пароль администратора postfixadmin.
# cd /usr/local/www/postfixadmin/admin/
# htpasswd -b .htpasswd admin 1234567
Updating password for user admin
Создаем необходимые таблицы и перегружаем apache.
# cd /usr/local/www/postfixadmin
# mysql -u root -p < DATABASE_MYSQL.TXT
Enter password: ******
# /usr/local/etc/rc.d/apache.sh restart
Performing sanity check on apache configuration:
Syntax OK
Stopping apache.
Waiting for PIDS: 51999.
Starting apache.
Редактируем файл /usr/local/www/postfixadmin/config.inc.php.
// Указываем, где у нас установлен postfixadmin
$CONF['postfix_admin_url'] = 'http://www.turbogaz.net/postfix-admin/';
$CONF['postfix_admin_path'] = '/usr/local/www/postfixadmin/';
// Язык интерфейса. Список всех языков можно посмотреть в папке './languages'
$CONF['default_language'] = 'ru';
// Параметры БД. Здесь необходимо указать тип БД (MySQL или PostgreSQL),
// имя пользователя и пароль, использующиеся при подключении, а также имя БД.
//
mysql
- MySQL 3.23 and 4.0
//
mysqli
- MySQL 4.1
//
pgsql
- PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';
// Здесь необходимо указать email, от имени которого будет посылаться
// письмо пользователю при создании нового почтового ящика.
// Это т.н. null адрес, согласно RFC вы должны принимать почту с такого адреса.
$CONF['admin_email'] = '<>';
// Имя хоста в формате FQDN (
Fully Qualified Domain Name
) где находится
// почтовый сервер postfix. Эти данные будут использоваться при отправке
// email для создания почтовых ящиков.
$CONF['smtp_server'] = 'mail.turbogaz.net';
$CONF['smtp_port'] = '25';
// Тип шифрования пароля.
//
md5crypt
- внутренний алгоритм шифрования postfix admin
//
system
- используется метод шифрования установленный по умолчанию в php
//
cleartext
- в чистом виде, т.е. без шифрования.
$CONF['encrypt'] = 'cleartext';
// Если вы хотите, чтобы postfix admin автоматически генерировал и отображал
// пароль при создании почтового ящика установите значение YES
$CONF['generate_password'] = 'NO';
// Количество записей, одновременно отображаемых на странице
$CONF['page_size'] = '20';
// Алиасы, создаваемые при создании домена
$CONF['default_aliases'] = array (
'abuse' => 'abuse@turbogaz.net',
'hostmaster' => 'hostmaster@turbogaz.net',
'postmaster' => 'postmaster@turbogaz.net',
'webmaster' => 'webmaster@turbogaz.net'
);
// Использовать имя домена в пути к почтовому ящику.
//
YES
:
/var/spool/mail/turbogaz.net/alex
//
NO: /var/spool/mail/alex
$CONF['domain_path'] = 'YES';
// Включать имя домена в имя почтового ящика
//
YES
:
/var/spool/mail/alex@turbogaz.net
//
NO: /var/spool/mail/alex
$CONF['domain_in_mailbox'] = 'YES';
# $CONF['domain_in_mailbox'] = 'YES' + $CONF['domain_path'] = 'YES'
# /var/spool/mail/turbogaz.net/alex@turbogaz.net/
// Значения по умолчанию при создании домена. Количество алиасов,
// почтовых ящиков и максимальная квота в Мб. Я специально указал квоту
// равную 0, т.е. анлим, иначе себе вы тоже не сможете задать размер
// ящика больше этого значения.
$CONF['aliases'] = '10';
$CONF['mailboxes'] = '50';
$CONF['maxquota'] = '0';
// Позволяет задавать квоты при создании почтового ящика
$CONF['quota'] = 'YES';
// Вы можете использовать '1024000' или '1048576'
$CONF['quota_multiplier'] = '1024000';
// Позволяет устанавливать дополнительные параметры транспорта для домена
$CONF['transport'] = 'YES';
// Следующих два параметра используются для организации DNS.
// Лучше их не использовать.
$CONF['vacation'] = 'NO';
$CONF['vacation_domain'] = 'autoreply.turbogaz.net';
// Управления алиасами, которые создает postfix для каждого ящика
$CONF['alias_control'] = 'NO';
// Зарпещает администраторам домена изменять стандартные алиасы
$CONF['special_alias_control'] = 'NO';
// Позволяет вести лог действий работы с postfix admin, т.е. вы сможете
// посомтреть кто создавал, редактировал и удалял почтовые ящики и т.п.
$CONF['logging'] = 'YES';
// Отображать текст вверху страницы и его содержимое
$CONF['show_header_text'] = 'NO';
$CONF['header_text'] = ':: Postfix Admin ::';
// Аналогично, только текст будет отображаться внизу всех страниц
$CONF['show_footer_text'] = 'YES';
$CONF['footer_text'] = 'Вернуться на главную страницу';
$CONF['footer_link'] = 'http://www.turbogaz.net/';
// Текст письма привествия. Это письмо будет высылаться на каждый
// создаваемый почтовый ящик.
$CONF['welcome_text'] = <<<EOM
С уважением, системный администратор ОАО "Турбогаз".
EOM;
Затем проверяем postfixadmin, набрав в любом интернет проводнике http://192.168.127.230/postfix-admin/. Если мы производим настройку первый раз, то нам предлагают перейти по ссылке setup. Если все правильно настроенно, то мы увидим следующую страницу.
Переходим по ссылке admin section (логин и пароль по умолчанию - admin/admin). Создаем домен (в моем случае turbogaz.net) и три почтовыx ящика, например, alex@turbogaz.net, quota@turbogaz.net и virusalert@turbogaz.net (этот ящик пригодится для проверки антивируса). Для ящика quota@turbogaz.net задаем маленькую квоту, например, 2 Мб.
При создании ящика в логах должно быть такое:
После настройки удаляем файл setup.php
Если все правильно настроено, то в /var/spool/mail/ должны появиться следующие папки:
# ls -l /var/spool/mail/
total 2
drwx------ 4 virtual virtual 512 Jan 1 18:04 turbogaz.net
# ls -l /var/spool/mail/turbogaz.net/
total 4
drwx------ 5 virtual virtual 512 Jan 1 18:07 alex@turbogaz.net
drwx------ 5 virtual virtual 512 Jan 1 17:52 quota@turbogaz.net
Отправка письма
Обращаем внимание на следующее:
sasl_method=PLAIN - метод аутентификации PLAIN
sasl_username=alex@turbogaz.net - имя пользователя в почтовом клиенте необходимо указывать вместе с именем домена
Получение письма
Проверим поддержку квот. Для этого отправим пользователю quota@turbogaz.net, у которого квота 2Мб, письмо с вложением ~3МБ
Как видно из логов - "status=bounced (maildir delivery failed: "Sorry, the user's maildir has overdrawn his diskspace quota, please try again later")", поддержка квот работает. Текст сообщения можно задать в main.cf в параметре virtual_maildir_limit_message.
А теперь попробуем отправить письмо в мир, без авторизации.
Как видно из сообщения - "Relay access denied". Доступ нам закрыт. Теперь попробуем отправить письмо, но уже с авторизацией.
$ telnet 192.168.127.230 25
Trying 192.168.127.230...
Connected to mail.turbogaz.net.
Escape character is '^]'.
220 mail.turbogaz.net ESMTP
--> EHLO pmo3.turbogaz.net
250 mail.turbogaz.net
250-PIPELINING
250-SIZE 10485760
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
--> AUTH PLAIN
334
--> AGFsZXhAYWtrby5jb20udWEAMTIz
235 2.0.0 Authentication successful
--> MAIL FROM:<alex@turbogaz.net>
250 2.1.0 Ok
--> RCPT TO:<alex@nissan.com.ua>
250 2.1.5 Ok
--> DATA
354 End data with <CR><LF>.<CR><LF>
--> Hello world
--> .
250 2.0.0 Ok: queued as F3F751CC6C
--> QUIT
221 2.0.0 Bye
Connection closed by foreign host.
Теперь попробуем отправить почту с несуществующего ящика внутри домена.
$ telnet 192.168.127.230 25
Trying 192.168.127.230...
Connected to mail.turbogaz.net.
Escape character is '^]'.
220 mail.turbogaz.net ESMTP
--> HELO pmo3.turbogaz.net
250 mail.turbogaz.net
--> MAIL FROM: <nonexistuser@turbogaz.net>
250 2.1.0 Ok
--> RCPT TO: <alex@turbogaz.net>
550 5.1.0 <nonexistuser@turbogaz.net>: Sender address rejected: User unknown
--> QUIT
221 2.0.0 Bye
Connection closed by foreign host.
Как видно из сообщения, наш сервер не разрешает отправлять почту с несуществующих адресов. А теперь проверим, что будет, когда почту будут нам отправлять из мира.
$ telnet 212.42.65.100 25
Trying 212.42.65.100...
Connected to mx1.nissan.com.ua.
Escape character is '^]'.
220 mx1.nissan.com.ua ESMTP
--> HELO pmo1.nissan.com.ua
250 mx1.nissan.com.ua
--> MAIL FROM: <nonexistuser@nissan.com.ua>
250 2.1.0 Ok
--> RCPT TO: <alex@turbogaz.net>
250 2.1.5 Ok
--> DATA
354 End data with <CR><LF>.<CR><LF>
--> SUBJECT: Test
--> Hello world
--> .
250 2.0.0 Ok: queued as 5CF201CC1F
--> QUIT
221 2.0.0 Bye
Connection closed by foreign host.
На mx1.nissan.com.ua данная проверка естественно должна быть отключена. При этом в логах должно быть следующее.
Как видно из логов, наш почтовый сервер не принимает почту, если ящик отправителя не существует.
А теперь попробуем, аутентифицировавшись под пользователем alex@turbogaz.net, отправить почту от имени quota@turbogaz.net.
# telnet 192.168.127.230 25
Trying 192.168.127.230...
Connected to mail.turbogaz.net.
Escape character is '^]'.
220 mail.turbogaz.net ESMTP
--> EHLO pmo1.turbogaz.net
250-mail.turbogaz.net
250-PIPELINING
250-SIZE 10485760
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
--> AUTH LOGIN
334 VXNlcm5hbWU6
--> YWxleEBha2tvLmNvbS51YQ=
334 UGFzc3dvcmQ6
--> MTIz
235 2.0.0 Authentication successful
--> MAIL FROM:<quota@turbogaz.net>
250 2.1.0 Ok
--> RCPT TO:<alex@turbogaz.net>
553 5.7.1 <quota@turbogaz.net>: Sender address rejected:
not owned by user alex@turbogaz.net
--> QUIT
221 2.0.0 Bye
Для того, чтобы получить данные для LOGIN аутентификации выполните следующее:
# echo -n alex@turbogaz.net | mimencode -b
YWxleEB0dXJib2dhei5uZXQ=
# echo -n 123 | mimencode -b
MTIz
Утилиту mimencode можно установить из портов - /usr/ports/converters/mmencode
На этом базовую настройку МТА можно считать завершенной.
После настройки MTA рекомендую проверить систему на http://test.nettools.ru/, на возможность использования почтового сервера в качестве пересыльщика почты (mail relay). В поле Mail Relay вводим ip или dns имя своего почтового сервера и нажимаем на кнопку ОК. После некоторого времени система напишет результат. Если все настроено правильно, то мы должны увидеть следующую страницу.
Если у вас такое же сообщение, то поздравляю вас, ваша почтовая система готова к работе.
Dec 17 22:56:23 net postfix/smtpd[831]: A58FB1CC9C: reject:
DATA from client=mail.turbogaz.net[217.20.223.100]: 503 5.5.0 <DATA>:
Data command rejected: Improper use of SMTP command pipelining;
from=<> to=<test@turbogaz.net> proto=ESMTP helo=<mail.turbogaz.net>
Dec 17 22:56:23 net postfix/smtpd[831]: warning: non-SMTP command
from client=mail.turbogaz.net[217.20.223.100]: To: test@turbogaz.net
Для того чтобы решить эту проблему необходимо заменить файл functions.inc.php.
DEBUG INFORMATION:
MySQL 4.1 functions not available!
database_type = 'mysqli' in config.inc.php, are you using a different database?
Please check the documentation and website for more information.
Исправляется данная ошибка путем установления $CONF['database_type'] = 'mysql';
[1] postfix
[2] mysql
[3] cyrus-sasl
[4] courier-imap
[5] courier-authlib
[6] openssl
[7] postfixadmin
[8] apache
[9] php
Дата последнего обновления: 25.12.2006 12:06:20. |
Copyright ╘ 2006. Доморадов Алексей. Все права защищены. |