Почтовый модуль#
Реализует почтовый прокси: Angie обслуживает подключения IMAP-, POP3- и SMTP-клиентов и, когда внешний сервер аутентификации принимает клиента и выбирает для него бэкенд, передает сессию клиента на этот бэкенд. Остальные модули этого раздела добавляют поддержку протоколов, обмен с сервером аутентификации, SSL/TLS и настройки проксирования.
При сборке из исходного кода модуль не собирается по
умолчанию; его необходимо включить с помощью
параметра сборки --with-mail.
В пакетах и образах из наших репозиториев модуль
включен в сборку. Angie работает посредником между почтовыми клиентами и бэкендами и
обрабатывает каждую сессию в четыре этапа: Клиент подключается к Angie, а не к бэкенду. Angie сам отправляет
приветствие, отвечает на запросы о возможностях сервера, выполняет STARTTLS
и получает учетные данные клиента одним из методов, заданных директивами
imap_auth, pop3_auth или smtp_auth. Angie передает учетные данные серверу аутентификации, заданному директивой
auth_http, в заголовках HTTP-запроса. Если SMTP-клиент отправляет
почту без аутентификации, этот запрос уходит после его команды
Сервер аутентификации принимает или отклоняет клиента. Принимая клиента,
сервер аутентификации возвращает IP-адрес и порт бэкенда в заголовках ответа
Angie открывает TCP-соединение с бэкендом, без TLS, и входит на него от
имени клиента IMAP-командой В блоке Минимальная конфигурация проксирует IMAP- и POP3-сессии на один бэкенд по
адресу 192.0.2.10. Сервер аутентификации — это location в том же Angie: он
принимает любого клиента и оставляет проверку пароля бэкенду, что подходит для
включенных по умолчанию методов входа с паролем в открытом виде. Блок
Поскольку бэкенд сам проверяет пароль, включена директива
proxy_pass_error_message: клиент с неверным паролем получает ответ
бэкенда с ошибкой, а не сообщение о внутренней ошибке, после чего Angie
закрывает соединение. Сервер аутентификации получает пароли клиентов в
незашифрованном виде, поэтому он должен слушать локальный или другой
доверенный адрес. Более полная конфигурация также проксирует SMTP и включает дополнительные
методы аутентификации. Ее сервер аутентификации, в данном случае CGI-скрипт,
должен сам проверять дайджесты APOP и CRAM-MD5 и возвращать пароль пользователя
в Добавлено в версии 1.12.0. Добавляет тег к записям error_log каждой сессии, которую
обслуживает сервер. В отличие от одноименных директив модулей
http и stream,
значение — статическая строка, переменные в ней не поддерживаются. Директива
может задаваться несколько раз для добавления нескольких тегов. Директивы
наследуются с предыдущего уровня конфигурации при условии, что на данном
уровне не описаны свои директивы Теги выводятся в виде списка По умолчанию — server Задает адрес и порт для сокета, на котором сервер будет принимать соединения. Можно указать только порт, и тогда Angie будет слушать на всех доступных IPv4-интерфейсах (и IPv6, если он включен). Кроме того, адрес может быть именем хоста, например: IPv6-адреса задаются в квадратных скобках: UNIX-сокеты задаются префиксом Примечание Разные серверы должны слушать на разных парах адрес:порт. указывает на то, что все соединения, принимаемые на данном слушающем сокете, должны работать в режиме SSL. указывает на то, что все соединения, принимаемые на данном порту, должны использовать протокол PROXY. Полученная информация передается серверу аутентификации и может быть использована для изменения адреса клиента. В директиве задает параметр задает размер буфера приема (параметр задает размер буфера передачи (параметр указывает, что для данной пары адрес:порт нужно делать отдельный вызов
определяет (через параметр сокета включает прием соединений по протоколу Multipath TCP (MPTCP),
поддерживаемому в ядре Linux с версии 5.6. Конфигурирует для слушающего сокета поведение "TCP keepalive". если параметр опущен, для сокета будут действовать настройки операционной системы для сокета включается параметр для сокета параметр Некоторые операционные системы позволяют настраивать "TCP keepalive"
для отдельного сокета с помощью параметров сокета Например, установит таймаут бездействия ( Предоставляет контекст конфигурационного файла, в котором указываются директивы почтового прокси. Задает максимальное количество команд, отправляемых во время аутентификации,
для усиления защиты от DoS-атак. Задает число ошибок протокола, по достижении которого соединение закрывается. Задает протокол проксируемого сервера. Поддерживаются протоколы IMAP, POP3 и SMTP. Если директива не указана, то протокол может быть определен автоматически по общеизвестному порту, указанному в директиве При сборке из исходного кода поддержку
ненужных протоколов можно отключить с помощью параметров сборки По умолчанию mail, server Задает серверы DNS, с помощью которых Angie определяет имя хоста SMTP-клиента,
чтобы передать его серверу аутентификации
в заголовке запроса Адрес может быть указан в виде доменного имени или IP-адреса, и необязательного порта.
Если порт не указан, используется порт 53. Серверы DNS опрашиваются циклически. Необходимо указать хотя бы один адрес DNS-сервера или параметр Помимо явно заданных адресов серверов директива распознает: отключает преобразование имени хоста клиента и отменяет
унаследованное значение директивы считывает адреса DNS-серверов из указанного файла или из
Файл может содержать строки Адреса, считанные из файла, добавляются к адресам, заданным явно в
директиве, и все они затем опрашиваются совместно циклическим образом. Если
файл отсутствует, недоступен для чтения или не содержит адресов, а явно ни
один сервер не задан, используется сервер по умолчанию В процессе работы Angie перечитывает файл при его изменении, обновляя набор
DNS-серверов. Примечание Рекомендуется использовать локальный доверенный резолвер, например
Примечание Значение директивы наследуется вложенными блоками
и может быть переопределено в них при необходимости.
В пределах одного блока директиву допустимо указывать только один раз;
повторное указание является ошибкой конфигурации. При поиске имени хоста клиента Angie кэширует каждый DNS-ответ на время,
заданное его TTL. Необязательный параметр необязательный параметр, позволяет переопределить срок кэширования ответа По умолчанию Angie будет искать как IPv4-, так и IPv6-адреса при преобразовании имен в адреса. запрещает поиск IPv4-адресов запрещает поиск IPv6-адресов необязательный параметр, включает сбор информации о запросах и ответах сервера DNS в указанной зоне Совет Для предотвращения DNS-спуфинга рекомендуется использовать DNS-серверы в защищенной доверенной локальной сети. Совет При запуске в Docker используйте соответствующий внутренний адрес DNS-сервера, например Задает таймаут для преобразования имени в адрес, например: Задает конфигурацию для сервера. Задает имя сервера, используемое: в начальном приветствии POP3/SMTP-сервера; в salt при аутентификации SASL-методом CRAM-MD5; в команде EHLO при подключении к SMTP-бэкенду, если разрешена передача команды XCLIENT. Если директива не указана, используется имя хоста машины. Задает таймаут, который используется до начала проксирования на бэкенд.Принцип работы#
RCPT TO.Auth-Server и Auth-Port, а также может вернуть имя
пользователя и пароль для входа на бэкенд.LOGIN или POP3-командами USER и
PASS. SMTP-бэкенду Angie передает сведения о клиенте командой
XCLIENT, если включена директива xclient (по умолчанию
включена), и аутентифицируется командой AUTH PLAIN, если включена
директива proxy_smtp_auth. После этого Angie передает данные между
клиентом и бэкендом.mail нет ни proxy_pass, ни групп upstream: ответ
сервера аутентификации — единственный способ, которым Angie узнает, куда
проксировать сессию. Поэтому директива auth_http нужна каждому
server в блоке mail, даже если он принимает SMTP-почту без
аутентификации. Заголовки запроса и ответа описаны в модуле
Auth HTTP.Пример конфигурации#
mail поместите на верхний уровень angie.conf, а блоки
map и server — внутрь существующего блока http:mail {
auth_http 127.0.0.1:9000/mail-auth;
proxy_pass_error_message on;
server {
listen 143;
protocol imap;
}
server {
listen 110;
protocol pop3;
}
}
http {
map $http_auth_protocol $mail_backend_port {
imap 143;
pop3 110;
}
server {
listen 127.0.0.1:9000;
location = /mail-auth {
add_header Auth-Status OK;
add_header Auth-Server 192.0.2.10;
add_header Auth-Port $mail_backend_port;
return 204;
}
}
}
Auth-Pass, как описано в модуле Auth HTTP:worker_processes auto;
error_log /var/log/angie/error.log info;
events {
worker_connections 1024;
}
mail {
server_name mail.example.com;
auth_http localhost:9000/cgi-bin/auth.cgi;
imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;
pop3_auth plain apop cram-md5;
pop3_capabilities LAST TOP USER PIPELINING UIDL;
smtp_auth login plain cram-md5;
smtp_capabilities "SIZE 10485760" ENHANCEDSTATUSCODES 8BITMIME DSN;
xclient off;
server {
listen 25;
protocol smtp;
}
server {
listen 110;
protocol pop3;
proxy_pass_error_message on;
}
server {
listen 143;
protocol imap;
}
server {
listen 587;
protocol smtp;
}
}
Директивы#
error_log_user_tag#
error_log_user_tag.tags только в логах error_log
с format=json; фильтр filter=tag: находит их при любом формате.listen#
listen адрес[:порт] [ssl] [proxy_protocol] [backlog=число] [rcvbuf=размер] [sndbuf=размер] [bind] [ipv6only=on | off] [multipath] [so_keepalive=on | off | [keepidle]:[keepintvl]:[keepcnt]];listen 127.0.0.1:110;
listen *:110;
listen 110; # то же, что и *:110
listen localhost:110;
listen [::1]:110;
listen [::]:110;
unix:listen unix:/var/run/angie.sock;
sslproxy_protocollisten можно также указать несколько дополнительных параметров, специфичных для связанных с сокетами системных вызовов.backlog=числоbacklog в вызове listen(), который ограничивает максимальный размер очереди ожидающих приема соединений. По умолчанию backlog устанавливается равным -1 для FreeBSD, DragonFly BSD и macOS, и 511 для других платформ.rcvbuf=размерSO_RCVBUF) для слушающего сокета.sndbuf=размерSO_SNDBUF) для слушающего сокета.bindbind(). Без этого параметра, если несколько директив
listen используют один порт с разными адресами и одна из них
слушает на всех адресах этого порта, Angie вызывает bind() только
для wildcard-сокета, а адрес, на который пришло соединение, определяет
системным вызовом getsockname(). Параметры backlog,
rcvbuf, sndbuf, ipv6only, multipath и
so_keepalive всегда влекут за собой отдельный вызов bind().ipv6only=on | offIPV6_V6ONLY), будет ли слушающий на wildcard-адресе [::] IPv6-сокет принимать только IPv6-соединения, или же одновременно IPv6- и IPv4-соединения. По умолчанию параметр включен. Установить его можно только один раз на старте.multipathso_keepalive=on | off | [keepidle]:[keepintvl]:[keepcnt]''onSO_KEEPALIVEoffSO_KEEPALIVE выключаетсяTCP_KEEPIDLE, TCP_KEEPINTVL и
TCP_KEEPCNT. На таких системах (в настоящее время это Linux, NetBSD,
DragonFly, FreeBSD и macOS) значения этих параметров сокета задаются параметрами
keepidle, keepintvl и keepcnt. Один или два параметра могут быть опущены,
в таком случае для соответствующего параметра сокета будут действовать
стандартные системные настройки. В macOS параметр keepidle задает
вместо TCP_KEEPIDLE параметр сокета TCP_KEEPALIVE.so_keepalive=30m::10
TCP_KEEPIDLE) в 30 минут, для интервала проб (TCP_KEEPINTVL) будет действовать стандартная системная настройка, а счетчик проб (TCP_KEEPCNT) будет равен 10.mail#
max_commands#
max_errors#
protocol#
listen:imap: 143, 993
pop3: 110, 995
smtp: 25, 587, 465
--without-mail_imap_module,
--without-mail_pop3_module и --without-mail_smtp_module.resolver#
resolver [адрес ...] [conf [=файл]] [valid=время] [ipv4=on | off] [ipv6=on | off] [status_zone=зона] | off;resolver off;Client-Host, а
SMTP-бэкенду — в команде XCLIENT, например:resolver 127.0.0.53 [::1]:5353;
conf,
кроме формы resolver off;.offconf [=файл]/etc/resolv.conf, если файл не указанnameserver в том же формате, что
использует системный резолвер:nameserver 127.0.1.4
nameserver 127.0.1.5
127.0.0.1:53.127.0.0.53 (systemd-resolved), а не публичный (например, 8.8.8.8).
Публичные резолверы раскрывают DNS-запросы третьим сторонам и повышают
риск атак с подменой кэша.valid позволяет
переопределить этот срок:validresolver 127.0.0.53 [::1]:5353 valid=30s;
ipv4=offipv6=offstatus_zone127.0.0.11.resolver_timeout#
resolver_timeout 5s;
server#
server_name#
timeout#