Воскресенье, 13 Май 2012 16:15

Настройка домашнего сервера, выполняющего роли веб-сервера, почтового сервера и фтп-сервера. Этап 3.

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

Этап 3. Настройка почтового сервера.

Для почтового сервера я выбрал, пожалуй, самую популярную связку: postfix+dovecot2+spamassassin+postfixadmin+roundcube. Не хватает антивирусника, но мне он реально не нужен, поскольку я сижу на линуксе что дома, что на работе. В настройке этого всего мне помогли вот эти статьи:

http://www.sys-adm.org.ua/mail/dovecot.php
http://vladimir-stupin.blogspot.com/2009/11/postfix-dovecot-postfixadmin.html
http://bozza.ru/art-170.html
http://www.opennet.ru/docs/RUS/postfix_soho
http://extmemory.blogspot.com/2010/01/spamassassin.html
http://gq.net.ru/2007/02/23/spamassassin-howto
http://www.samag.ru/archive/article/559
http://www.opennet.ru/base/net/spamassassin_mysql.txt.html
http://help-host.ru/ispmanager/admins-servers/41-ustanovka-roundcube-na-freebsd.html
http://mdex-nn.ru/page/nastrojka-pochtovogo-veb-interfejsa-roundcube

Начнём с установки postfix, который по зависимостям должен сразу же и dovecot за собой вытянуть:

cd /usr/ports/mail/postfix
make install clean

Опции сборки:

Опции сборки зависимостей:

Хочу сразу обратить ваше внимание на сборку cyrys-sasl 2! Оставляйте опции по умолчанию, не ставьте поддержку mysql. Если поставите поддержку mysql, то при приёме-отправке почты у вас будет вылазить вот такая ошибка:

auxpropfunc error no mechanism available

Информация взята вот из этих источников:

http://www.cyberciti.biz/faq/postfix-sql_select-option-missing-auxpropfunc-error
http://blog.mydream.com.hk/howto/linux/auxpropfunc-error-no-mechanism-available-errors

Продолжаем про опции зависимостей:

В конце установки будет показан вот такой вопрос:

Would you like to activate Postfix in /etc/mail/mailer.conf [n]?

Если хотим полностью заменить текущий MTA Sendmail на Postfix, то отвечаем: "y". Я так и ответил. А в rc.conf добавляем вот это:

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
postfix_enable="YES"
dovecot_enable="YES"

Сразу к конфигурированию постфикса пока не будем приступать. Я сначала установил postfixadmin и создал в нём домен и ящики. Поэтому, ставим postfixadmin:

cd /usr/ports/mail/postfixadmin
make install clean

Опции сборки по умолчанию оставляем, поскольку поддержка mysql стоит по умолчанию. После установки в каталоге /usr/local/www появится каталог postfixadmin. Здесь уже кому как удобнее будет: кто-то захочет создать дополнительную секцию в nginx для этого ресурса, кто-то — вообще виртуальный домен. Кому как нравится. Но я сделал проще: я создал каталог /usr/local/www/mysite/mailadmin и в него скопировал всё содержимое из каталога postfixadmin. Права дать на этот каталог не забыл:

chown -R www:www mailadmin

Теперь, в моём случае, я смогу заходить в постфиксадмин по адресу: http://192.168.0.100/mailadmin. Но для этого надо сначала сконфигурировать postfixadmin. Редактирую файл /usr/local/www/mysite/mailadmin/config.inc.php (привожу лишь те строчки, в которые вносил изменения):

$CONF['configured'] = true;
$CONF['setup_password'] = 'ваш пароль';
$CONF['postfix_admin_url'] = 'https://example.com/mailadmin';
$CONF['postfix_admin_path'] = '/usr/local/www/mysite/mailadmin';
$CONF['default_language'] = 'ru';

// здесь, почему-то надо писать именно mysqli, хоть у нас и mysql база будет.
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'ваш пароль на базу mysql, которую мы потом создадим для постфиксадмина';
$CONF['database_name'] = 'postfix';

// Этот адрес будет использован для отправлния письма при создании нового ящика.
$CONF['admin_email'] = 'admin@example.com';

// исли в строчке ниже прописано что-то другое, то обязательно ставим так:
$CONF['encrypt'] = 'md5crypt';

// строчки ниже редактируйте на своё усмотрение
$CONF['default_aliases'] = array (
'abuse' => 'abuse@example.com',
'hostmaster' => 'hostmaster@example.com',
'postmaster' => 'postmaster@example.com',
'webmaster' => 'webmaster@example.com'
);

// Чтобы письма располагались по структуре: ~/domain/user
$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';

// Квота по умолчанию в мегабайтах. Мне квота не нужна.
$CONF['aliases'] = '0';
$CONF['mailboxes'] = '0';
$CONF['maxquota'] = '0';

// Разрешить редактировать тип домена
$CONF['transport'] = 'YES';

