Почтовый сервер Postfix+MySql+Postfixadmin (FreeBSD)

В данной статье будет описан подробный процесс установки и настройки почтового сервера для локальной сети на основе FreeBSD 8.2
Собственно сам почтовый сервер будет у нас в следующей конфигурации.


1. FreeBSD 8.2-STABLE i386
2. Postfix
3. Postfixadmin
4. Cyrus-SASL
5. Courier-IMAP
6. MySql
7. Apache 2.2
8. PHP 5.2
9. Bind 9.8

И так начнем.
1. Обновим систему до STABLE, а так же соберем ядро со следующими опциями.01 ...
02 options IPFIREWALL
03 options IPFIREWALL_VERBOSE
04 options IPFIREWALL_VERBOSE_LIMIT=10
05 options IPFIREWALL_DEFAULT_TO_ACCEPT
06 options IPFIREWALL_FORWARD
07 options IPDIVERT
08 options DUMMYNET
09 options HZ=1000
10
11 # Network options
12 options DEVICE_POLLING
13 options BPF_JITTER
14 ..


Здесь мы включим в наше ядро поддержку IPFW, он нам в дальнейшем понадобится. Как собирать ядро, хорошо описано в handbook, так что этот момент я описывать не буду.
Так же обновим порты.

1. Устанавливаем openssl. Он нам понадобится для генерации сертификатов/ключей, а также для поддержки SSL/TLS.1 # cd /usr/ports/security/openssl/
2 # make install clean


2. Устанавливаем и настраиваем MySQL. В базе данных мы будем хранить информацию о пользователях и почтовых ящиках.1 # cd /usr/ports/databases/mysql51-server/
2 # make install clean
3 # rehash


2.1. Производим первоначальную настройку MySQL сервера. Настраиваем запуск mysql вместе с системой и запустим MySql1 # echo ‘mysql_enable=»YES»‘ >> /etc/rc.conf
2 # /usr/local/etc/rc.d/mysql-server start


Так же воспользуемся скриптом для настройки безопасности MySQL сервера, где устанавливаем пароль для доступа к БД1 # /usr/local/bin/mysql_secure_installation


3. Создаем БД postfix для пользователя postfix и паролем postfix1 mysql>CREATE DATABASE postfix;
2 mysql>CREATE USER 'postfix'@'localhost' IDENTIFIED BY 'postfix';
3 mysql>GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';


4. Собираем и настраиваем Cyrus-SASL. Данную библиотеку мы будем использовать для SMTP аутентификации.01 # cd /usr/ports/security/cyrus-sasl2/
02 # make config
03
04 [X] MYSQL Use MySQL │ │
05 [X] LOGIN Enable LOGIN authentication │ │
06 [X] PLAIN Enable PLAIN authentication │ │
07 [X] CRAM Enable CRAM-MD5 authentication │ │
08 [X] DIGEST Enable DIGEST-MD5 authentication │ │
09
10 # make install clean
11 # rehash


5. Делаем автоматический запуск authdaemond при старте системы1 # echo ‘courier_authdaemond_enable=»YES»‘ >> /etc/rc.conf


6. Настраиваем courier-authlib. Для этого редактируем два конфигурационных файла authdaemonrc и authmysqlrc до следующего содержания:1 # cat /usr/local/etc/authlib/authdaemonrc | grep -v ^# | grep -v ^$
2 authmodulelist="authmysql"
3 authmodulelistorig="authmysql"
4 daemons=5
5 authdaemonvar=/var/run/authdaemond
6 subsystem=mail
7 DEBUG_LOGIN=3
8 DEFAULTOPTIONS="wbnodsn=1"
9 LOGGEROPTS=""


