Módulo Mail#

O módulo mail principal implementa funcionalidades básicas para um servidor proxy de email: isso inclui suporte para protocolos SMTP, IMAP e POP3, configuração de blocos de servidor, roteamento de requisições de email, autenticação de usuário e suporte SSL/TLS para proteger conexões de email.

Os outros módulos nesta seção estendem essa funcionalidade, permitindo que você configure e otimize flexivelmente o servidor de email para vários cenários e requisitos.

Ao compilar a partir do código fonte, este módulo não é compilado por padrão; ele deve ser habilitado com a --with-mail opção de compilação. Em pacotes e imagens dos nossos repositórios, o módulo está incluído na compilação.

Exemplo de Configuração#

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;
    }
}

Diretivas#

listen#

Sintaxe

listen address[:port] [ssl] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on | off] [reuseport] [so_keepalive=on|off|[keepidle]:[samp:keepintvl]:[samp:keepcnt]];

Padrão

Contexto

server

Define o address e port para o socket no qual o servidor aceitará conexões. É possível especificar apenas a port, para que o Angie escute em todas as interfaces IPv4 (e IPv6, se habilitado) disponíveis. O endereço também pode ser um nome de host, por exemplo:

listen 127.0.0.1:110;
listen *:110;
listen 110;     # mesmo que *:110
listen localhost:110;

Endereços IPv6 são especificados entre colchetes:

listen [::1]:110;
listen [::]:110;

Sockets de domínio UNIX são especificados com o prefixo unix::

listen unix:/var/run/angie.sock;

Nota

Servidores diferentes devem escutar em pares address:port diferentes.

ssl

permite especificar que todas as conexões aceitas nesta porta devem funcionar em modo SSL.

proxy_protocol

permite especificar que todas as conexões aceitas nesta porta devem usar o protocolo PROXY. As informações obtidas são passadas para o servidor de autenticação e podem ser usadas para alterar o endereço do cliente.

A diretiva listen pode ter vários parâmetros adicionais específicos para chamadas de sistema relacionadas a sockets.

backlog=number

define o parâmetro backlog na chamada listen() que limita o comprimento máximo da fila de conexões pendentes. Por padrão, backlog é definido como -1 no FreeBSD, DragonFly BSD e macOS, e como 511 em outras plataformas.

rcvbuf=size

define o tamanho do buffer de recepção (a opção SO_RCVBUF) para o socket de escuta.

sndbuf=size

define o tamanho do buffer de envio (a opção SO_SNDBUF) para o socket de escuta.

bind

este parâmetro instrui a fazer uma chamada bind() separada para um par address:port específico. O fato é que se houver várias diretivas listen com a mesma port mas endereços diferentes, e uma das diretivas listen escuta em todos os endereços para a porta especificada (*:port), o Angie fará bind() apenas para *:port. Deve-se notar que a chamada de sistema getsockname() será feita neste caso para determinar o endereço que aceitou a conexão. Se os parâmetros backlog, rcvbuf, sndbuf, ipv6only, reuseport ou so_keepalive forem usados, então para um par address:port específico uma chamada bind() separada sempre será feita.

ipv6only=on | off

este parâmetro determina (via a opção de socket IPV6_V6ONLY) se um socket IPv6 escutando em um endereço curinga [::] aceitará apenas conexões IPv6 ou tanto conexões IPv6 quanto IPv4. Este parâmetro está ativado por padrão. Só pode ser definido uma vez na inicialização.

multipath

habilita aceitar conexões via Multipath TCP (MPTCP), suportado no kernel Linux versão 5.6 e posterior.

so_keepalive=on | off | [keepidle]:[keepintvl]:[keepcnt]

Configura o comportamento "TCP keepalive" para o socket de escuta.

''

se este parâmetro for omitido, as configurações do sistema operacional estarão em vigor para o socket

on

a opção SO_KEEPALIVE é ativada para o socket

off

a opção SO_KEEPALIVE é desativada para o socket

Alguns sistemas operacionais suportam a configuração de parâmetros TCP keepalive por socket usando as opções de socket TCP_KEEPIDLE, TCP_KEEPINTVL e TCP_KEEPCNT. Em tais sistemas (atualmente, Linux 2.4+, NetBSD 5+ e FreeBSD 9.0-STABLE), eles podem ser configurados usando os parâmetros keepidle, keepintvl e keepcnt. Um ou dois parâmetros podem ser omitidos, neste caso a configuração padrão do sistema para a opção de socket correspondente estará em vigor.