// Управление псевдонимом для суперадмина
$CONF['alias_control'] = 'YES';

$CONF['user_footer_link'] = "https://example.com/mailadmin/main";
$CONF['footer_text'] = 'Return to example.com/mailadmin';
$CONF['footer_link'] = 'https://example.com/mailadmin';

// эти параметры выставляем так потому, что у нас dovecot
$CONF['create_mailbox_subdirs_prefix']='';
$CONF['new_quota_table'] = 'YES';

Теперь, нам надо сделать базу данных для постфиксадмина. Делаем:

mysql -p
CREATE DATABASE `postfix` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON postfix.* TO 'postfix'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;

Теперь попробуем зайти вот по такой ссылке, чтобы запустился процесс настройки: http://192.168.0.100/mailadmin/setup.php И если всё сделали правильно, то должны увидеть вот это:

А если эту страничку пролистнуть вниз, то увидим приглашение с названием «Create superadmin account». Вводим:

Однако, после того, как нажмём кнопку «добавить администратора», у нас вылезет вот такая ошибка:

Это он просит подправить в конфиге параметр пароля, который мы там ввели в открытом виде. Нам нужно вставить пароль в том виде, в котором нас просит setup. И вот уже после того, как вы поправите в конфиге пароль, вы сможете создать учётную запись администратора. ВНИМАНИЕ! В моём случае, когда я поправил пароль в конфиге, достаточно было лишь обновить страничку в браузере (Firefox), и у меня сразу появилось уведомление:

Т.е., повторю, я не вбивал снова в эти поля пароль и т.д. — я просто обновил страничку в браузере, и учётная запись добавилась. После чего, можно, используя эту созданную учётку, переходить по адресу: http://192.168.0.100/mailadmin и настраивать домен и ящики пользователей. Да, и не забываем удалить файл /usr/local/www/mysite/mailadmin/setup.php, когда уже всё благополучно настроили.

После того, как настроите домен, пользователей и всё остальное, нужно будет сделать кое-что ещё. Дело в том, что postfixadmin не умеет сам себя перенаправлять в режим https (ну, по крайней мере, я не нашёл, как это делать.). А ведь это существенно повысит безопасность. Чтобы заходя на страничку http://192.168.0.100/mailadmin срабатывало перенаправление в режим https, надо в конфиг nginx внести кое-какую правку. Итак, находим в нём первую секцию server (который работает по порту 80) и, где-нибудь, после строчек

root /usr/local/www/mysite;
 index index.php;

добавляем вот такую конструкцию:

location ~ .*/mailadmin {
           if ($ssl_protocol = "") {
            rewrite .* https://example.com/mailadmin break;
           }
        }

Сохраняем и перезапускаем nginx. После чего, пробуем чего у нас получилось. На этом, с настройкой postfixadmin всё.

Переходим к настройке самого Postfix. Нам надо сделать так, чтобы он понимал всё то, что мы насоздавали в постфиксадмине. Для начала, отредактируем конфиг /usr/local/etc/postfix/main.cf (привожу лишь те строчки, которые я редактировал):

myhostname = example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
mydestination = localhost
local_recipient_maps = unix:passwd.byname $alias_maps
mynetworks = 127.0.0.1/32
relay_domains =
alias_maps = hash:/usr/local/etc/aliases
alias_database = hash:/usr/local/etc/aliases
home_mailbox = Mailbox
mail_spool_directory = /usr/home/mail
smtpd_banner = $myhostname ESMTP $mail_name

virtual_alias_maps = mysql:/usr/local/etc/postfix/mysql_virtual_alias_maps.cf
virtual_gid_maps = static:1911
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/usr/local/etc/postfix/mysql_virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_minimum_uid = 1911
virtual_transport = dovecot

virtual_destination_concurrency_limit = 10
# максимальное количество писем, которые почтовик может отправить одновременно.
virtual_destination_recipient_limit = 10
# максимальное количество писем, которые почтовик может принять одновременно.

virtual_uid_maps = static:1911
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
reject_non_fqdn_hostname, reject_non_fqdn_sender, reject_non_fqdn_recipient,
reject_unauth_destination, reject_unauth_pipelining, reject_invalid_hostname
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $mydomain
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = cyrus

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

После редактирования конфига нужно сделать ещё несколько вещей. Создадим пользователя и группу virtual для работы с виртуальными ящиками:

pw group add virtual -g 1911
pw user add virtual -g virtual -s /sbin/nologin -u 1911

gid и uid указываем такие же, как в main.cf указали. Создаём каталоги для локальных и виртуальных ящиков (хотя локальными я и не собираюсь пользоваться):

mkdir /usr/home/mail
mkdir /usr/home/vmail
chown postfix:postfix /usr/home/mail
chown virtual:virtual /usr/home/vmail

Далее, создаём файлы, с помощью которых постфикс сможет считывать данные из базы данных. Напомню, что именно в этой базе хранятся данные о доменах и пользователях, которые мы завели в постфиксадмине. Создаём файл /usr/local/etc/postfix/mysql_virtual_alias_maps.cf с таким содержимым:

