postfix из исходников, postfixadmin | FreeBSD, Lighttpd, Postfix

Postfix
На старом серваке пришлось ставить postfix. Портов нет, база pkg старая. pkg можно использовать, настроить в его конфиге путь к месту где раположено дерево под вашу версию freebsd и сделать pkg update. Вполне будет все работать. Но там нет postfix собранного с mysql и поддержкой ssl/tls. Что делать? Собрать из исходников.
Важно. По дефолту postfix собирается без mysql, и поддержки cyrus.
Качаем исходники, распаковывем. Перед сборкой делаем (проверяем пути к библиотекам: usr/local/include/sasl, /usr/local/lib/mysql и остальное!!!) чтобы собрались нужные модули:

make -f Makefile.init makefiles 'CCARGS=-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl -DUSE_TLS -I/usr/include/openssl -DHAS_MYSQL -I/usr/local/include/mysql' 'AUXLIBS=-L/usr/local/include/sasl -lsasl2 -L/usr/local/lib -lssl -lcrypto' \
    'AUXLIBS_MYSQL=-L/usr/local/lib/mysql -lmysqlclient -lz -lm'

После этого собираем и ставим. Можем поймать ошибки при сборке и установке, ещё раз проверяем пути, и наличие файлов которые просят. при утсановке поймал баг – со всеми модулями крашится, то поддежрка mysql ставится, добавляем цирус ловим баг, то наоборот. Строка выше – как раз вариант который нормально завелся, последовательность важна в моем случае.
Проверяем (ищем mysql):

postconf -m

Проверяем (ищем cyrus)

postconf -a

Posfixadmin
Postfixadmin также лучше скачать версию типа 2.3 если раньше пользовались ей (под php56). На lighttpd распаковываем в корень, настраиваем config.php.inc: пароль на базу, пароль для скрипта setup.php, меняем переменную «настроена» на true. С главной страницы заходим в сетап, проверяет софт, соединение с базой, заводим админа. Все, лайти должна работать с постфиксадмином из коробки (если у вас он уже настроен).
В версии 2.3 ошибка на переменную
Fatal error: Cannot redeclare hex2bin() in /your/path/functions.inc.php on line 1338
В functions.inc.php меняем имя функции на convertHex2bin

#function hex2bin ($str)
function convertHex2bin ($str)

Postfix Sasl | Courier-imap, Postfix

Упал почтовый сервер, быстро перетащил все на новый, запустил, но споткнулся об авторизацию SASL.
Первый момент – не показывает AUTH при пробах телнетом. Оказалось все просто, проверяем дает ли postfix авторизоваться без tls (смотрим main.cf):

smtpd_tls_auth_only = yes

Если есть такая строка то подключившись телнетом мы не увидим строки типа:

250 AUTH .....

Теперь предположим что имап и поп3 у нас работает а при отправке сасл не даёт авторизоваться. Самый простой вариант – использовать courier-authdaemond.
Он у нас уже прописан в rc.conf и запущен.

Правим конфиг sasl – /usr/local/lib/sasl2/smtpd.conf пишем в него:

pwcheck_method: authdaemond
log_level: 3
mech_list: PLAIN LOGIN
authdaemond_path:/var/run/authdaemond/socket

И права на директорию /var/run/authdaemond даем группе postfix.
Иначе можем поймать ошибку:

SASL authentication failure: cannot connect to Courier authdaemond: Permission denied

Postfix дублирование сообщений на два ящика | FreeBSD, Postfix

Простая фича postfix выручает когда надо продублировать поток сообщений для ящика на нашем сервере и стороннего почтового адреса (например дубль входящих сообщений на рабочий и личный ящик сотрудника).

Называется это BCC (что-то типа скрытых копий). Настраивается в master.cf куда добавляем строки с указанием на карты соответствия адреса получателя и адресата копии.

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc
recipient_bcc_maps = hash:/usr/local/etc/postfix/recipient_bcс

Создаем сами файлы:

touch /usr/local/etc/postfix/sender_bcc
touch /usr/local/etc/postfix/recipient_bcс

В файлы пишем пары адресов – ящик в нашем домене и ящику куда надо выслать копию. Разделитель – Tab.
Сохраняем и пересоздаем базы командами.

postmap /usr/local/etc/postfix/sender_bcc
postmap /usr/local/etc/postfix/recipient_bcс

Перезапускаем postfix или делаем reload.

PS: Все сообщения сервера можно дублировать директивой

always_bcc = backup@domain.com

unsupported dictionary type: mysql, Inappropriate file type or format | FreeBSD, Postfix

После обновления postfix (посредством portupgrade) поймал ошибки:

postfix/trivial-rewrite[87453]: warning: virtual_alias_domains lookup failure
postfix/trivial-rewrite[87453]: warning: mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf 
is unavailable. unsupported dictionary type: mysql

База пользователей у меня хранится в mysql и ругань возникла поскольку я не отметил поддержку mysql во время обновления – а по дефолту порт предложил собраться только с поддержкой pcre. :)
Продолжить чтение →

reject_unknown_client. Исключения | Postfix