и01 # cat /usr/local/etc/authlib/authmysqlrc | grep -v ^# | grep -v ^$
02 MYSQL_SERVER 127.0.0.1
03 MYSQL_USERNAME postfix
04 MYSQL_PASSWORD postfix
05 MYSQL_SOCKET /tmp/mysql.sock
06 MYSQL_OPT 0
07 MYSQL_DATABASE postfix
08 MYSQL_CHARACTER_SET utf8
09 MYSQL_USER_TABLE mailbox
10 MYSQL_CRYPT_PWFIELD password
11 MYSQL_CLEAR_PWFIELD password
12 MYSQL_UID_FIELD '2000'
13 MYSQL_GID_FIELD '2000'
14 MYSQL_LOGIN_FIELD username
15 MYSQL_HOME_FIELD '/var/spool/mail'
16 MYSQL_NAME_FIELD name
17 MYSQL_MAILDIR_FIELD maildir
18 MYSQL_QUOTA_FIELD quota
19 MYSQL_WHERE_CLAUSE active='1'


7. Запускаем authdaemond1 # /usr/local/etc/rc.d/courier-authdaemond start


Если все правильно то в log-файле должно быть следующее1 authdaemond: modules=»authmysql», daemons=5
2 authdaemond: Installing libauthmysql
3 authdaemond: Installation complete: authmysql


8. Устанавливаем и настраиваем courier-imap.1 # cd /usr/ports/mail/courier-imap/
2 # make confi
3
4 [X] TRASHQUOTA Include deleted mails in the quota │ │
5 [X] AUTH_MYSQL MySQL support │ │
6
7 # make install clean


В зависимости от того, что вы хотите использовать pop3 или imap, редактируем соответствующие файлы. У нас используется pop3, редактируем следующий файл /usr/local/etc/courier-imap/pop3d01 # cat /usr/local/etc/courier-imap/pop3d | grep -v ^# | grep -v ^$
02 PIDFILE=/var/run/pop3d.pid
03 MAXDAEMONS=40
04 MAXPERIP=4
05 POP3AUTH="CRAM-MD5 PLAIN LOGIN CRAM-SHA1"
06 POP3AUTH_ORIG="CRAM-MD5 PLAIN LOGIN CRAM-SHA1"
07 POP3AUTH_TLS="CRAM-MD5 PLAIN LOGIN CRAM-SHA1"
08 POP3AUTH_TLS_ORIG="CRAM-MD5 PLAIN LOGIN CRAM-SHA1"
09 POP3_PROXY=0
10 PORT=110
11 ADDRESS=0
12 TCPDOPTS="-nodnslookup -noidentlookup"
13 LOGGEROPTS="-name=pop3d"
14 DEFDOMAIN="@domain.local"
15 POP3DSTART=YES
16 MAILDIRPATH=Maildir


Далее настраиваем автоматический запуск pop сервера при старте системы, и запутим его:1 # echo ‘courier_imap_pop3d_enable=»YES»‘ >> /etc/rc.conf
2 # /usr/local/etc/rc.d/courier-imap-pop3d.sh start


Проверяем, запустился ли pop3 сервер1 # sockstat | grep :110
2 root couriertcp 1552 3 tcp4 *:110 *:*


9. Собираем Postfix01 # cd /usr/ports/mail/postfix
02 # make config
03
04 │[X] PCRE Perl Compatible Regular Expressions │ │
05 │[X] SASL2 Cyrus SASLv2 (Simple Auth. and Sec. Layer) │ │
06 │nX] TLS Enable SSL and TLS support │ │
07 │[X] MYSQL MySQL maps (choose version with WITH_MYSQL_VER) │ │
08 │[X] VDA VDA (Virtual Delivery Agent 32Bit) │ │
09
10 # make install clean
11 # rehash


В конце установки на вопрос
[b]
Would you like to activate Postfix in /etc/mail/mailer.conf [n]?
[/b]
Отвечаем [b]yes.[/b]

Отключаем запуск sendmail при старте системы, иначе postfix и sendmail будут конфликтовать между собой. Для этого добавляем следующие строчки в rc.conf1 # cat /etc/rc.conf | grep sendmail
2 sendmail_enable=»NO»
3 sendmail_submit_enable=»NO»
4 sendmail_outbound_enable=»NO»
5 sendmail_msp_queue_enable=»NO»


