Необходимо запретить отправку почты с сервера/сайта на все адреса, за исключением списка разрешенных (например, есть тестовый сервер разработки и в нем присутствуют реальные адреса клиентов, которые могут получать письма от тестового сервера, что очень нежелательно) Особенность в том, что php-функция mail использует бинарник sendmail для отправки писем. Например, настройки sendmail для отправки почты функции mail […]
Записи с меткой ‘postfix’
Настройка Postfix для блокировки отправки почты через функцию PHP mail
Фильтрация спама средствами Postfix
Имя почтового сервера – mail.example.com Имя почтового домена – example.com IP-адрес почтового сервера – 113.113.113.113
1 |
# nano /etc/postfix/main.cf |
запретить использование адресов, отличных от определенных в документе RFC-821
1 |
strict_rfc821_envelopes = yes |
запретить использование команды VRFY
1 |
disable_vrfy_command = yes |
потребовать обязательное использование команды HELO/EHLO
1 |
smtpd_helo_required = yes |
Далее следует очень важный параметр smtpd_delay_reject. Я настоятельно рекомендую не изменять его значение по умолчанию (yes). В противном […]
Настройка пользовательский почтовых квот на связке Postfix+Dovecot+PostfxAdmin
Статья в продолжении статьи Установка и настройка почтовой связки на основе Postfix+Dovecot+MySQL+PostfixAdmin+Roundcube на Debian 7/ Ubuntu 14.04 Настройка PostfixAdmin
1 |
# nano /usr/share/postfixadmin/config.inc.php |
1 2 3 4 5 6 7 |
$CONF['maxquota'] = '0'; $CONF['domain_quota_default'] = '0'; $CONF['quota'] = 'YES'; $CONF['domain_quota'] = 'NO'; $CONF['quota_multiplier'] = '1024000'; $CONF['used_quotas'] = 'YES'; $CONF['new_quota_table'] = 'YES'; |
Перезапуск Nginx/Apache сервера Настройка Dovecot
1 |
# nano /etc/dovecot/conf.d/10-mail.conf |
1 |
mail_plugins = $mail_plugins quota |
1 |
# nano /etc/dovecot/conf.d/20-imap.conf |
1 2 3 |
protocol imap { mail_plugins = $mail_plugins imap_quota } |
1 |
# nano /etc/dovecot/conf.d/10-master.conf |
1 2 3 4 5 6 |
service dict { unix_listener dict { mode = 0660 user = vmail group = mail } |
1 |
# nano /etc/dovecot/conf.d/90-quota.conf |
1 2 3 |
plugin { quota = dict:User quota::proxy::quota } |
1 |
# nano /etc/dovecot/dovecot.conf |
1 2 3 |
dict { quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext } |
1 |
# nano /etc/dovecot/dovecot-dict-sql.conf.ext |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
connect = host=localhost dbname=postfix user=postfixuser password=postfixpassword map { pattern = priv/quota/storage table = quota2 username_field = username value_field = bytes } map { pattern = priv/quota/messages table = quota2 username_field = username value_field = messages } |
Для Dovecot версии 1.2 и выше используется таблица quota2 вместо таблицы quota
1 |
# nano /etc/dovecot/dovecot-sql.conf.ext |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
driver = mysql connect = host=localhost dbname=postfix user=postfixuser password=postfixapassword default_pass_scheme = MD5-CRYPT user_query = \ SELECT '/var/vmail/%d/%n' as home, \ 'maildir:/var/vmail/%d/%n' as mail, \ 1150 AS uid, 8 AS gid, concat('*:bytes=', quota) AS quota_rule \ FROM mailbox WHERE username = '%u' AND active = '1' password_query = \ SELECT username as user, password, '/var/vmail/%d/%n' as userdb_home, \ 'maildir:/var/vmail/%d/%n' as userdb_mail, 1150 as userdb_uid, 8 as userdb_gid \ FROM mailbox WHERE username = '%u' AND active = '1' |
Применяем сделанные настройки […]
Мониторинг Postfix в Zabbix
1.Установка/настройка необходимой локали
1 |
# locale-gen en_US.UTF-8 |
1 |
# dpkg-reconfigure locales |
1 |
# nano /etc/default/locale |
1 |
LANG="en_US.UTF-8" |
2.Установка скрипта
1 |
# mkdir /etc/zabbix/scripts/ |
1 |
# chown root:zabbix -R /etc/zabbix/scripts/ |
1 |
# chmod 750 /etc/zabbix/scripts/ |
1 |
# nano /etc/zabbix/scripts/postfix.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#!/bin/bash export LC_ALL="" export LANG="en_US.UTF-8" # if [[ -z "$1" ]]; then exit 1 fi ##### PARAMETERS ##### MAILQ=$(which mailq) PFLOGSUMM=$(which pflogsumm) # Для Ubuntu MAILLOG="/var/log/mail.log" # Для Centos # MAILLOG="/var/log/maillog" # METRIC="$1" CACHE_TTL="1740" CACHE_FILE="/tmp/zabbix.postfix.cache" EXEC_TIMEOUT="4" NOW_TIME=`date '+%s'` ##### RUN ##### if [ "$METRIC" = "queue" ]; then TEMP_DATA=`${MAILQ} 2>&1 | tail -n1` if echo "${TEMP_DATA}" | grep -iq "Mail queue is empty"; then echo 0 elif echo "${TEMP_DATA}" | grep -iPq "in\s+\d+\s+request"; then echo "${TEMP_DATA}" | sed -e 's/.*in\s\+\([0-9]\+\)\s\+request.*/\1/gI' 2> /dev/null | head -n1 else # Error echo 65535 fi exit 0 else if [ -s "${CACHE_FILE}" ]; then CACHE_TIME=`stat -c"%Y" "${CACHE_FILE}"` DELTA_TIME=$((${NOW_TIME} - ${CACHE_TIME})) if [ ${DELTA_TIME} -lt ${EXEC_TIMEOUT} ]; then sleep $((${EXEC_TIMEOUT} - ${DELTA_TIME})) elif [ ${DELTA_TIME} -gt ${CACHE_TTL} ]; then echo "" >> "${CACHE_FILE}" # !!! DATE_TO=`date +%d\ %H:%M:%S` DATE_FROM=`date -d @${CACHE_TIME} +%d\ %H:%M:%S` DATA_CACHE=`sudo cat ${MAILLOG} | sed -e 's/^\([a-zA-Z]\{3\}\s\)\s\([0-9]\s\)/\10\2/g' | awk '$2" "$3>=from && $2" "$3<=to' from="${DATE_FROM}" to="${DATE_TO}" | \ ${PFLOGSUMM} -h 0 -u 0 --bounce_detail=0 --deferral_detail=0 --reject_detail=0 --smtpd_warning_detail=0 --no_no_msg_size 2>&1` echo "${DATA_CACHE}" > ${CACHE_FILE} # !!! chmod 640 ${CACHE_FILE} fi else echo "" > ${CACHE_FILE} # !!! exit 0 fi awk "BEGIN{IGNORECASE=1} /${METRIC}/ {print \$1}" ${CACHE_FILE} | awk '{print $1}' | awk '/k|m/{p = /k/?1:2}{printf "%d\n", int($1) * 1024 ^ p}' | head -n1 fi exit 0 |
Для парсинга почтового лога используется утилита pflogsumm
1 |
# apt-get install pflogsumm |
1 |
# yum install postfix-perl-scripts |
1 |
# pflogsumm /var/log/mail.log -d today |
Скрипт предусматривает кеш, что позволяет избежать парсинга лога на каждый параметр. Время действия кеша (TTLCACHE) в секундах должно устанавливается чуть меньше чем минимальный период опроса элементов.(в скрипте установлен кеш 1740 секунд, […]
Установка и настройка OpenDKIM + Postfix в Ubuntu/Debian
В конце 2011 года разработчики проекта dkim-milter прекратили его поддержку и разработку. К счастью, на замену проекта dkim-milter пришел OpenDKIM, с помощью которого добавить DKIM-подпись в письма так же просто. 1.Установка Opendkim, postfix
1 |
# apt-get install opendkim opendkim-tools postfix |
1 |
# nano /etc/aliases |
root: myemail@kamaok.org.ua
1 |
# newaliases |
1 |
# cat /etc/hostname |
1 |
ubuntu |
1 |
# cat /etc/mailname |
1 |
ubuntu.kamaok.org.ua |
2.Настройка Postfix
1 |
# cat /etc/postfix/main.cf | grep -v \# | grep -v ^\$ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no append_dot_mydomain = no readme_directory = no smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = ubuntu.kamaok.org.ua alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases myorigin = /etc/mailname mydestination = ubuntu.kamaok.org.ua, localhost.kamaok.org.ua, , localhost relayhost = mynetworks = 127.0.0.0/8 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = 127.0.0.1 inet_protocols = ipv4 |
3.Настройка OpenDKIM
1 |
# mkdir /etc/opendkim/kamaok.org.ua |
[…]
Установка и настройка почтовой связки на основе Postfix+Dovecot+MySQL+PostfixAdmin+Roundcube на Debian 7/ Ubuntu 14.04
В /etc/hostname – имя сервера БЕЗ имени домена
1 |
# cat /etc/hostname |
1 |
app02 |
В /etc/mailname – полное доменное имя(FQDN)
1 |
# cat /etc/mailname |
1 |
app02.example.com |
1.Установка необходимого программного обеспечения Ubuntu
1 |
# apt-get install mail-server^ |
1 |
Postfix->Internet site->FQDN |
1 |
Dovecot –>Yes(создаем SSL-сертификат)->FQDN |
Устанавливаем поддержку MySQL для Postfix и Dovecot. Пакет php5-imap нужен для PostfixAdmin. Пакет php5-mcrypt – для Roundcube.
1 |
# apt-get install postfix-mysql dovecot-mysql php5-imap php5-mcrypt |
Debian
1 |
# apt-get install postfix postfix-mysql libsasl2-modules libsasl2-modules-sql |
1 |
# apt-get install dovecot-mysql dovecot-pop3d dovecot-imapd |
1 |
# apt-get install php5-imap php5-mcrypt |
[…]
Полезные команды Postfix. Работа с очередью Postfix
Проверка синтаксиса конфигурационных файлов Postfix
1 |
# postfix check |
Просмотр текущих значений параметров Postfix
1 |
# postconf |
Просмотр стандартных значений параметров Postfix(значений по умолчанию)
1 |
# postconf -d |
1 |
# postconf | grep message_size_limit |
1 |
message_size_limit = 10240000 |
Изменение значения параметра message_size_limit без перезагрузки (работает и после перезагрузки postfix)
1 |
# postconf -e 'message_size_limit = 20480000' |
1 |
# postconf | grep message_size_limit |
1 |
message_size_limit = 20480000 |
1 |
# /etc/init.d/postfix restart |
1 2 |
Shutting down postfix: [ OK ] Starting postfix: [ OK ] |
1 |
# postconf | grep message_size_limit |
1 |
message_size_limit = 20480000 |
То же самое можно достичь прописав в
1 |
/etc/postfix/main.cf |
1 |
# message_size_limit = 20480000 |
Больше […]
Установка и настройка Postfix+Dovecot+Sasl+SSL на Centos 6
1 |
# nano /etc/hosts |
1 |
195.64.155.22 server1.kamaok.org.ua server1 |
1.Настройка Postfix
1 |
# yum install postfix |
1 |
# cat /etc/postfix/main.cf | grep -v \# | grep -v ^$ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
queue_directory = /var/spool/postfix command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix data_directory = /var/lib/postfix mail_owner = postfix myhostname = server1.kamaok.org.ua mydomain = kamaok.org.ua myorigin = $mydomain inet_interfaces = all inet_protocols = ipv4 mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain unknown_local_recipient_reject_code = 550 # Указываем доверенные адреса/подсети,с которых можно отправлять почту(с остальных адресов пересылка будет запрещена на внешние почтовые ящики(в мир)(с ошибкой при отправке Relay access denied) mynetworks = 127.0.0.0/8 WWW.XXX.YYY.ZZZ in_flow_delay = 1s alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases home_mailbox = Maildir/ mail_spool_directory = /var/spool/mail smtpd_banner = $myhostname ESMTP $mail_name debug_peer_level = 2 debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5 sendmail_path = /usr/sbin/sendmail.postfix newaliases_path = /usr/bin/newaliases.postfix mailq_path = /usr/bin/mailq.postfix setgid_group = postdrop html_directory = no manpage_directory = /usr/share/man sample_directory = /usr/share/doc/postfix-2.6.6/samples readme_directory = /usr/share/doc/postfix-2.6.6/README_FILES |
2.Добавление в автозагрузку, проверка синтаксиса и запуск Postfix
1 |
# chkconfig --level 2345 postfix on |
1 |
# /etc/init.d/postfix check |
1 |
# /etc/init.d/postfix start |
3.Тестируем работоспособность Postfix Отправка письма на внешний почтовый ящик(например,на mail.ru)
1 |
# telnet localhost 25 |
1 2 3 4 5 6 |
Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 server1.kamaok.org.ua ESMTP Postfix |
1 |
ehlo localhost |
1 2 3 4 5 6 7 8 |
250-server1.kamaok.org.ua 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN |
1 |
mail from:<username>@kamaok.org.ua |
1 |
250 2.1.0 Ok |
1 |
rcpt to:<username>@mail.ru |
1 |
250 2.1.5 Ok |
1 |
data |
1 |
354 End data with <CR><LF>.<CR><LF> |
1 2 |
Welcome to my mail server . |
1 |
250 2.0.0 Ok: queued as 125355E114F |
1 |
# tail -f /var/log/maillog |
1 2 3 |
Oct 7 22:55:13 server1 postfix/qmgr[1480]: 125355E114F: from=<<username>@kamaok.org.ua>, size=421, nrcpt=1 (queue active) Oct 7 22:55:18 server1 postfix/smtp[1489]: 125355E114F: to=<<username>@mail.ru>;, relay=mxs.mail.ru[217.69.139.150]:25, delay=38, delays=33/0/0.4/4.3, dsn=2.0.0, status=sent (250 OK id=1Xbaqr-0008Bt-9a) Oct 7 22:55:18 server1 postfix/qmgr[1480]: 125355E114F: removed |
Отправка письма самому себе
1 |
# telnet localhost 25 |
1 2 3 4 5 6 |
Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 server1.kamaok.org.ua ESMTP Postfix |
1 |
ehlo localhost |
[…]
Настройка fail2ban для защиты Postfix на Centos
1 |
# yum install fail2ban |
1 |
# chkconfig --level 235 fail2ban on |
1 |
# nano /etc/fail2ban/fail2ban.conf |
1 2 3 4 5 |
[Definition] loglevel = 3 logtarget = /var/log/fail2ban.log socket = /var/run/fail2ban/fail2ban.sock pidfile = /var/run/fail2ban/fail2ban.pid |
1 |
# nano /etc/fail2ban/jail.conf |
1 2 3 4 5 6 |
ignoreip = 127.0.0.1/8 77.120.XXX.YYY/32 bantime = 3600 findtime = 600 maxretry = 5 backend = auto usedns = warn |
# Для блокировки подбора логина/пароля при использовании SASL-аутентификации
1 2 3 4 5 6 7 8 9 |
[postfix25-iptables] enabled = true filter = postfix-sasl action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp] sendmail[name=Postfix-smtp, dest=your@email, sender=fail2ban@myserver.com] logpath = /var/log/maillog bantime = 86400 maxretry = 3 findtime = 3600 |
И для блокировки пересылки через Ваш почтовый сервер и др.
1 2 3 4 5 6 7 8 9 |
[postfix-iptables] enabled = true filter = postfix action = iptables[name=Postfix-smtp, port=smtp, protocol=tcp] sendmail[name=Postfix-smtp, dest=your@email, sender=fail2ban@myserver.com] logpath = /var/log/maillog bantime = 86400 maxretry = 3 findtime = 3600 |
1 |
# nano /etc/fail2ban/filter.d/postfix-sasl.conf |
1 2 3 4 5 6 7 |
# Fail2Ban filter for postfix authentication failures [INCLUDES] before = common.conf [Definition] _daemon = postfix/smtpd failregex = ^%(__prefix_line)swarning: [-._\w]+\[<HOST>\]: SASL (?:LOGIN|PLAIN|(?:CRAM|DIGEST)-MD5) authentication failed(: [ A-Za-z0-9+/]*={0,2})?\s*$ ignoreregex = |
проверка срабатывания правил
1 |
# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix-sasl.conf |
И
1 |
# nano /etc/fail2ban/filter.d/postfix.conf |
1 2 3 4 5 6 |
# Fail2Ban configuration file [Definition] failregex = reject: RCPT from (.*)\[<HOST>\]: 550 reject: RCPT from (.*)\[<HOST>\]: 450 reject: RCPT from (.*)\[<HOST>\]: 554 ignoreregex = |
проверка срабатывания правил
1 |
# fail2ban-regex /var/log/maillog /etc/fail2ban/filter.d/postfix.conf |
Установка и настройка DKIM-milter для Postfix/Sendmail на Centos
1.Установка DKIM-milter и добавление его в автозагрузку
1 |
# yum install dkim-milter |
1 |
# chkconfig --level 235 dkim-milter on |
2.Настройка DKIM-Milter Создаем папку для хранения приватного ключа, а также генерируем пару приватный/публичный ключ.
1 |
# mkdir /etc/dkim-milter |
1 |
# cd /etc/dkim-milter/ |
1 |
# /usr/sbin/dkim-genkey -d example.com -s default |
3.Делаем бекапы оригиналов файлов/папок
1 |
# mkdir /root/kamaok/Backup/dkim-milter |
1 |
# cp default.* /root/kamaok/Backup/dkim-milter/ |
1 |
# cp /etc/init.d/dkim-milter /root/kamaok/Backup/dkim-milter/ |
1 |
# cp /etc/mail/dkim-milter/dkim-filter.conf /etc/mail/dkim-milter/dkim-filter.conf~ |
Важно!!! Имя селектора должно совпадать с именем приватного файла Поэтому изменяем имя созданного приватного ключа(default.private на имя селектора – […]