Por exemplo,

so_keepalive=30m::10

definirá o timeout de inatividade (TCP_KEEPIDLE) para 30 minutos, deixará o intervalo de sonda (TCP_KEEPINTVL) em seu padrão do sistema, e definirá a contagem de sondas (TCP_KEEPCNT) para 10 sondas.

Servidores diferentes devem escutar em pares address:port diferentes.

mail#

Sintaxe

mail { ... }

Padrão

Contexto

main

Fornece o contexto do arquivo de configuração no qual as diretivas do servidor de email são especificadas.

max_commands#

Adicionado na versão 1.7.0.

Sintaxe

max_commands number;

Padrão

max_commands 1000;

Contexto

mail, server

Define o número máximo de comandos emitidos durante a autenticação para melhorar a proteção contra ataques DoS.

max_errors#

Sintaxe

max_errors número;

Padrão

max_errors 5;

Contexto

mail, server

Define o número de erros de protocolo após os quais a conexão é fechada.

protocol#

Sintaxe

protocol imap | pop3 | smtp;

Padrão

Contexto

server

Define o protocolo para um servidor proxy. Os protocolos suportados são IMAP, POP3 e SMTP.

Se a diretiva não for definida, o protocolo pode ser detectado automaticamente com base na porta conhecida especificada na diretiva listen:

imap: 143, 993
pop3: 110, 995
smtp: 25, 587, 465

Ao compilar a partir do código-fonte, protocolos desnecessários podem ser desabilitados usando as ‑‑without‑mail_imap_module, ‑‑without‑mail_pop3_module e ‑‑without‑mail_smtp_module opções de compilação.

resolver#

Sintaxe

resolver endereço ... [valid=tempo] [ipv4=on | off] [ipv6=on | off] [status_zone=zona];

Padrão

resolver off;

Contexto

mail, server

Configura servidores de nomes usados para encontrar o nome do host do cliente para passá-lo ao servidor de autenticação, e no comando XCLIENT ao fazer proxy SMTP. Por exemplo:

resolver 127.0.0.53 [::1]:5353;

O endereço pode ser especificado como um nome de domínio ou endereço IP, com uma porta opcional. Se a porta não for especificada, a porta 53 é usada. Os servidores de nomes são consultados em modo round-robin.

Por padrão, o Angie armazena em cache as respostas usando o valor TTL de uma resposta. O parâmetro opcional valid permite sobrescrever isso:

valid

parâmetro opcional permite sobrescrever a validade da entrada em cache

resolver 127.0.0.53 [::1]:5353 valid=30s;

Por padrão, o Angie procurará endereços IPv4 e IPv6 durante a resolução.

ipv4=off

desabilita a busca de endereços IPv4

ipv6=off

desabilita a busca de endereços IPv6

status_zone

parâmetro opcional, habilita coleta de estatísticas para a zona especificada

Dica

Para prevenir spoofing de DNS, é recomendado configurar servidores DNS em uma rede local confiável adequadamente protegida.

Dica

Ao executar no Docker, use seu endereço de servidor DNS interno como 127.0.0.11.

resolver_timeout#

Sintaxe

resolver_timeout tempo;

Padrão

resolver_timeout 30s;

Contexto

mail, server

Define um timeout para operações DNS, por exemplo:

resolver_timeout 5s;

server#

Sintaxe

server { ... }

Padrão

Contexto

mail

Define a configuração para um servidor.

server_name#

Sintaxe

server_name nome;

Padrão

server_name hostname;

Contexto

mail, server

Define o nome do servidor que é usado:

  • na saudação inicial do servidor POP3/SMTP;

  • no salt durante a autenticação SASL CRAM-MD5;

  • no comando EHLO ao conectar ao backend SMTP, se a passagem do comando XCLIENT estiver habilitada.

Se a diretiva não for especificada, o hostname da máquina é usado.

timeout#

Sintaxe

timeout tempo;

Padrão

timeout 60s;

Contexto

mail, server

Define o timeout que é usado antes que o proxy para o backend seja iniciado.