Отключаем специфические для sendmail опции01 # touch /etc/periodic.conf
02 # cat /etc/periodic.conf
03 daily_clean_hoststat_enable=»NO»
04 daily_status_mail_rejects_enable=»NO»
05 daily_status_include_submit_mailq=»NO»
06 daily_submit_queuerun=»NO»
07 1
08 В принципе это все вы увидите когда соберете postfix.
09 Теперь перейдем непосредственно к самомой настройки postfix
10
11 10 Редактируем конфигурационный файл postfix, а именно main.cf
12 1
13 #
14 # /usr/local/etc/postfix/main.cf
15 #
16 queue_directory = /var/spool/postfix
17 base = /usr/local/etc/postfix
18 daemon_directory = /usr/local/libexec/postfix
19 mail_owner = postfix
20 default_privs = nobody


# Задает имя хоста в формате FQDN. По умолчанию, используется значение,
# возвращаемой функцией gethostname().1 myhostname = mail.domain.local


# Задает имя нашего домена. По умолчанию используется значение $myhostname
# минус первый компонент.1 mydomain = domain.local
2 myorigin = $mydomain


# Указывает адреса сетевых интерфейсов, на которых будет принимать почту
# наша почтовая система. По умолчанию используются все активные интерфейсы
# на машине. При изменении этого праметра необходимо перезапустить postfix01 inet_interfaces = all
02 mydestination = $myhostname, localhost.$mydomain, localhost
03 local_recipient_maps = unix:passwd.byname $alias_maps
04 mynetworks = 127.0.0.0/8
05 alias_maps = hash:/etc/aliases
06 alias_database = hash:/etc/aliases
07 smtpd_banner = $myhostname ESMTP
08 debug_peer_level = 2
09
10 smtpd_client_restrictions = permit_mynetworks,
11 permit_sasl_authenticated,
12 check_client_access hash:$base/client_access,
13
14 smtpd_helo_restrictions = check_helo_access hash:$base/hello_access,
15 permit_mynetworks,
16 permit_sasl_authenticated,
17 smtpd_sender_restrictions = permit_mynetworks,
18 check_sender_access hash:$base/sender_access,
19 reject_authenticated_sender_login_mismatch,
20 reject_unlisted_sender,
21 reject_unverified_sender
22 smtpd_recipient_restrictions = permit_mynetworks,
23 permit_sasl_authenticated,
24 reject_unauth_destination,
25 check_recipient_access hash:$base/recipient_access,
26 reject_unlisted_recipient,
27 reject_unknown_recipient_domain,
28 reject_non_fqdn_recipient,
29 reject_unverified_recipient
30 smtpd_etrn_restrictions = reject
31 smtpd_reject_unlisted_sender = yes
32 disable_vrfy_command = yes
33 strict_rfc821_envelopes = yes
34 show_user_unknown_table_name = no
35 address_verify_sender = <>
36 unverified_sender_reject_code = 550
37 smtpd_helo_required = yes
38 smtp_always_send_ehlo = yes
39 smtpd_hard_error_limit = 8
40 smtpd_sasl_auth_enable = yes
41 smtpd_sasl_application_name = smtpd
42 broken_sasl_auth_clients = yes
43 smtpd_sasl_security_options = noanonymous
44 smtpd_sender_login_maps = mysql:$base/mysqlLookupMaps/sender.conf


# Указываем, где postfix должен брать информацию о алиасах1 virtual_alias_maps = mysql:$base/mysqlLookupMaps/alias.conf


# Указываем, где postfix должен брать информацию о доменах1 virtual_mailbox_domains = mysql:$base/mysqlLookupMaps/domain.conf


# Указываем, где postfix должен брать информацию о почтовых ящиках1 virtual_mailbox_maps = mysql:$base/mysqlLookupMaps/mailbox.conf
2 virtual_mailbox_base = /var/spool/mail