user = postfix
password = ваш_пароль_на_базу
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address

Создаём файл /usr/local/etc/postfix/mysql_virtual_domains_maps.cf с содержимым:

user = postfix
password = ваш_пароль_на_базу
hosts = localhost
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'

Создаём файл /usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf с содержимым:

user = postfix
password = ваш_пароль_на_базу
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username

Чтобы работала шифрованная smtp-сессия надо создать самоподписанный доверенный сертификат. Находясь в каталоге /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]:Mr.Technotrance
Organizational Unit Name (eg, section) []:noname
Common Name (eg, YOUR name) []:exapmle.com
Email Address []:yourmail@exapmle.com

Самым важным параметром является значение Common Name — оно должно совпадать с FQDN сервера.
На этом, постфикс пока оставим. Но и запускать его пока не будем. Осталось настроить Dovecot и Spamassassin.

Начнём с довекота. Зайдя в каталог /usr/local/etc/dovecot мы обнаружим, что там нет никаких конфигов. Но зато есть файл README, в котором написано, что конфиги надо скопировать из каталога /usr/local/share/doc/dovecot/example-config/. Так мы и сделаем, но нам от туда не все конфиги понадобятся. Копируем лишь папку conf.d и файлы dovecot-sql.conf.ext и dovecot.conf.

Редактируем dovecot.conf (только те строчки, которые я изменял):

protocols = imap
listen = *
base_dir = /var/run/dovecot/
instance_name = dovecot
login_trusted_networks = 127.0.0.1/32
shutdown_clients = yes

По такому же принципу редактируем dovecot-sql.conf.ext:

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=ваш_пароль_на_базу
default_pass_scheme = MD5-CRYPT
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT local_part FROM mailbox WHERE username = '%u'
iterate_query = SELECT local_part FROM mailbox

По такому же принципу редактируем conf.d/10-auth.conf:

disable_plaintext_auth = no
auth_default_realm = example.com
auth_worker_max_count = 10
auth_mechanisms = plain

# комментируем строчку:
# !include auth-system.conf.ext

# и наоборот, убираем из комментария строчку:
!include auth-sql.conf.ext

По такому же принципу редактируем conf.d/10-logging.conf:

log_path = /var/log/dovecot.log

По такому же принципу редактируем conf.d/10-mail.conf:

mail_location = mbox:/usr/home/vmail/%d/%n
mail_uid = 1911
mail_gid = 1911
first_valid_uid = 1911
last_valid_uid = 1911
first_valid_gid = 1911
last_valid_gid = 1911

По такому же принципу редактируем conf.d/10-master.conf:

default_internal_user = dovecot

service imap-login {
  inet_listener imap {
    port = 143
  } 
  inet_listener imaps {
    #port = 993
    ssl = no 
  }

  service_count = 1
  process_min_avail = 0

service imap {
  # Most of the memory goes to mmap()ing files. You may need to increase this
  # limit if you have huge mailboxes.
  vsz_limit = 384M
    
  # Max. number of IMAP processes (connections)
  #process_limit = 1024
}

service auth {
  unix_listener auth-userdb {
    mode = 0660   
    user = virtual 
    group = virtual
  }
  unix_listener auth-master {
    mode = 0660
    user = virtual 
    group = virtual
  }
  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660   
    user = postfix 
    group = postfix
  }
}

По такому же принципу редактируем conf.d/10-ssl.conf:

ssl = no
# комментируем эти строчки. Не вижу смысла включать тут ssl, поскольку к имапу будет подключение только с локального хоста.
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem

По такому же принципу редактируем conf.d/15-lda.conf:

hostname = example.com

По такому же принципу редактируем conf.d/20-imap.conf:

imap_id_send = *

По такому же принципу редактируем conf.d/auth-sql.conf.ext:

args = /usr/local/etc/dovecot/dovecot-sql.conf.ext
args = /usr/local/etc/dovecot/dovecot-sql.conf.ext

Остальные конфигурационные файлы я не трогал, оставляя их настройки по умолчанию.
Теперь установим и настроим Spamassassin. Установка:

cd /usr/ports/mail/p5-Mail-SpamAssassin
make install clean

Опции сборки:

Опции сборки зависимостей, в которых я что-либо менял:

В конце установки будет вот такой вопрос:

Do you wish to run sa-update to fetch new rules [N]?

Я ответил положительно. Также, после установки, появится каталог /usr/local/etc/mail/spamassassin, а в нём можно будет найти файл local.cf.sample. Тут же, сделаем его копию с названием local.cf и уже её отредактируем:

# Список через пробел ящиков-ловушек (у меня таких пока нет, но в будущем наверно сделаю)
# spam@example.com
rewrite_header Subject *****SPAM*****
report_safe 0
trusted_networks 127.0.0.1/32
lock_method flock
required_score 5.0
use_bayes 1
bayes_auto_learn 1
ok_locales ru en