Как настроить ограничение reject_unknown_client я уже писал (см. здесь) но почтовые сервера у которых отсутствует PTR запись в днс зоне не такая редкость. Если нам нужно внести ограничение на действие директивы reject_unknown_client можно создать карту исключений.

Создаем файл с именами, айпи адресами и т.д. Например /usr/local/etc/postfix/client_access

Пишем в него:

@mail.ru   OK
193.33.24.24   OK
mail.ru   OK
info@server.ru   OK

В нашем случае, когда в логе мы видим что отрабатывает правило reject_unknown_client и имя машины у нас unknown[193.33.24.24]:

postfix/smtpd[99471]: NOQUEUE: reject: RCPT from unknown[193.33.24.24]: 450 Client host 
rejected: cannot find your hostname

Важно добавить в карту именно айпишник сервера с которого нам шлют почту:

193.33.24.24 OK

Далее делаем:

#postmap hash:/usr/local/etc/postfix/maps/client_access

Получаем файл client_access.db

Прописываем в набор ограничений в файл main.cf (ставим ссылку на хэш до ограничивающей директивы):

smtpd_recipient_restrictions =
        check_client_access hash:/usr/local/etc/postfix/client_access,
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        reject_unknown_sender_domain,
        reject_unlisted_sender,
        reject_unknown_client,
        reject_rbl_client sbl-xbl.spamhaus.org

Запятые – не обязательно если директивы идут с новой строки. Обращаем внимание последовательность применения наборов у postfix следующая:

1. smtpd_client_restrictions
2. smtpd_helo_restrictions
3. smtpd_sender_restrictions
4. smtpd_recipient_restrictions
5. smtpd_data_restrictions

То есть в принципе мы могли бы добавить наши директивы в первый набор smtpd_client_restrictions.

Не забываем про директиву:

smtpd_delay_reject = yes

Хотя это поведение postfix по умолчанию, но на всякий случай. Директива smtpd_delay_reject позволяет нашему серверу получить заголовки письма, и лишь потом применить к ним правила.

Для удобства просмотра лога в реальном времени не забываем про tail
Делаем.

#tail -f /var/log/maillog | grep @server.ru

И просим прислать с вражеского сервера письмо.

Roundcube | Courier-imap, Postfix

Есть задача – поставить веб интерфейс к почтовому серваку. Самым популярным наверное будет roundcube (в обзорах на самаге его хвалят, как ставить все рассказывают, к тому же уже стоял у нас roundcube на старом нашем почтовике)…
Итак ставим roundcube.
Первое что необходимо осознать – для работы roundcube необходим настроенный и рабочий IMAP. По сути roundcube – это веб IMAP клиент. Продолжить чтение →

Recipient address rejected: User unknown; | Postfix

Немного нестандартная ситуация с ошибкой почтовика Recipient address rejected: User unknown;

Во время переноса сервера сложилась следующая ситуация – часть доменов со старого почтовика я перенёс на новый (на обоих почтовиках аутентификация через базу mysql).
Используя postfixadmin удалил со старого почтовика домены, но суть в том что из базы записи о доменах в таблицах остались. По этой причине получил ошибку Recipient address rejected: User unknown; Продолжить чтение →

Миграция postfix, postfixadmin | Postfix

Есть старый почтовик на postfix 2.1.0 с управлением пользователями через postfixadmin. Соответсвенно база пользователей в mysql. Задача – прозрачно перейти на новый почтовик, с сохранением базы пользователей (пароли, алиасы и т.д.). Проблема только в том, что новый postfixadmin (2.3) имеет другую структуру таблиц базы и просто сделать дамп базы и залить на новой машине не получится. Продолжить чтение →

reject_unknown_client | Postfix

Существует фильтр постфикса отсекающий почту пришедшую от хоста у которого нет PTR записи:

reject_unknown_client

Обычно спам приходит с обычного хоста пользователя напрямую (зомби машина в ботнете рассылающая спам). Хост имеет айпи но не имеет PTR записи в днс зоне. В заголовке при получении такого письма будет:

from DNQRXMB (unknown [188.158.74.251]) by post.firma.ru (Postfix) with ESMTP id 9A891EBD45; Tue, 8 Jun 2010 13:13:23 +0400 (MSD)

или так

from [195.22.34.45] (unknown [195.22.34.45]) by post.firma.ru (Postfix) with ESMTP id 3B81FEBD03; Tue, 8 Jun 2010 16:52:38 +0400 (MSD)

Добавим проверку reject_unknown_client перезапустим постфикс. Теперь постфикс принимать почту от клиентов чей айпи не имеет PTR записи.

Однако. Если ваша машина сидит с маршрутизируемым адресом и вы пытаетесь просто послать почту через ваш сервак и у вашего маршрутизируемого адреса нет PTR записи в зоне – почту сервер не примет:

4.7.1 Client host rejected. Cannot find your hostname, [195.11.22.44]

Аналогичная ситуация может быть (?) если ваш почтовый клиент будет общаться с почтовиком через шлюз без PTR записи, или если ваш сервер без PTR записи пересылает вам на имейл через ваш почтовик с reject_unknown_client в main.conf почту для root или оповещение от службы типа monit…