# Настраиваем поддержку квот1 virtual_mailbox_limit_maps = mysql:$base/mysqlLookupMaps/quota.conf
2 virtual_maildir_extended=yes
3 virtual_mailbox_limit_override=yes
4 virtual_create_maildirsize = yes
5 virtual_overquota_bounce = yes
6 virtual_maildir_limit_message=»Sorry, the user’s maildir has overdrawn his diskspace quota, please try again later»


# Ограничиваем максимальный размер письма до 50 Мб1 message_size_limit = 5242880


# 2000 – uid и gid пользователя и группы virtual соответственно1 virtual_gid_maps = static:2000
2 virtual_uid_maps = static:2000
3 virtual_minimum_uid = 1000


Указываем postfix, как производить аутентификацию пользователей. Для этого создаем файл smtpd.conf со следующим содержимым:

# cat /usr/local/lib/sasl2/smtpd.conf01 pwcheck_method: auxprop
02 mech_list: CRAM-MD5 DIGEST-MD5 PLAIN LOGIN
03 auxprop_plugin: sql
04 sql_usessl: no
05 sql_engine: mysql
06 sql_hostnames: localhost
07 sql_user: postfix
08 sql_passwd: postfix
09 sql_database: postfix
10 sql_select: select password from mailbox where username = ‘%u@%r’
11 log_level: 3


11. Инициализируем базу данных псевдонимов1 # /usr/local/bin/newaliases


Создаем необходимые файлы1 # cd /usr/local/etc/postfix
2 # touch hello_access sender_access
3 # touch recipient_access client_access
4 # postmap hello_access
5 # postmap sender_access
6 # postmap recipient_access
7 # postmap client_access
8 # mkdir /usr/local/etc/postfix/mysqlLookupMaps


]
# cat /usr/local/etc/postfix/mysqlLookupMaps/alias.conf1 user = postfix
2 password = postfix
3 hosts = localhost
4 dbname = postfix
5 table = alias
6 select_field = goto
7 where_field = address


# cat /usr/local/etc/postfix/mysqlLookupMaps/domain.conf1 user = postfix
2 password = postfix
3 hosts = localhost
4 dbname = postfix
5 table = domain
6 select_field = domain
7 where_field = domain
8 additional_conditions = and active = ’1′ and backupmx = ’0′


# cat /usr/local/etc/postfix/mysqlLookupMaps/mailbox.conf1 user = postfix
2 password = postfix
3 hosts = localhost
4 dbname = postfix
5 table = mailbox
6 select_field = maildir
7 where_field = username
8 additional_conditions = and active = ’1′


# cat /usr/local/etc/postfix/mysqlLookupMaps/quota.conf1 user = postfix
2 password = postfix
3 hosts = localhost
4 dbname = postfix
5 table = mailbox
6 select_field = quota
7 where_field = username
8 additional_conditions = and active = ’1′


# cat /usr/local/etc/postfix/mysqlLookupMaps/sender.conf1 user = postfix
2 password = postfix
3 hosts = localhost
4 dbname = postfix
5 table = mailbox
6 select_field = username
7 where_field = username
8 additional_conditions = and active = ’1′


12. Создаем папку, где у нас будет храниться почта, и выставляем необходимые права.1 # chown -R root:postfix /usr/local/etc/postfix/mysqlLookupMaps/
2 # chmod 440 /usr/local/etc/postfix/mysqlLookupMaps/*.conf
3 # chmod 550 /usr/local/etc/postfix/mysqlLookupMaps/
4 # pw group add virtual -g 2000
5 # pw user add virtual -g virtual -s /sbin/nologin -u 2000
6 # mkdir /var/spool/mail
7 # chown virtual:virtual /var/spool/mail/
8 # chmod 740 /var/spool/mail/


13. Настраиваем запуск postfix вместе с системой и запустим его.1 # echo ‘postfix_enable=»YES»‘ >> /etc/rc.conf
2 # /usr/local/etc/rc.d/postfix start


14. Устанавливаем веб сервер Apache, он нам понадобится для postfixadmin.1 # cd /usr/ports/www/apache22/
2 # make install clean


]
Настраиваем автоматический запуск apache сервера при старте системы1 # echo ‘apache2_enable=»YES»‘ >> /etc/rc.conf


