Postfix & Amavis - Используйте UNIX Soket для общения
В настоящее время я использую сложную настройку почтового сервера, используя Postfix, Dovecot, Amavis и Spamassassin.
Все отлично работает, но я хочу улучшить Postfix-Amavis-Communication. На данный момент postfix отправит все письма на localhost:10024
который является сервисом amavis. После всех проверок измененная версия отправляется обратно localhost:10025
который является постфиксным сервисом для получения почты amavis.
Моя идея: UNIX SOCKETS (из соображений безопасности; не важно почему)
Поэтому я настроил amavis для создания сокета Unix в /run/amavis/amavis.socket
,
И я изменил это:
amavis-forward:[127.0.0.1]:10024` to `amavis-forward:unix:/run/amavis/amavis.sock
Но тогда я получаю эту ошибку:
Jan 5 13:55:23 server postfix/smtp[1447]: fatal: unknown service: /run/amavis/amavis.sock/tcp
Jan 5 13:55:24 server postfix/qmgr[1254]: warning: private/amavis-forward socket: malformed response
Jan 5 13:55:24 server postfix/qmgr[1254]: warning: transport amavis-forward failure -- see a previous warning/fatal/panic logfile record for the problem description
Таким образом, статус почты установлен на status=deferred (unknown mail transport error)
,
master.cf:
...
# Amavis
amavis-forward unix - - - - 2 smtp
-o smtp_tls_security_level=none
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
...
За:10024 все работает нормально. Как я могу решить это?
2 ответа
Отказ от ответственности: это половина ответа, потому что я могу использовать сокет, когда postfix -> amavis, но я не могу использовать его, когда amavis -> postfix. См. Объяснение в конце этого ответа.
Чтобы использовать сокет, вы должны использовать LMTP вместо SMTP для доставки почты из postfix в amavis.
Как сказал выше NickW, вам нужно поместить сокет amavis в каталог очереди Postfix. В этом ответе я предполагаю, что каталог очереди postfix /var/spool/postfix/
,
Создать каталог для хранения сокета amavis
mkdir /var/spool/postfix/amavis/
chmod 750 /var/spool/postfix/amavis/
chown amavis:amavis /var/spool/postfix/amavis/
Добавить пользователя postfix в группу amavis
usermod -G amavis postfix
Конфигурация в amavisd.conf
# for socket, it should reside in /var/spool/postfix
$unix_socketname = "/var/spool/postfix/amavis/amavisd.sock";
# set permission so amavis group can access this socket
$unix_socket_mode = 0660;
# Replace $interface_policy{'SOCK'} = 'AM.PDP';
$interface_policy{'SOCK'} = 'mysock';
$policy_bank{'mysock'} = {
protocol => 'LMTP',
auth_required_release => 0, # don't require secret-id for release
};
Postfix main.cf
content_filter = amavis-forward:unix:amavis/amavisd.sock
Postfix master.cf
# Amavis
amavis-forward unix - - - - 2 lmtp
-o lmtp_data_done_timeout=1200
-o lmtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
Результат
amais postfix/smtpd[13393]: connect from localhost[127.0.0.1]
amais postfix/smtpd[13393]: 4E0B82340F: client=localhost[127.0.0.1]
amais postfix/cleanup[13359]: 4E0B82340F: message-id=<20150106070245.4E0B82340F@example.net>
amais postfix/qmgr[13352]: 4E0B82340F: from=<root@example.net>, size=344, nrcpt=1 (queue active)
amais postfix/smtpd[13363]: connect from localhost[127.0.0.1]
amais postfix/smtpd[13363]: 6081E2340B: client=localhost[127.0.0.1]
amais postfix/cleanup[13359]: 6081E2340B: message-id=<20150106070245.4E0B82340F@example.net>
amais postfix/qmgr[13352]: 6081E2340B: from=<root@example.net>, size=688, nrcpt=1 (queue active)
amais postfix/smtpd[13363]: disconnect from localhost[127.0.0.1]
amais postfix/local[13365]: 6081E2340B: to=<root@example.net>, orig_to=<koala@example.net>, relay=local, delay=0.01, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
amais postfix/qmgr[13352]: 6081E2340B: removed
amais amavis[13113]: (13113-03) Passed CLEAN {RelayedInbound}, mysock <root@example.net> -> <koala@example.net>, Message-ID: <20150106070245.4E0B82340F@example.net>, mail_id: MLZDzoda7siu, Hits: -, size: 344, queued_as: 6081E2340B, 90 ms
amais postfix/lmtp[13361]: 4E0B82340F: to=<koala@example.net>, relay=example.net[amavis/amavisd.sock], delay=0.11, delays=0.01/0/0.01/0.09, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 6081E2340B)
amais postfix/qmgr[13352]: 4E0B82340F: removed
Для amavis -> postfix transport это контролируется параметром forward_method
, Я не знаком с этой конфигурацией, за исключением SMTP. В примере на этой странице, очевидно, протокол, поддерживаемый этим параметром, это pipe, smtp и bsmtp. Кроме того, на основе постфиксной архитектуры postfix принимает сообщения только от smtpd, qmqmd или sendmail.
Это решение для связи amavis с постфиксом через сокет unix. Это вторая половина ответа masegaloeh.
Во-первых, вы должны изменить /var/spool/postfix/amavis
каталог:
chmod 770 /var/spool/postfix/amavis
chown amavis:postfix /var/spool/postfix/amavis
Идея заключается в том, что Postfix создаст службу smtpd для сокетов Unix в этом каталоге. Проблема в том, что вы должны определить это в master.cf как ../amavis/amavis-accept - - - 2 smtpd
но затем postfix будет искать файл PID в pid/unix...amavis/amavis-accept
который не работает.
Поэтому мы должны использовать обходной путь:
Создать ссылку на amavis
каталог:
cd /var/spool/postfix/public
ln -s ../amavis amavis
После этого должен быть подготовлен каталог файлов pid:
cd /var/spool/postfix/pid
mkdir unix.amavis
chown root:root unix.amavis
chmod 700 unix.amavis
Теперь нам нужно настроить службу smtpd на прием почты (master.cf):
amavis/amavis-accept unix n - - - - smtpd
-o smtpd_tls_security_level=none
-o cleanup_service_name=amaviscleanup
-o mynetworks=127.0.0.0/8
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_data_restrictions=reject_unauth_pipelining
-o smtpd_end_of_data_restrictions=
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_unknown_recipient_checks
Теперь настройте amavis в amavisd.conf или в файле конфигурации вашей операционной системы:
$forward_method = 'smtp:/var/spool/postfix/amavis/amavis-accept';
КАК ЭТО УСТРОЕНО
Почта пересылается амавису, которую вы можете увидеть в первой половине ответа Масегалоэ. Затем amavis отправляет его обратно в сокет unix с помощью smtp.
Проблема была в постфиксе. Вы должны создать unix-сокет, к которому amavis может получить доступ без добавления amavis в postmap или postfix группу. Поэтому я впервые использовал ../amavis/amavis-accept
поэтому сокет успешно создан. Но postfix создает pid-файл и использует это имя. В качестве постфикса Unix используется сокет pid/unix. + services name
который был pid/unix.../amavis/amavis-accept.
Поэтому я создал эту ссылку в public
папка и так postfix может создать сокет (установить права доступа к каталогу amavis) и мне нужно только amavis/amavis-accept
в master.cf.
При такой конфигурации файл pid pid/unix.amavis/amavis.accept
, Для этого мне нужно было только создать unix.amavis directory
и из-за unix.amavis
и не unix...amavis
он немного соответствует стилю каталога pid.
LMTP не работает для меня!