Продолжение первой части установки и настройки корпоративного почтового сервера, в которой мы будет устанавливать и настраивать сначала Dovecot, а затем Postfix.
Настройка Dovecot
Устанавливаем Dovecot с поддержкой MySQL, sieve, IMAP и POP3.
# aptitude install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-managesieved dovecot-pop3d dovecot-sieve dovecot-postfix
Автоматически будет установлен Postfix, дополнительные пакеты для работы Postfix мы установим немного позже. Установщик Postfix попросит ввести первоначальную конфигурацию, просто ответим «Без настройки».
В Ubuntu Server 12.04 dovecot обновился до версии 2.х, в которой конфигурация разнесена по отдельным по отдельным файлам, размещающихся в каталоге /etc/dovecot/conf.d/
. Тогда как в предыдущих версиях вся конфигурация
описывалась в одном файле. На тот момент времени мне было удобнее иметь один конфигурационный файл, а не кучу. Да и к этому времени были уже кое-какие наработки, а так как в текущей версии не запрещалось использовать конфигурацию в одном файле, то и было решено идти проверенным и рабочим способом. Да и не было особо времени разбираться в новой системе хранения конфигурации dovecot. Для начала имеет смысл сделать резервную копию рабочей конфигурации dovecot.
# cd /etc/dovecot
# dovecot -n > dovecot.conf.work
# mv dovecot.conf dovecot.conf.bak
Создадим новый файл конфигурации и приступим к его наполнению.
# nano dovecot.conf
# /etc/dovecot/dovecot.conf
#
# Поддерживаемые протоколы
protocols = pop3 imap lmtp sieve
# Logging
log_timestamp = "%Y-%m-%d %H:%M:%S "
# Вместо syslog будем использовать /var/log/dovecot.log
log_path = /var/log/dovecot.log
# Информационные сообщения будем сохранять в этот же файл
info_log_path = /var/log/dovecot.log
# Отключаем plaintext аутентификацию
disable_plaintext_auth = no
# Включаем ssl
ssl = yes
ssl_cert =
Создадим конфигурационный файл с данными для подключения к базе данных dovecot-sql.conf.
# touch dovecot-sql.conf
driver = mysql
connect = host=localhost dbname=maildbname user=mailadmin password=mailadmin_password
password_query = SELECT username AS user, domain, password FROM mailbox WHERE username = '%u' AND domain = '%d' AND active = 1
user_query = SELECT CONCAT('/home/vmail/', maildir) AS home, 1005 AS uid, 1005 AS gid FROM mailbox WHERE username = '%u' AND domain = '%d' AND active = 1
iterate_query = SELECT username AS user FROM mailbox
где
- maildbname — название базы данных
- mailadmin — имя пользователя базы данных
- mailadmin_password — пароль пользователя mailadmin
Поправим права доступа к лог-файлу /var/log/dovecot.log
# chown vmail:vmail /var/log/dovecot.log
Теперь можно перегрузить dovecot, и убедиться что он работает.
# invoke-rc.d dovecot restart
# netstat -tap | grep dovecot
В результате выполнения последней команды у вас должно отобразиться нечто подобное:
tcp 0 0 *:pop3 *:* LISTEN 18309/dovecot
tcp 0 0 *:imap2 *:* LISTEN 18309/dovecot
tcp 0 0 *:sieve *:* LISTEN 18309/dovecot
tcp 0 0 *:imaps *:* LISTEN 18309/dovecot
tcp 0 0 *:pop3s *:* LISTEN 18309/dovecot
Так же стоит заглянуть в /var/log/dovecot.log
# tail -f /var/log/dovecot.log
Осталось настроить ротацию лог-файла. Создадим файл dovecot в каталоге /etc/logrotate.d/
# cd /etc/logrotate.d
# nano dovecot
Добавим в созданный файл следующее содержимое:
/var/log/dovecot.log {
daily
missingok
rotate 5
compress
delaycompress
notifempty
create 660 vmail vmail
sharedscripts
postrotate
/etc/init.d/dovecot restart > /dev/null
endscript
}
Чтобы посмотреть как это будет работать, выполним команду
# logrotate -d /etc/logrotate.d/dovecot
Посмотрим, что будет происходить при выполнении нашего конфигурационного файла. Теперь осталось посмотреть весь в действии. Выполним команду
# logrotate -v -f /etc/logrotate.d/dovecot
На этом настройка dovecot можно считать завершённой.
Sieve
Пару слов про SIEVE — это эдакий скриптовый язык, позволяющий производить сортировку входящей почты прямо на сервере. Т.е. нет необходимости во всех почтовых клиентах, которые вы используете, прописывать правила для рассовывания писем по папкам — всё делает Dovecot LDA в процессе доставки. Это работает только в том случае, если все ваши почтовые клиенты подсоединяются к почтовому серверу по протоколу IMAP.
ManageSIEVE — это протокол для управления этими скриптами прямо из почтового клиента. Я пользуюсь Thunderbird с соответствующим плагином.
Посмотрите представленные ниже ссылки по SIEVE, и тогда, может быть, вы поймёте и определитесь — нужен вам SIEVE или не нужен.
Настройка Postfix
Так как Postfix у нас уже был установлен вместе с Dovecot, нам необходимо установить ещё несколько дополнительных пакетов.
# aptitude install postfix-mysql postfix-pcre
После завершения скачивания и установки пакетов, перейдём в каталог Postfix, создадим необходимые нам каталоги и файл конфигурации main.cf.
# cd /etc/postfix
# touch main.cf
# mkdir sql
# mkdir config
У нас все пользователи почты виртуальные и учётные записи хранятся в базе данных, поэтому создадим несколько файлов с запросами к базе.
Файл /etc/postfix/sql/mysql_virtual_domains_maps.cf
user = mailadmin
password = mailadmin_password
hosts = localhost
dbname = maildbname
query = SELECT domain FROM domain WHERE domain = '%s' AND active = 1
Файл /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf
user = mailadmin
password = mailadmin_password
hosts = localhost
dbname = maildbname
query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active = 1
Файл /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
user = mailadmin
password = mailadmin_password
hosts = localhost
dbname = maildbname
query = SELECT maildir FROM mailbox, alias_domain WHERE alias_domain.alias_domain = '%d' AND mailbox.username = CONCAT('%u', '@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active = 1
Файл /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
user = mailadmin
password = mailadmin_password
hosts = localhost
dbname = maildbname
query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' AND alias.address = CONCAT('@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active = 1
Файл /etc/postfix/sql/mysql_virtual_mailbox_maps.cf
user = mailadmin
password = mailadmin_password
hosts = localhost
dbname = maildbname
query = SELECT maildir FROM mailbox WHERE username = '%s' AND active = 1
Файл /etc/postfix/sql/mysql_virtual_emails_maps.cf
user = mailadmin
password = mailadmin_password
hosts = localhost
dbname = maildbname
query = SELECT username FROM mailbox WHERE username = '%s' AND active = 1
где
- maildbname — название базы данных
- mailadmin — имя пользователя базы данных
- mailadmin_password — пароль пользователя mailadmin
Выставим права доступа
# chmod 640 /etc/postfix/sql/mysql_*.cf
# chown -R postfix /etc/postfix/sql
Приступим к наполнению конфигурационного файла main.cf.
# /etc/postfix/main.cf
# Common config
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
myhostname = yourmail.domain.com
mydomain = domain.com
inet_interfaces = all
inet_protocols = ipv4
mydestination = $mydomain, $myhostname, localhost.$mydomain, localhost, localhost.localdomain
mynetworks = 127.0.0.0/8, 192.168.0.0/24
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
smtpd_banner = $myhostname ESMTP $mail_name
biff = no
relayhost =
mailbox_size_limit = 0
virtual_mailbox_limit = 0
recipient_delimiter = +
# Проверяем заголовки
header_checks = regexp:/etc/postfix/config/header_checks
mime_header_checks = regexp:/etc/postfix/config/mime_header_checks
# TLS parameters
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# Время, в течении которого письма будут находится в очереди
# Любят у меня пользователи отправлять почту на не существующие
# адреса, чтобы в очереди не висело, поставил 1 день
maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d
queue_run_delay=5m
minimal_backoff_time=5m
maximal_backoff_time=10m
# Ограничение на размер письма в байтах
# Я своим поставил ограничение в 25 мегабайт, хотя больше 20-25 мегабайт
# никто ещё не отправлял
message_size_limit = 26214400
#Дополнительные файлы конфигурации
sql_dir = /etc/postfix/sql
# Таблица просмотра виртуальных доменов
virtual_mailbox_domains = proxy:mysql:$sql_dir/mysql_virtual_domains_maps.cf
# Таблицы просмотра почтовых псевдонимов для виртуальных почтовых доменов/ящиков
virtual_alias_maps = proxy:mysql:$sql_dir/mysql_virtual_alias_maps.cf, proxy:mysql:$sql_dir/mysql_virtual_alias_domain_maps.cf, proxy:mysql:$sql_dir/mysql_virtual_alias_domain_catchall_maps.cf
# Таблицы просмотра каталогов для хранения почты
virtual_mailbox_maps = proxy:mysql:$sql_dir/mysql_virtual_mailbox_maps.cf, proxy:mysql:$sql_dir/mysql_virtual_alias_domain_mailbox_maps.cf
# Нужен чтобы по MAIL FROM узнать логин и затем сверить с логином, по которому прошла аутентификация.
smtpd_sender_login_maps = proxy:mysql:$sql_dir/mysql_virtual_emails_maps.cf
# Путь до каталога хранилища почты
virtual_mailbox_base = /home/vmail
home_mailbox = Maildir/
mailbox_command = /usr/lib/dovecot/deliver -c /etc/dovecot/dovecot.conf -m "${EXTENSION}"
virtual_uid_maps = static:1005
virtual_gid_maps = static:1005
virtual_minimum_uid = 1005
mail_owner = postfix
setgid_group = postdrop
mailbox_transport = dovecot
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1
# Поддержку sasl авторизации
smtpd_sasl_auth_enable = yes
# Поддержки старых версий почтовых клиентов, например Microsoft Outlook Express 4 и Microsoft Exchange 5, использующих другую форму команды AUTH
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_authenticated_header = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
# Требуем, чтобы удалённый SMTP клиент представлял себя в начале SMTP сессии с помощью команды HELO или EHLO.
smtpd_helo_required = yes
# Всегда отправлять EHLO вначале SMTP сессии
smtp_always_send_ehlo = yes
# Отключает SMTP команду VRFY. В результате чего, невозможно определить существование определённого
# ящика. Данная техника (применение команды VRFY) используется спамерами для сбора имён почтовых ящиков.
disable_vrfy_command = yes
# Сообщать ли клиентам о возможности использования TLS (шифрования соединения)
smtpd_use_tls = yes
smtpd_tls_received_header = yes
smtpd_tls_mandatory_protocols = SSLv3, TLSv1
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_auth_only = yes
tls_random_source = dev:/dev/urandom
smtpd_tls_key_file = /etc/ssl/private/yourmail.domain.com.key
smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem
# Список таблиц, которым разрешено работать через proxymap (кеширует запросы и снижает нагрузку на БД)
proxy_read_maps = $local_recipient_maps $mydestination $smtpd_sender_login_maps $virtual_alias_maps $virtual_mailbox_domains $virtual_mailbox_maps $relay_recipient_maps $mynetworks
# Создаём классы:
smtpd_restriction_classes = verify_sender, rbl_cbl_abuseat_org, rbl_sbl_spamhaus_org, rbl_dul_ru, rbl_spamcop, white_client_ip, black_client_ip, block_dsl, helo_access, white_client, mx_access, helo_access_db
# Описание классов:
verify_sender = reject_unverified_sender, permit
rbl_cbl_abuseat_org = reject_rbl_client cbl.abuseat.org
rbl_dul_ru = reject_rbl_client dul.ru
rbl_sbl_spamhaus_org = reject_rbl_client sbl.spamhaus.org
rbl_spamcop = reject_rbl_client bl.spamcop.net
white_client_ip = check_client_access hash:/etc/postfix/config/white_client_ip
black_client_ip = check_client_access hash:/etc/postfix/config/black_client_ip
block_dsl = regexp:/etc/postfix/config/block_dsl
helo_access = check_helo_access pcre:/etc/postfix/config/helo_checks
helo_access_db = check_helo_access hash:/etc/postfix/config/helo_checks_db
white_client = check_sender_access pcre:/etc/postfix/config/white_client
mx_access = check_sender_mx_access cidr:/etc/postfix/config/mx_access
### Restrictions
# Проверки клиентского компьютера (или другого почтового сервера),
# который соединяется с сервером postfix для отправки письма
smtpd_client_restrictions = black_client_ip,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
white_client_ip,
reject_unauth_pipelining,
helo_access,
block_dsl,
reject_unknown_address,
reject_unknown_recipient_domain,
reject_unknown_sender_domain,
rbl_dul_ru,
rbl_sbl_spamhaus_org,
rbl_spamcop,
rbl_cbl_abuseat_org,
permit
# временно убрал из-за кучи кривых серверов
smtpd_helo_restrictions = permit_mynetworks,
permit_sasl_authenticated,
helo_access,
helo_access_db,
reject_invalid_helo_hostname,
reject_non_fqdn_helo_hostname,
reject_unknown_helo_hostname,
permit
# Проверки исходящей или пересылаемой через нас почты
smtpd_sender_restrictions = reject_unknown_sender_domain,
permit
# Правила приема почты нашим сервером:
smtpd_recipient_restrictions = hash:/etc/postfix/config/access,
reject_unknown_sender_domain,
reject_unknown_recipient_domain,
reject_unauth_pipelining,
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_multi_recipient_bounce,
permit
smtpd_data_restrictions = reject_unauth_pipelining,
reject_multi_recipient_bounce,
permit
# Пропустить серверы, которые приветствуют нас кодом состояния 5xx
smtp_skip_5xx_greeting = no
# Отклонение писем с несуществующим адресом отправителя
smtpd_reject_unlisted_sender = yes
# Отклонение писем с несуществующим адресом получателя
smtpd_reject_unlisted_recipient = yes
# Пересылка копии всех исходящих писем
sender_bcc_maps = hash:/etc/postfix/config/sender_bcc_maps
################################################################################
# Чтобы не возникало вопросов, «а как…»
# Пересылка копии всех входящих писем
#recipient_bcc_maps = hash:/etc/postfix/config/recipient_bcc_maps
#
# Пересылка всей исходящей и входящей почты
#always_bcc = sender@yourdomain.com
################################################################################
Создадим необходимые файлы, которые упоминаются в main.cf. Для пересылки копий всей исходящей почты создаём файл sender_bcc_maps
# nano /etc/postfix/config/sender_bcc_maps
Если нам надо копировать всю исходящую почту не взирая на лица и должности, тогда в файл добавим следующее содержимое
@yourdomain.com sender@yourdomain.com
где
- sender@yourdomain.com — специально созданный обыкновенный почтовый ящик с любым произвольным именем
Если же надо копировать исходящую почту только от определённых пользователей, то файл будет иметь следующий вид
user1@yourdomain.com sender@yourdomain.com
user2@yourdomain.com sender@yourdomain.com
user4@yourdomain.com sender@yourdomain.com
где
- sender@yourdomain.com — специально созданный обыкновенный почтовый ящик с любым произвольным именем
После любых изменений в файле sender_bcc_maps необходимо выполнить команду
# postmap /etc/postfix/config/sender_bcc_maps
Создадим файл исключающий доступ из-вне к тому или иному ящику, т.е. письмо отправленное на такой адрес, например, с mail.ru адресату не будет доставлено.
# nano /etc/postfix/config/access
Один адрес на одну строку
user1@domain.com permit_mynetworks,reject
user2@domain.com permit_mynetworks,reject
group1@domain.com permit_mynetworks,reject
В header_checks мы запрещаем приём сообщений, в которых имеются вложения исполняемых файлов, и которые, как правило, не пересылаются по электронной почте и чаще всего являются вирусами или троянскими программами. В последнее время обратил внимание, что мои пользователи стали по почте перекидывать мультимедиа файлы (в основном mp3) другу другу (даже сидя в одной комнате). Объяснять, что для обмена файлами подобного типа и не только, имеется «файлопомойка», устал. Поэтому проще сразу ограничить такую возможность.
Создадим файл /etc/postfix/config/header_checks, где напишем правила (одна строка для одного расширения). В последних шести строках написаны правила, блокирующее сообщения, содержащие определённые поля в заголовке.
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.acm/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.ax/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.bat/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.bin/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.bpl/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.cat/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.chm/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.cmd/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.com/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.cpl/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.dat/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.dll/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.dpl/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.drv/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.exe/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.hlp/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.inf/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.ini/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.msc/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.nls/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.ocx/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.olb/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.pif/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.rom/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.scr/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.sys/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.tlb/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.vbs/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.vxd/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.669/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.aac/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.aif/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.aiff/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.amf/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.au/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.far/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.it/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.itz/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.kar/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.m3u/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.m4a/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mdz/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mid/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.midi/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.miz/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mmf/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mod/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mp1/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mp2/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mp3/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mp4/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mtm/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.nsa/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.nst/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.ogg/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.okt/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.pls/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.ptm/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.rmi/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.s3m/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.s3z/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.snd/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.stm/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.stz/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.ult/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.voc/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.vaw/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.wma/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.xm/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.xmz/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.asf/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.avi/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.m2v/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mov/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mpeg/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.mpg/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.nsv/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.qt/ REJECT
/^Content-(Type|Disposition):.*name[[:space:]]*=.*\.wmv/ REJECT
/^Bel-Tracking: .*/ REJECT
/^Hel-Tracking: .*/ REJECT
/^Kel-Tracking: .*/ REJECT
/^BIC-Tracking: .*/ REJECT
/^Lid-Tracking: .*/ REJECT
/^X-Mailer: Avalanche/ REJECT
Создадим файл /etc/postfix/config/mime_header_checks, который также должен содержать по одной строке для каждого типа расширения.
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)acm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ax)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)bat)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)bin)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)bpl)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)cat)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)chm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)cmd)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)com)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)cpl)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)dat)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)dll)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)dpl)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)drv)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)exe)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)hlp)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)inf)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ini)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)msc)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)nls)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ocx)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)olb)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)pif)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)rom)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)scr)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)sys)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)tlb)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)vbs)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)vxd)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)669)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)aac)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)aif)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)aiff)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)amf)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)au)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)far)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)it)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)itz)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)kar)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)m3u)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)m4a)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mdz)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mid)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)midi)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)miz)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mmf)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mod)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mp1)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mp2)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mp3)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mp4)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mtm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)nsa)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)nst)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ogg)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)okt)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)pls)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ptm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)rmi)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)s3m)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)s3z)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)snd)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)stm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)stz)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)ult)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)voc)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)vaw)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)wma)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)xm)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)xmz)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)asf)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)avi)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)m2v)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mov)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mpeg)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)mpg)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)nsv)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)qt)(\?=)?"?\s*$/ REJECT
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(\.|2E)wmv)(\?=)?"?\s*$/ REJECT
Создадим файл с чёрным списком клиентов /etc/postfix/config/black_client_ip. Этот список адресов будем всегда блокировать.
/111\.222\.333\.444/ REJECT
/555\.666\.777\.888/ REJECT
После каждой правки файла /etc/postfix/config/black_client_ip выполняем команду
# postmap /etc/postfix/config/black_client_ip
По аналогии с файлом чёрного списка, создадим файл с белым списком /etc/postfix/config/white_client_ip, в который добавляем IP-адреса надёжных и проверенных клиентов.
/111\.222\.333\.444/ OK
/555\.666\.777\.888/ OK
И после каждой правки файла /etc/postfix/config/white_client_ip выполняем команду
# postmap /etc/postfix/config/white_client_ip
Создадим файл /etc/postfix/config/block_dsl и добавим в него следующее содержимое
/^dsl.*\..*/i 553 AUTO_DSL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/.*\.dsl\..*/i 553 AUTO_DSL2 We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/[a|x]dsl.*\..*\..*/i 553 AUTO_[A|X]DSL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/client.*\..*\..*/i 553 AUTO_CLIENT We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/cable.*\..*\..*/i 553 AUTO_CABLE We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/pool\..*/i 553 AUTO_POOL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/.*dial(\.|-).*\..*\..*/i 553 AUTO_DIAL We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/ppp.*\..*/i 553 AUTO_PPP We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/dslam.*\..*\..*/i 553 AUTO_DSLAM We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/dslb.*\..*\..*/i 553 AUTO_DSLB We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/node.*\..*\..*/i 553 AUTO_NODE We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/.*\.dynamicIP\..*/i 553 AUTO_DYNAMIC We aren't accept direct connection not from dedicated SMTP servers. Please use your internet provider SMTP Server.
/[ax]dsl.*\..*\..*/i REJECT Your message looks like SPAM 01
/\.dsl.*\..*\..*/i REJECT Your message looks like SPAM 02
/cable.*\..*\..*/i REJECT Your message looks like SPAM 03
/client.*\..*\..*/i REJECT Your message looks like SPAM 04
/dhcp.*\..*\..*/i REJECT Your message looks like SPAM 05
/dial.*\..*\..*/i REJECT Your message looks like SPAM 06
/dialup.*\..*\..*/i REJECT Your message looks like SPAM 07
/dslam.*\..*\..*/i REJECT Your message looks like SPAM 08
/node.*\..*\..*/i REJECT Your message looks like SPAM 09
/pool.*\..*\..*/i REJECT Your message looks like SPAM 10
/ppp.*\..*\..*/i REJECT Your message looks like SPAM 11
/user.*\..*\..*/i REJECT Your message looks like SPAM 12
/[0-9]+-[0-9]+/ REJECT Invalid hostname (D-D) (dsl)
/(modem|dia(l|lup)|cp[ce]|dsl|p[cp]p|cable|catv|poo(l|les)|pppoe|dhcp|client|customer|user|host|[0-9]{4,})(-|_|\.|[0-9])/ REJECT Invalid hostname (client)
Создадим файл /etc/postfix/config/helo_checks и добавим в него следующее содержимое
/^\[?10\.\d{1,3}\.\d{1,3}\.\d{1,3}\]?$/ REJECT Address in RFC 1918 private network
/^\[?192\.\d{1,3}\.\d{1,3}\.\d{1,3}\]?$/ REJECT Address in RFC 1918 private network
/^\[?172\.\d{1,3}\.\d{1,3}\.\d{1,3}\]?$/ REJECT Address in RFC 1918 private network
/\d{2,}[-\.]+\d{2,}/ REJECT Invalid hostname (D-D)
/^(((newm|em|gm|m)ail|yandex|rambler|hotbox|chat|rbc|subscribe|spbnit)\.ru)$/ REJECT Faked hostname ($1)
/^(((hotmail|mcim|newm|em)ail|post|hotbox|msn|microsoft|aol|news|compuserve|yahoo|google|earthlink|netscape)\.(com|net))$/ REJECT Faked hostname ($1)
/[^[] *[0-9]+((\.|-|_)[0-9]+){3}/ REJECT Invalid hostname (ipable)
/(modem|dia(l|lup)|cp[ce]|dsl|p[cp]p|cable|catv|poo(l|les)|pppoe|dhcp|client|customer|user|host|[0-9]{4,})(-|_|\.|[0-9])/ REJECT Invalid hostname (client)
Затем создадим файл /etc/postfix/config/mx_access и добавим в него следующее содержимое
127.0.0.1 DUNNO
127.0.0.2 550 Domains not registered properly. Can't assign requested address
0.0.0.0/8 REJECT Domain MX in broadcast network
10.0.0.0/8 REJECT Domain MX in RFC 1918 private network
127.0.0.0/8 REJECT Domain MX in loopback network
169.254.0.0/16 REJECT Domain MX in link local network
172.16.0.0/12 REJECT Domain MX in RFC 1918 private network
192.0.2.0/24 REJECT Domain MX in TEST-NET network
192.168.0.0/16 REJECT Domain MX in RFC 1918 private network
224.0.0.0/4 REJECT Domain MX in class D multicast network
240.0.0.0/5 REJECT Domain MX in class E reserved network
248.0.0.0/5 REJECT Domain MX in reserved network
И на последним создадим файл /etc/postfix/config/white_client, который будет у нас содержать списки доменов доверенных клиентов (по одному на строчку).
/.*@clientdomain\.com/i OK
/user@domain\.com/i OK
Выставим необходимые права доступа к файлам
# chown root:postfix /etc/postfix/config/*
# chmod o= /etc/postfix/config/*
Откроем файл /etc/postfix/master.cf и в самый конец добавим
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}
Внимание! Перед flags=DRhu ДВА пробела.
Перегружаем dovecot и postfix
# invoke-rc.d dovecot restart
# invoke-rc.d postfix restart
На данном этапе почтовый сервер полностью работоспособен. Можно создавать пользователей, альясы, получать и отправлять письма. Но… Необходимо ещё организовать фильтрацию спама и проверку вложений на вирусы. Какую-то часть спама мы заблокировали, но спам всё равно попадает в ящики пользователей. Некоторые типы вложений мы уже отклоняем, но этого мало. В третьей части мы научим наш сервер отсекать спам, проверять вложения на вирусы, прикрутим веб-интерфейс для просмотра почты, а также настроим просмотр статистики использования нашего почтового сервера.
# invoke-rc.d dovecot/restart
поменять надо
# invoke-rc.d dovecot restart
Точно, опечатался. Спасибо, исправил.
virtual_mailbox_base
virtual_uid_maps
virtual_gid_maps
virtual_minimum_uid
в данном случае не нужны
они для встроенного транспорта virtual, у вас же транспорт dovecot
А что по дырке SSLv ?
У вас только это и используется
вот по теме статья ...