15. Устанавливаем php.1 # cd /usr/ports/lang/php52
2 # make config
3
4 │[X] CLI Build CLI version │ │
5 │[X] APACHE Build Apache module │ │
6 │[X] SUHOSIN Enable Suhosin protection system (not for jails) │ │
7
8 # make install clean


В самом конце установки обращаем внимание на следующие строчки01 ***************************************************************
02
03 Make sure index.php is part of your DirectoryIndex.
04
05 You should add the following to your Apache configuration file:
06
07 AddType application/x-httpd-php .php
08 AddType application/x-httpd-php-source .phps
09
10 ***************************************************************


Далее создадим файл php.conf и добавим то что написанно выше:1 #cd /usr/local/etc/apache22/Includes
2 #touch php.conf
3 #cat php.conf
4 AddType application/x-httpd-php .php
5 AddType application/x-httpd-php-source .phps
6 #


Создаем php.ini и изменяем под свои нужды.1 # cd /usr/local/etc
2 # cp php.ini-dist php.ini


16. Ставим Php-extentions.01 # cd /usr/ports/lang/php52-extensions/
02 # make config
03
04 [X] BZ2
05 [X] DOM
06 [X] GD
07 [X] GETTEXT
08 [X] ICONV
09 [X] IMAP
10 [X] MBSTRING
11 [X] MYSQLI
12 [X] PCRE
13 [X] POSIX
14 [X] SESSION
15 [X] SPL
16 [X] XML
17 [X] ZLIB
18
19 # make install clean
20 # rehash


Запускаем apache1 # /usr/local/etc/rc.d/apache22 start


17. Ставим Postfixadmin.1 # cd /usr/ports/mail/postfixadmin
2 # make config
3 Здесь влюкчам поддружку MySql
4 #make install clean
5 #rehash


Дале создаем отдельный виртуалхост для postfixadmin.
Редактируем /usr/local/etc/apache22/extra/httpd-vhosts.conf01 <VirtualHost *:80>
02 ServerName mail.domain
03 ServerAlias mail.domain.local
04 ErrorLog /var/log/mail_httpd.log
05 DocumentRoot /usr/local/www/postfixadmin
06
07 <Directory /usr/local/www/postfixadmin>
08 Options Indexes
09 AllowOverride All
10 Allow from 192.168.0.0/24
11 DirectoryIndex index.php
12 </Directory>
13
14 </VirtualHost>


18. Редактируем файл /usr/local/www/postfixadmin/config.inc.php1 $CONF['postfix_admin_url'] = ‘http://mail.domain,local’;
2 $CONF['database_type'] = ‘mysql’;
3 $CONF['database_host'] = ‘localhost’;
4 $CONF['database_user'] = ‘postfix’;
5 $CONF['database_password'] = ‘postfix’;
6 $CONF['database_name'] = ‘postfix’;
7 $CONF['database_prefix'] = »;


19. Ставим Bind 9.801 # cd /usr/ports/dns/
02 # cd bind98
03 #make config
04
05 │[X] SSL Building without OpenSSL removes DNSSEC │ │
06 │[X] LINKS Create conf file symlinks in /usr │ │
07 │[X] XML Support for xml statistics output │ │
08 │[X] REPLACE_BASE Replace base BIND with this version │ │
09 │[X] SIGCHASE dig/host/nslookup will do DNSSEC validation │ │
10 │[X] THREADS Compile with thread support │ │
11
12 #make install clean


Добаввим в rc.conf следующие параметры для запуска наего bind:01 named_enable="YES"
02 named_flags="-u bind"
03 named_program="/usr/sbin/named" # Path to named, if you want a different one.
04 named_conf="/etc/namedb/named.conf" # Path to the configuration file
05 named_uid="bind" # User to run named as
06 named_chrootdir="/var/named" # Chroot directory (or "" not to auto-chroot it)
07 named_chroot_autoupdate="YES" # Automatically install/update chrooted
08 # components of named. See /etc/rc.d/named.
09 named_symlink_enable="YES" # Symlink the chrooted pid file
10 named_wait_host="localhost" # Hostname to check if named_wait is enabled