use_pyzor 1
pyzor_options --homedir /usr/home/spamassassin/pyzor/
use_razor2 1
razor_config /usr/local/etc/mail/spamassassin/razor-agent.conf

use_dcc 1
dcc_home /usr/local/dcc
dcc_path /usr/local/bin/dccproc
dcc_timeout 10

# значение при превышении которого письмо будет рассматриваться
# как спам и будет производиться обучение системы анализа. Я пока закоментировал
# bayes_auto_learn_threshold_spam 12.0

# Это оо же самое, но наоборот для писем, которые не являются спамом.
# bayes_auto_learn_threshold_nonspam 0.1

Теперь создаём файл razor-agent.conf вот с таким содержимым:

# See razor-agent.conf (5)
# Change this to 5 for safer classification of MIME attachments. This will let more spam through
logic_method = 4

# Uncomment the next line for logging via syslog
#logfile = sys-syslog
razorhome = /usr/home/spamassassin/razor
debuglevel = 0

В файле v310.pre я закомментировал экспериментальный плагин:

# loadplugin Mail::SpamAssassin::Plugin::ReplaceTags

В файле v312.pre закомментировал ещё один экспериментальный плагин:

# loadplugin Mail::SpamAssassin::Plugin::DKIM

После редактирования конфигов не забываем создать каталоги для работы razor и pyzor:

mkdir /usr/home/spamassassin
mkdir /usr/home/spamassassin/pyzor
mkdir /usr/home/spamassassin/razor
chown -R spamd:spamd /usr/home/spamassassin

Также, надо создать mysql-базу для спамассассина. Незадача в том, что структура таблиц находится в архиве с исходниками, которые нам придётся скачать:

fetch http://www.sai.msu.su/apache//spamassassin/source/Mail-SpamAssassin-3.3.2.tar.bz2

В них и мы найдём каталог sql, который надо скопировать в какое-нибудь удобное место. Затем, перейдём в него и выполним создание базы:

mysql -p
CREATE DATABASE `spamassassin` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON spamassassin.* TO 'spamassassin'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;

После чего создаём в ней структуру таблиц. Делаем команду:

mysql -p spamassassin < userpref_mysql.sql

и получаем ошибку:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM' at line 8

Чтобы это исправить, находим эту самую пресловутую конструкцию 'TYPE=MyISAM' в файлах awl_mysql.sql, bayes_mysql.sql, userpref_mysql.sql и меняем её на такую:

ENGINE=MyISAM;

Затем, благополучно выполняем команды:

mysql -p spamassassin < userpref_mysql.sql
mysql -p spamassassin < bayes_mysql.sql
mysql -p spamassassin < awl_mysql.sql

Всё, база для спамассассина готова. Но чтобы спамассассин умел ею пользоваться, надо создать дополнительный кофигурационный файл рядышком с local.cf. Называться он будет sql.cf, а его содержимое будет таким:

user_scores_dsn DBI:mysql:spamassassin:localhost
user_scores_sql_username spamassassin
user_scores_sql_password ваш пароль на базу
# если будете использовать плагин автоматического создания белого списка, то раскомментируйте эти строчки.
# auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
# user_awl_dsn DBI:mysql:spamassassin:localhost
# user_awl_sql_username spamassassin
# user_awl_sql_password ваш пароль на базу
bayes_store_module Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn DBI:mysql:spamassassin:localhost
bayes_sql_username spamassassin
bayes_sql_password ваш пароль на базу

Также, скрипт запуска надо будет переименовать. Найдите файл /usr/local/etc/rc.d/sa-spamd.
Его надо переименовать просто в spamd.

В файл /etc/rc.conf добавьте строчку, которая будет запускать спамассассин при загрузке:

spamd_enable="YES"

Сейчас, чтобы заработала связка postfix+dovecot+spamassassin, надо отредактировать последний файл /usr/local/etc/postfix/master.cf. В самом верху есть строчка:

smtp      inet  n       -       n       -       -       smtpd

К ней дописываем фильтр. Получится вот так:

smtp      inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin

Затем надо раскомментировать вот эти строчки (также добавив к ним строчку с фильтром):

smtps     inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

И в самый конец добавить вот такие строчки:

dovecot   unix  -    n    n   -   -    pipe
  flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}
spamassassin unix - n n - - pipe
    user=spamd argv=/usr/local/bin/spamc -f -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}

Вот теперь, после всего этого длительного конфигурирования, перезагружаем сервер. Смотрим логи. У меня было всё в порядке, кроме одного — были вот такие уведомления:

no working DCC servers dcc1.dcc-servers.net dcc2.dcc-servers.net dcc3.dcc-servers.net ... at 209.169.14.30 80.91.36.101
dcc: instead of X-DCC header, dccproc returned 'no working DCC servers dcc1.dcc-servers.net dcc2.dcc-servers.net dcc3.dcc-servers.net ... at 209.169.14.30 80.91.36.101'