Теперь настроим зоны(далее будет простой пример зон):

Переходим в каталог /etc/namedb/1 #cd /etc/namedb/
2 #cd masters
3 #touch localhost.rev


Содерджание файла localhost.rev01 # cat localhost.rev
02 $TTL 3600
03
04 @ IN SOA ns.domain.local. root.domain. (
05 2001220200 ; Serial
06 3600 ; Refresh
07 900 ; Retry
08 3600000 ; Expire
09 3600 ) ; Minimum
10 IN NS ns.domain.local.
11 1 IN PTR localhost.domain.local.


Добавим еще два файла: domai.local и domain.local.rev01 #cat domain.local
02 $TTL 3600
03 @ IN SOA ns.domain.local. root.domain. (
04 2008071001; Serial
05 3600 ; Refresh
06 900 ; Retry
07 360000 ; Expire
08 3600 ) ; Minimum
09
10 IN NS ns.domain.local.
11 IN MX 10 mail.domain.
12
13 localhost IN A 127.0.0.1
14 domain.local IN A 192.168.0.228
15 HINFO "INTEL P4" "FreeBSD"
16 ns IN A 192.168.0.228
17 mail IN A 192.168.0.228
18 mail.domain IN A 192.168.0.228
19 marina IN A 192.168.0.209
20 anuta IN A 192.168.0.208
21 backup IN A 192.168.0.212
01 # cat domain.local.rev
02 $TTL 3600
03
04 @ IN SOA ns.domain.local. root.domain.local. (
05 20060204 ; Serial
06 3600 ; Refresh
07 900 ; Retry
08 3600000 ; Expire
09 3600 ) ; Minimum
10 @ IN NS ns.domain.local.
11 208 IN PTR anuta.
12 209 IN PTR marina.
13 212 IN PTR backup.


Теперь отредактируем файл named.conf
Добавим в конец файла наши зоны:01 zone "0.0.127.in-addr.arpa" {
02 type master;
03 file "/etc/namedb/master/localhost.rev";
04 allow-transfer { 127.0.0.1; };
05 allow-query { 127.0.0.1; };
06 };
07
08 zone "domain.local" { type master; file "/etc/namedb/master/domain.local"; };
09
10 zone "0.168.192.in-addr.arpa" {
11 type master;
12 file "/etc/namedb/master/domain.local.rev";
13 allow-transfer { 127.0.0.1; 192.168.0.228; };
14 allow-query { 127.0.0.1; 192.168.0.228; };
15 };


Вот и все, теперь проверим конфигурацию на наличие ошибок:1 # named-checkconf
2 #/etc/rc.d/named start


если все ок, то на экране мы ни чего не увидим, для проверки просмотрим журнал, tail -10 /var/log/messages, если ошибок нет, то мы настроили все верно.

для проверки:01 # nslookup mail
02 Server: 192.168.0.228
03 Address: 192.168.0.228#53
04
05 Name: mail.domain.local
06 Address: 192.168.0.228
07 или
08 #nslookup mail.domain.local
09 Server: 192.168.0.228
10 Address: 192.168.0.228#53
11
12 Name: mail.domain.local
13 Address: 192.168.0.228


как видим все работает корректно.

Теперь перегружаем apache и пробуем открыть главную страницу postfixadmin – http://mail.domain.local/, если удаось зайти, то у вас все правильно настроено. Если мы производим настройку первый раз, то нам предлагают перейти по ссылке setup. После настройки удаляем файл setup.php. Теперь приступать к тесту почтовой системы, ошибки в работе системы смотрим здесь: /var/log/maillog

Стаья была напсиани с использованеим следующих материалов http://www.unixlife.net/?p=125, а так же http://opennet.ru, были внесены дополнения и корректировки. Система является рабочей.

Обновлено: 12.03.2015