Чтобы это исправить нужно к серверу открыть порт UDP 6277:

add 00180 pass udp from any 6277 to me

Потом, перезапустив ipfw, выполнить вот такую команду:

cdcc "load /usr/local/dcc/map.txt"

Затем, попробуйте из постфиксадмина отправить письмо на какой-нибудь из своих же ящиков. Если видите ошибку:

postfix/smtpd[1547]: error: open database /usr/local/etc/aliases.db: No such file or directory

То делаем так:

rm -f /etc/aliases.db
mkdir /usr/local/etc/aliases
newaliases

Ещё, у меня была ошибка о том, что постфикс не может получить доступ к логу довекота. Особо разбираться не хотелось, потому просто сделал так:

chmod 666 /var/log/dovecot.log

После чего сервер заработал. Осталось лишь прикрутить вэб-интерфейс roundecube. Установим roundcube:

cd /usr/ports/mail/roundcube
make install clean

Опции сборки:

И сразу же получаем ошибку:

pecl-intl-1.1.2_3 cannot install: doesn't work with PHP version : 52 (Doesn't support PHP 4 52).

Исправить это легко. Находим файл /usr/ports/devel/pecl-intl/Makefile, а в нём находим строчку:

IGNORE_WITH_PHP=4 52

И изменяем её вот так:

IGNORE_WITH_PHP=4

Затем пробуем снова установить roundcube и получаем ещё одну ошибку:

/usr/bin/ld: Warning: size of symbol `datefmt_parse_args' changed from 160 in .libs/php_intl.o to 120 in dateformat/.libs/dateformat_class.o

Эту ошибку разрешаем вот такими действиями:

echo "LICENSES_ACCEPTED+=GPLv2" >> /etc/make.conf
cd /usr/ports/devel/pecl-intl/
make deinstall clean
make clean
rm ./files/*

После чего снова пробуем установить roundcube. В этот раз всё должно завершиться удачно, и в папке /usr/local/www мы увидим каталог roundcube. Но мне бы хотелось ещё установить дополнительную тему оформления. Внешний вид некоторых можно посмотреть вот тут:

http://www.w2a.ru/blog/684.html

Мне понравилась Air. Её и ставлю:

cd /usr/ports/mail/roundcube-air
make install clean

Теперь создадим mysql-базу для роундкуба:

mysql -p
CREATE DATABASE `roundcube` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON roundcube.* TO 'roundcube'@'localhost' IDENTIFIED BY 'my_password' WITH GRANT OPTION;

Потом заходим в каталог /usr/local/www/roundcube/SQL и создаём таблицы в базе:

mysql roundcube -p < mysql.initial.sql

В своём случае, я хочу заходить в почту по адресу https://192.168.0.100/mail, поэтому я копирую всё содержимое каталога /usr/local/www/roundcube в каталог /usr/local/www/mysite/mail. Как я уже и говорил раньше, настройки вэб-сервера под джумлу прекрасно подошли и под roundcube. При этом, обязательно помню, что надо дать соответствующие права на этот каталог:

chown -R www:www mail

Затем, чтобы сделать начальное конфигурирование, захожу по адресу: http://192.168.0.100/mail/installer И если всё работает, то должна появиться вот такая картинка:

Жмём на strat installation. На второй страничке я увидел надпись Intl: NOT AVAILABLE. Тут, наверно, достаточно просто было перезапустить php-fpm, но я перезагрузил весь сервер, после чего установшик больше на это не жаловался.

На второй странице «Create config» я сделал вот такие настройки:

product_name: назовите как-нибудь заголовок вашей страницы
temp не трогал
ip_check не ставил галку
des_key не трогал
enable_caching не имеет смыла, т.к. Imap прямо на этом же сервере.
enable_spellcheck — да, проверку правописания включить
spellcheck_engine выбрал pspell, т.к. не хочу, чтоб моя переписка куда-то в гугл уходила.
identities_level оставил как есть
debug_level — галка Log errors
log_driver — file
log_dir — /var/log/roundcube
Database setup: прописываем нашу базу, логин и пароль к ней
default_host — 127.0.0.1
default_port — 143
username_domain — автоматическое добавление домена к логину пользователя. Пишем свой example.com
auto_create_user — галка стоит
sent_mbox, trash_mbox, drafts_mbox, junk_mbox — каталоги, что будут создаваться в вашем ящике. Я оставил по умолчанию.
smtp_server — 127.0.0.1
smtp_port — 25
smtp_user/smtp_pass не надо ничего вводить, т.к. SMTP-сервер у нас на этом же хосте
smtp_log — снял галку, т.к. хватает и постфиксовских логов.
Language — ru_RU
skin — air
skin_logo — тут можно загрузить лого-картинку вместо стандартной. Но у меня она не готова пока. Потом вручную подменю картинку...
pagesize не менял
prefer_html не менял (отображать сообщения в виде HTML по умолчанию)
preview_pane — поствил галку (отображать панель просмотра сообщений по умолчанию)
htmleditor — создавать сообщения в формате HTML только когда отвечаю на HTML сообщение (последний вариант выбрал)
draft_autosave — сохранение черновика каждые n минут. Я отключил.
mdn_requests — отправлять уведомление о прочтении. Не трогал — пусть меня спрашивает
mime_param_folding — выбрал для аутглюка.

В конце нажимаем кнопку «create config», после чего установщик предложит скачать два конфига и положить их в папку /usr/local/www/mysite/mail/config , что мы и сделаем. А после этого, нажимаем в установщике «continue». Нас перебросит на тестовую страничку, на которой можно протестировать smtp и imap.

ВНИМАНИЕ: если у вас не проходит тест imap, то проверьте настройки в соответствии с тем, как сказано тут:

http://unix4me.ru/archives/1204

Дублирую сюда эту информацию:

при настройке криптации пароля пользователя в связке Postfixadmin+Dovecot+Roundcube необходимо настроить:

В Postfixadmin — config.inc.php:

$CONF['encrypt'] = 'md5crypt';

В Dovecot — 10-auth.conf:

auth_mechanisms = plain

Просто один plain без других видов криптации.

В Dovecot — dovecot-sql.conf.ext:

default_pass_scheme = MD5-CRYPT

В Roundcube — main.inc.php:

$rcmail_config['imap_auth_type'] = CRAM-MD5;

И не забываем создать каталог для логов:

mkdir /var/log/roundcube
chown www:www /var/log/roundcube

Если же все тесты прошли удачно, то давайте ещё немного подправим конфиг /usr/local/www/mysite/mail/config/main.inc.php вручную. Пишу лишь те строчки, что я подправил:

// Log session authentication errors to <log_dir>/session or to syslog. Записывать в лог неудачные попытки авторизоваться.
$rcmail_config['log_session'] = true;

// enforce connections over https. Принудительно переходить в https.
$rcmail_config['force_https'] = true;

// кодировать или нет IP-адрес и имя хоста. Пусть кодирует.
$rcmail_config['http_received_header_encrypt'] = true;

//автоматически создавать папки «входящие», «отправленные» и т.д. Новому пользователю.
$rcmail_config['create_default_folders'] = true;

//Если 0 у вас в системных квотах означает безлимит, ставим истину
$rcmail_config['quota_zero_as_unlimited'] = true;

Сохраняем конфиг и удаляем папку /usr/local/www/mysite/mail/installer Потом пробуем зайти на сервер http://192.168.0.100/mail При этом, вас должно перекинуть на https соединение. Попробуйте попользоваться почтой. Если всё сделали без ошибок, то почта должна работать.

07.06.2013 Добавлено:

После некоторого использования своего почтовика, выявилась одна проблема: когда кто-то шлёт письмо адресату, у которого есть алиас (псевдоним) на сервере, то на этот самый алиас приходит две копии письма. Проблема решается добавлением в конфиг master.cf вот такой строчки:

-o receive_override_options=no_address_mappings

добавляется она после строчки "-o content_filter=spamassassin"

Также была проблема, описанная вот тут:

http://forum.altlinux.org/index.php?topic=10538.0

Заключалась она в том, что если кто-то отправлял письмо на сразу два ящика моего сервера, то это письмо не доходило. Оно направлялось в отложенные письма. У меня она решилась добавлением в main.cf строчки:

dovecot_destination_recipient_limit = 1

При этом, по ссылке выше написано, что после её добавления начали вылазить какие-то ошибки при старте postfix. У меня же никаких ошибок не вылазило Смеюсь 

05.11.2014 Добавлено:

В последние несколько месяцев мой ящик, работающий на моём сервере, начали весьма активно спамить. При этом, spamassassin успешно весь этот спам распазнаёт и ставит метки **SPAM**. Но не удаляет его. Груды спама удалять приходилось вручную каждый раз. И мне это сильно надоело. Поэтому я решил сделать апгрэйд для своей почтовой системы Смеюсь. Задачи я себе поставил следующие:

- Система должна сама класть спамовые письма в папку спам.
- Письма, у которых спамовый балл зашкаливает, должны удаляться сразу.
- В вэб-интерфейсе должна появиться конопочка "пометить как спам" и "пометить как НЕ спам", которая помещает письма в папку СПАМ и убирает письма из этой папки, если они туда попали случайно.
- При этом, система как-то должна обращать внимание на помещаемые вручную письма в папку СПАМ и должна их обрабатывать и обучаться.

Собственно, и не так страшен чёрт, как его малюют. Оказалось, что с первыми двумя задачами отлично справляется почтовый фильтр procmail. А с последними двумя задачами отлично справляется плагин для roundcube, который называется markasjunk2.

Приступаем. Что касается procmail, то его настройку под FreeBSD я уже затрагивал в двух своих статьях:

http://technotrance.su/index.php/moi-stati/freebsd/item/23-mail-gateway-freebsd
http://technotrance.su/index.php/moi-stati/freebsd/item/25-mailgateway-addon

Но тут я систематизирую всю эту информацию с учётом некоторых тонкостей, которые возникли во время настройки. Всё по порядку. Ставим 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

Теперь надо отредактировать файл /usr/local/etc/postfix/master.cf. В него надо добавить следующие строчки:

-o content_filter=procmail:

procmail unix - n n - - pipe flags=Rq user=virtual argv=/usr/local/bin/procmail -f SENDER=${sender} -t RECIPIENT=${recipient} -m USER=${user} DOMAIN=${domain} /usr/local/etc/procmailrc

Чтобы было более наглядно, я приведу весь свой конфиг master.cf и зелёным цветом выделю добавленные строчки, чтобы было видно, где их надо добавить и где закомментировать лишнее.

smtp      inet  n       -       n       -       -       smtpd
#  -o content_filter=spamassassin
  -o content_filter=procmail:
  -o receive_override_options=no_address_mappings
#smtp      inet  n       -       n       -       1       postscreen
#smtpd     pass  -       -       n       -       -       smtpd
#dnsblog   unix  -       -       n       -       0       dnsblog
#tlsproxy  unix  -       -       n       -       0       tlsproxy
#submission inet n       -       n       -       -       smtpd
#  -o syslog_name=postfix/submission
#  -o smtpd_tls_security_level=encrypt
#  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       n       -       -       smtpd
  -o content_filter=spamassassin
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o milter_macro_daemon_name=ORIGINATING

#628       inet  n       -       n       -       -       qmqpd
pickup    fifo  n       -       n       60      1       pickup
cleanup   unix  n       -       n       -       0       cleanup
qmgr      fifo  n       -       n       300     1       qmgr
#qmgr     fifo  n       -       n       300     1       oqmgr
tlsmgr    unix  -       -       n       1000?   1       tlsmgr
rewrite   unix  -       -       n       -       -       trivial-rewrite
bounce    unix  -       -       n       -       0       bounce
defer     unix  -       -       n       -       0       bounce
trace     unix  -       -       n       -       0       bounce
verify    unix  -       -       n       -       1       verify
flush     unix  n       -       n       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       n       -       -       smtp
relay     unix  -       -       n       -       -       smtp
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       -       n       -       -       showq
error     unix  -       -       n       -       -       error
retry     unix  -       -       n       -       -       error
discard   unix  -       -       n       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       n       -       -       lmtp
anvil     unix  -       -       n       -       1       anvil
scache    unix  -       -       n       -       1       scache
#
dovecot   unix  -    n    n   -   -    pipe  flags=DRhu user=virtual:virtual argv=/usr/local/libexec/dovecot/deliver -d ${recipient}
spamassassin unix - n n - - pipe  user=spamd argv=/usr/local/bin/spamc -f -e /usr/local/sbin/sendmail -oi -f ${sender} ${recipient}
procmail unix - n n - - pipe flags=Rq user=virtual argv=/usr/local/bin/procmail -f SENDER=${sender} -t RECIPIENT=${recipient} -m USER=${user} DOMAIN=${domain} /usr/local/etc/procmailrc

И вот тут объясню некоторые тонкости:
Первая — это параметр user=virtual. Это потому, что procmail будет раскладывать письма в каталоги виртуальных пользователей postfix, а на них права есть только у пользователя virtual.
Второй важный момент — это параметры USER=${user} DOMAIN=${domain}, указанные после ключика -m. Он нужны, чтобы procmail понимал переменные $USER и $DOMAIN. Зачем они нужны, будет видно ниже в правилах procmail.

Далее, создаём файл /usr/local/etc/procmailrc и наполняем его вот таким содержимым:

MAILDIR=/usr/local/etc/postfix/procmail
LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/procmail.lock
SHELL=/bin/sh
# отправляем письмо (которое меньше 512КБ) к спамассассину
:0fw
* <512000
| /usr/local/bin/spamc

# вырезаем спамовые письма и кладём в папку "спам", у которых балл от 5 до 7
:0H:
* ^.*----SPAM----.*$
* ^X-Spam-Level: \*\*\*\*(\*|\*\*|\*\*\*)$
/usr/home/vmail/$DOMAIN/$USER/Junk

# всё остальное, у чего балл выше, убиваем.
:0H
* ^.*----SPAM----.*$
* ^X-Spam-Level: \*\*\*\*\*\*\*.*$
/dev/null

# Хорошие же письма отправляем по месту назначения
:0H
* ^.*@mydomain\.domain.*$
! $RECIPIENT

# Последнее правило уничтожает всё остальное
:0
/dev/null

Думаю, что алгоритм обработки писем понятен из комментариев в конфиге.

Не забываем создать рабочий каталог для procmail ! Тот самый, который указали в конфиге постфикса master.cf:

mkdir /usr/local/etc/postfix/procmail
chown virtual:mail /usr/local/etc/postfix/procmail
chmod 770 /usr/local/etc/postfix/procmail

Вот теперь можно перезапускать postfix, чтобы все изменения вступили в силу:

service postfix restart

Теперь postfix будет получать письма, затем будет отдавать их на обработку в procmail, который, в свою очередь, будет отдавать их на проверку к спамассассину и уже после антиспамовой проверки будет направлять их далее: либо резать, либо в папку спам, либо во входящие к адресату.

В логе /usr/local/etc/postfix/procmail/procmail.log всё это дело будет наглядно отражаться. И если у вас спама реально много, то обязательно следует настроить ротацию этого лога. Чтобы это сделать, надо в файл /etc/newsyslog.conf добавить вот такую строчку:

/usr/local/etc/postfix/procmail/procmail.log virtual:mail 600 5 100 * JC

Только, лучше использовать знак табуляции между параметрами.

Теперь, что касается кнопки в вэб-интерфейсе. Сам я пользовался вот этой статьёй:

http://diskstation.ru/viewtopic.php?f=19&t=82

Итак, скачиваем плагин (в виде архива) для roundcube от сюда:

https://github.com/JohnDoh/Roundcube-Plugin-Mark-as-Junk-2/

И кладём содержимое этого архива в каталог plugins/markasjunk2, который внутри каталога с вашим roudcube. У меня это каталог /usr/home/www/mysite/mail/plugins/markasjunk2.

Теперь редактирую конфиг RoundCube home/www/mysite/mail/config/main.inc.php. Нахожу параметр:

$rcmail_config['plugins'] = array();

и дописываю название папки плагина в список

$rcmail_config['plugins'] = array(markasjunk2);

если у вас уже стоят другие плагины, перечисляете их через запятую.

Далее надо отредактировать конфиг плагина. Открываю файл home/www/mysite/mail/plugins/markasjunk2/config.inc.php. Если файла "config.inc.php" нет, то надо создать его из исходного "config.inc.php.dist". Находим параметр:

$rcmail_config['markasjunk2_learning_driver'] = null;

и меняем значение на 'cmd_learn':

$rcmail_config['markasjunk2_learning_driver'] = 'cmd_learn';

дальше находим параметр:

$rcmail_config['markasjunk2_spam_cmd'] = null;

и меняем его на:

$rcmail_config['markasjunk2_spam_cmd'] = 'sa-learn --spam --no-sync --username=%u %f';

где %u - имя пользователя, %f - полный путь к письму. Таким образом мы 'sa-learn' указываем письмо %f как СПАМ, а эти настройки просим применить для пользователя %u.

Аналогично исправляем параметр:

$rcmail_config['markasjunk2_ham_cmd'] = null;

на:

$rcmail_config['markasjunk2_ham_cmd'] ='sa-learn --ham --no-sync --username=%u %f';

это обучит SpamAssassin пропускать нормальную почту.

Чтобы исправить проблему с кодировкой при возврате письма, отмеченного как СПАМ в первоначальный вид, надо сделать следующее: В конфиге роундкуба main.inc.php находим запись:

// Use this charset as fallback for message decoding
$rcmail_config['default_charset'] = 'ISO-8859-1';

И меняем в ней кодировку на UTF-8:

// Use this charset as fallback for message decoding
$rcmail_config['default_charset'] = 'UTF-8';

Также, выяснилось, что возврат письма, отмеченного как спам, работает некорректно. Письмо уходит куда-то налево, а не обратно во входящие. Проблема решилась поправкой в конфиге плагина config.inc.php вот этого параметра:

$config['markasjunk2_ham_mbox'] = inbox;

Прописал явно inbox маленькими буквами.

Ещё одна моя проблема заключалась в том, что у меня стоял старый RoundCube, ещё версии 0.7.2. И плагин markasjunk2 на этой версии роундкуба не работал. При открытии почты получал пустой белый экран.

Чтобы плагин заработал, пришлось обновить роундкуб до последней версии (1.0.3) Обновление прошло без проблем в целом... Скачал архив с новой версией и распаковал его содержимое в каталог, где у меня расположен мой текущий роундкуб 0.7.2, с заменой файлов. Конфиги, при этом, остались старые, и в них я ничего не менял.
Всё, что я подкрутил после этого — это обратно поменял skin на classic. Как-то он мне более привычен уже.

Этап 4. Настройка ФТП-сервера.

Перейти обратно на:
Этап 1
Этап 2

Прочитано 49282 раз Последнее изменение Понедельник, 24 Ноябрь 2014 20:32

You have no rights to post comments

Вы здесь: Home Мои статьи FreeBSD Настройка домашнего сервера, выполняющего роли веб-сервера, почтового сервера и фтп-сервера. Этап 3.