Este artigo é sobre como configurar um servidor de email moderno.
Postfix + Dovecot. SPF + DKIM + rDNS. Com IPv6.
Com criptografia TLS. Com suporte para vários domínios - peça um certificado SSL real.
Com proteção anti-spam e alta classificação anti-spam em outros servidores de email.
Com suporte para múltiplas interfaces físicas.
Com o OpenVPN, que se conecta através do IPv4 e que fornece o IPv6.
Se você não deseja aprender todas essas tecnologias, mas deseja configurar esse servidor, este artigo é para você.
Não há tentativas de explicar todos os detalhes do artigo. A explicação vai para o que não está configurado de maneira padrão ou é importante do ponto de vista do consumidor.
A motivação para configurar um servidor de correio é o meu sonho antigo. Pode parecer bobagem, mas IMHO, é muito melhor do que sonhar com um carro novo da sua marca favorita.
A motivação para configurar o IPv6 é dois. Os profissionais de TI precisam aprender constantemente novas tecnologias para sobreviver. Gostaria de dar a minha modesta contribuição para a luta contra a censura.
A motivação para configurar o OpenVPN é apenas para o IPv6 funcionar na máquina local.
A motivação para configurar várias interfaces físicas é que, no meu servidor, uma interface é "lenta mas ilimitada" e a outra é "rápida, mas com tarifa".
A motivação para definir as configurações do Bind é que meu provedor fornece um servidor DNS instável e o Google também falha. Eu quero um servidor DNS estável para uso pessoal.
Motivação para escrever um artigo - um rascunho foi escrito há 10 meses e eu já o examinei duas vezes. Se mesmo o autor precisa disso regularmente, há uma alta probabilidade de que outros precisem.
Não há solução universal para o servidor de email. Mas vou tentar escrever algo como "faça assim e depois, quando tudo funcionar como deveria - jogue fora o excesso".
Existe um servidor de Colocation no tech.ru. É possível comparar com OVH, Hetzner, AWS. Para resolver esse problema, a cooperação com o tech.ru será muito mais eficaz.
O Debian 9 está instalado no servidor.
No servidor, existem 2 interfaces `eno1` e` eno2`. O primeiro é ilimitado e o segundo é rápido, respectivamente.
Existem 3 endereços IP estáticos, XX.XX.XX.X0 e XX.XX.XX.X1 e XX.XX.XX.X2 na interface `eno1` e XX.XX.XX.X5 na interface` eno2`.
Existe XXXX: XXXX: XXXX: XXXX :: / 64 um pool de endereços IPv6 que são atribuídos à interface `eno1` e a partir dela XXXX: XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 em minha solicitação atribuída a` eno2`.
Existem 3 domínios `domain1.com`,` domain2.com`, `domain3.com`. Para `domain1.com` e` domain3.com`, existe um certificado SSL.
Existe uma conta do Google na qual você deseja vincular a caixa de correio `vasya.pupkin @ domain1.com` (recebendo e enviando e-mails diretamente da interface do Gmail).
Deve haver uma caixa de correio `support @ domain2.com ', uma cópia do e-mail da qual eu quero ver no meu gmail. E raramente é possível enviar algo em nome de `support @ domain2.com 'através da interface da web.
Deve haver uma caixa de correio `ivanov @ domain3.com`, que Ivanov usará em seu iPhone.
As cartas enviadas devem cumprir todos os requisitos atuais de anti-spam.
Deve haver o nível mais alto de criptografia fornecido nas redes públicas.
Deve haver suporte ao IPv6 para o envio e o recebimento de emails.
Deve haver um SpamAssassin que nunca excluirá emails. E ele saltará ou pulará ou enviará a pasta Spam para o IMAP.
O aprendizado automático do SpamAssassin deve ser configurado: se eu mover a letra para a pasta Spam, aprenderei disso; se eu mover a carta da pasta Spam, aprenderei com isso. Resultados de aprendizado do SpamAssassin - devem afetar o alcance da mensagem na pasta Spam.
Os scripts php devem poder enviar email em nome de qualquer domínio neste servidor.
Deve haver um serviço openvpn com a capacidade de usar o IPv6 em um cliente que não possui IPv6.
Primeiro, você precisa configurar interfaces e roteamento, incluindo o IPv6.
Em seguida, você precisará configurar o OpenVPN, que se conectará via IPv4 e fornecerá ao cliente um endereço IPv6 estático-real. Esse cliente terá acesso a todos os serviços IPv6 no servidor e a qualquer recurso IPv6 na Internet.
Então será necessário configurar o Postfix para enviar cartas + SPF + DKIM + rDNS e outros ninharias semelhantes.
Então você precisará configurar o Dovecot e configurar o Multidomain.
Você precisará configurar o SpamAssassin e configurar o treinamento.
Por fim, instale o Bind.
============== Multi-interfaces ==============
Para configurar as interfaces, você precisa registrar isso em "/ etc / network / interfaces".
Essas configurações podem ser aplicadas em qualquer servidor no tech.ru (com um pouco de coordenação com o suporte) e funcionarão imediatamente como deveriam.
Se a experiência de criação de coisas semelhantes para Hetzner, OVH - há namorada. Mais difícil.
eno1 é o nome da placa de rede nº 1 (lenta mas ilimitada).
eno2 é o nome da placa de rede nº 2 (rápido, mas com tarifa).
tun0 é o nome da placa de rede virtual do OpenVPN.
XX.XX.XX.X0 - IPv4 # 1 no eno1.
XX.XX.XX.X1 - IPv4 # 2 no eno1.
XX.XX.XX.X2 - IPv4 # 3 no eno1.
XX.XX.XX.X5 - IPv4 # 1 no eno2.
XX.XX.XX.1 - gateway IPv4.
XXXX: XXXX: XXXX: XXXX :: / 64 - IPv6 para o servidor inteiro.
XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 - IPv6 para eno2, todo o resto vai para eno1 do lado de fora.
XXXX: XXXX: XXXX: XXXX :: 1 - gateway IPv6 (vale a pena notar que você pode / precisa fazer um amigo aqui. Indique a opção IPv6).
dns-nameservers - 127.0.0.1 são especificados (porque o bind está instalado localmente) e 213.248.1.6 (este é do tech.ru).
"Tabela eno1t" e "tabela eno2t" - o significado dessas regras de rota é que o tráfego que passa por eno1 -> passa por ele, e o tráfego que passa por eno2 -> passa por ele. E também as conexões iniciadas pelo servidor passariam pelo eno1.
ip route add default via XX.XX.XX.1 table eno1t
Com este comando, definimos que qualquer tráfego incompreensível que se enquadre em qualquer regra com a “tabela eno1t” marcada -> envia para a interface eno1.
ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
Com este comando, definimos que direciona qualquer tráfego iniciado pelo servidor para a interface eno1.
ip rule add table eno1t from XX.XX.XX.X0 ip rule add table eno1t to XX.XX.XX.X0
Com este comando, definimos as regras para marcar o tráfego por nós mesmos.
auto eno1:2 iface eno1:2 inet static address XX.XX.XX.X2 netmask 255.255.255.0 post-up ip rule add table eno1t from XX.XX.XX.X2 post-up ip rule add table eno1t to XX.XX.XX.X2
Este bloco define o segundo IPv4 para a interface eno1.
ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
Com este comando, definimos a rota dos clientes OpenVPN para o IPv4 local, exceto XX.XX.XX.X0.
Por que esse comando é suficiente para todos os IPv4 - eu ainda não entendo.
iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 gateway XXXX:XXXX:XXXX:XXXX::1
Nós definimos o endereço para a própria interface. O servidor irá usá-lo como um endereço "de saída". Não será mais usado.
Por que é indicado ": 1: 1 ::" tão complicado? Que o OpenVPN funcionou corretamente e somente para isso. Mais sobre isso mais tarde.
No tópico gateway - é assim que funciona. Mas da maneira certa - aqui você deve especificar o comutador IPv6 ao qual o servidor está conectado.
No entanto, por algum motivo, o IPv6 para de funcionar se eu fizer isso. Talvez sejam alguns problemas do tech.ru.
ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
Isso está adicionando endereços IPv6 à interface. Se você precisar de cem endereços, significa cem linhas neste arquivo.
iface eno1 inet6 static address XXXX:XXXX:XXXX:XXXX:1:1::/64 ... iface eno2 inet6 static address XXXX:XXXX:XXXX:XXXX:1:2::/96 ... iface tun0 inet6 static address XXXX:XXXX:XXXX:XXXX:1:3::/80
Marcou os endereços e sub-redes de todas as interfaces para que fique claro.
eno1 - deve ser "/ 64" - porque esse é todo o nosso conjunto de endereços.
tun0 - a sub-rede deve ser maior que eno1. Caso contrário, você não poderá configurar o gateway IPv6 para clientes OpenVPN.
eno2 - a sub-rede deve ser maior que tun0. Caso contrário, os clientes OpenVPN não poderão obter endereços IPv6 locais.
Para maior clareza, escolhi a etapa 16 da sub-rede, mas você pode até executar a etapa "1", se desejar.
Por conseguinte, 64 + 16 = 80 e 80 + 16 = 96.
Para maior clareza:
XXXX: XXXX: XXXX: XXXX: 1: 1: AAAA: AAAA - são endereços que devem ser atribuídos a sites ou serviços específicos na interface eno1.
XXXX: XXXX: XXXX: XXXX: 1: 2: AAAA: AAAA - são endereços que devem ser atribuídos a sites ou serviços específicos na interface eno2.
XXXX: XXXX: XXXX: XXXX: 1: 3: AAAA: AAAA são endereços que devem ser atribuídos aos clientes OpenVPN ou usados como endereços de serviço OpenVPN.
Para configurar a rede - deve ser possível reiniciar o servidor.
As alterações de IPv4 são capturadas durante a execução (certifique-se de envolvê-lo na tela - caso contrário, este comando simplesmente soltará a rede no servidor):
/etc/init.d/networking restart
No arquivo "/ etc / iproute2 / rt_tables", adicione no final:
100 eno1t 101 eno2t
Sem isso, você não pode usar tabelas personalizadas no arquivo "/ etc / network / interfaces".
Os números devem ser exclusivos e menores que 65535.
As alterações no IPv6 mudam facilmente sem a reinicialização, mas para isso você precisa aprender pelo menos três comandos:
ip -6 addr ... ip -6 route ... ip -6 neigh ...
Configurando "/etc/sysctl.conf"
Essas são as configurações do sysctl do meu servidor. Eu noto o importante.
net.ipv4.ip_forward = 1
Sem isso, o OpenVPN não funcionará de forma alguma.
net.ipv6.ip_nonlocal_bind = 1
Qualquer pessoa que tentar vincular o IPv6 (por exemplo, nginx) logo após a interface estar ativada receberá um erro. Que esse endereço não esteja disponível.
Para evitar tal situação, é feita uma configuração.
net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.all.proxy_ndp = 1
Sem essas configurações de IPv6, o tráfego do cliente OpenVPN não chega ao mundo.
Outras configurações são irrelevantes ou não me lembro por que são.
Mas por precaução, deixo "como está".
Para que as alterações neste arquivo sejam detectadas sem a reinicialização do servidor, é necessário executar o comando:
sysctl -p
Mais detalhes sobre as regras da "tabela":
habr.com/post/108690============== OpenVPN ==============
O OpenVPN IPv4 não funciona sem o iptables.
Eu tenho estas tabelas de ip para VPN:
iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
YY.YY.YY.YY é o meu endereço IPv4 estático da máquina local.
10.8.0.0/24 - rede IPv4 openvpn. Endereços IPv4 para clientes openvpn.
A sequência de regras é importante.
iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT ... iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 1194 -j DROP iptables -A FORWARD -p udp --dport 1194 -j DROP
Essa é uma limitação para que somente eu possa usar o OpenVPN do meu IP estático.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0 -- -- iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
Para encaminhar pacotes IPv4 entre clientes OpenVPN e a Internet, é necessário registrar um desses comandos.
Para casos diferentes, uma das opções não é adequada.
Ambas as equipes são adequadas para o meu caso.
Depois de ler a documentação, escolhi a primeira opção, porque ela consome menos CPU.
Para que todas as configurações do iptables sejam selecionadas após a reinicialização - você precisa salvá-las em algum lugar.
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6
Tais nomes não foram escolhidos por acaso. O pacote iptables-persistent os utiliza.
apt-get install iptables-persistent
Instalando o pacote principal do OpenVPN:
apt-get install openvpn easy-rsa
Configure um modelo para certificados (substitua seus valores):
make-cadir ~/openvpn-ca cd ~/openvpn-ca ln -s openssl-1.0.0.cnf openssl.cnf
Vamos editar as configurações do modelo de certificado:
mcedit vars
...
Crie um certificado de servidor:
cd ~/openvpn-ca source vars ./clean-all ./build-ca ./build-key-server server ./build-dh openvpn --genkey --secret keys/ta.key
Vamos preparar a oportunidade para criar os arquivos "client-name.opvn" resultantes:
mkdir -p ~/client-configs/files chmod 700 ~/client-configs/files cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf mcedit ~/client-configs/base.conf
Prepararemos um script que agrupará todos os arquivos em um único arquivo opvn.
mcedit ~/client-configs/make_config.sh chmod 700 ~/client-configs/make_config.sh
Criamos o primeiro cliente OpenVPN:
cd ~/openvpn-ca source vars ./build-key client-name cd ~/client-configs ./make_config.sh client-name
O arquivo "~ / client-configs / files / client-name.ovpn" é enviado ao cliente.
Para clientes iOS, você precisará executar o truque:
O conteúdo da tag tls-auth deve estar sem comentários.
E também coloque "key-direction 1" imediatamente antes da tag "tls-auth".
Configure a configuração do servidor OpenVPN:
cd ~/openvpn-ca/keys cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf mcedit /etc/openvpn/server.conf
Isso é necessário para definir um endereço estático para cada cliente (não é necessário, mas eu uso):
Os detalhes mais difíceis e importantes.
Infelizmente, o OpenVPN ainda não é capaz de configurar independentemente o gateway IPv6 para clientes.
Temos que encaminhar isso manualmente para cada cliente.
Arquivo "/etc/openvpn/server-clientconnect.sh":
Arquivo "/etc/openvpn/server-clientdisconnect.sh":
Ambos os scripts usam o arquivo "/ etc / openvpn / variables":
Por que está escrito aqui - acho difícil lembrar.
Agora parece netmask estranho = 112 (deve haver 96).
E o prefixo é estranho, não corresponde à rede tun0.
Mas tudo bem, deixo "como está".
cipher DES-EDE3-CBC
Isso é amador - eu escolhi esse método de criptografar a conexão.
Mais sobre como configurar o OpenVPN IPv4.Mais sobre como configurar o OpenVPN IPv6.============== Postfix ==============
Instalando o pacote principal:
apt-get install postfix
Ao instalar, selecione "site da internet".
Meu "/etc/postfix/main.cf" fica assim:
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) biff = no
Vamos considerar os detalhes dessa configuração.
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
Segundo os cidadãos de Khabrovsk, este bloco contém "desinformação e falsas teses".Apenas 8 anos após o início da minha carreira, comecei a entender como o SSL funciona.
Portanto, terei a liberdade de descrever como usar o SSL (sem responder às perguntas “Como funciona?” E “Por que funciona?”).
A base da criptografia moderna é a criação de um par de chaves (duas linhas muito longas de caracteres).
Uma "chave" é privada, a outra é "pública". Mantemos a chave privada com muito cuidado em segredo. Distribuímos a chave pública para todos.
Usando uma chave pública, você pode criptografar uma sequência de texto para que somente o proprietário da chave privada possa descriptografar.
Bem, essa é toda a base da tecnologia.
Etapa 1 - sites https.
Ao acessar o site, o navegador descobre pelo servidor da Web que o site é https e, portanto, solicita uma chave pública.
O servidor da web fornece a chave pública. Usando a chave pública, o navegador criptografa a solicitação http e a envia.
O conteúdo da solicitação http pode ser lido somente por alguém que tenha uma chave privada, ou seja, apenas o servidor para o qual a chamada é feita.
A solicitação HTTP contém pelo menos um URI. Portanto, se o país está tentando restringir o acesso não a todo o site, mas a uma página específica, para sites https, isso não pode ser feito.
Etapa 2 é a resposta criptografada.
O servidor da web fornece uma resposta que pode ser facilmente lida ao longo do caminho.
A solução é extremamente simples - o navegador gera localmente o mesmo par de chaves público-privado para cada site https.
E junto com a solicitação da chave pública do site, ele envia sua chave pública local.
O servidor da Web se lembra dele e, ao enviar a resposta http, ele criptografa com essa chave pública de um cliente específico.
Agora, a resposta http só pode ser descriptografada pelo proprietário da chave privada do navegador do cliente (ou seja, o próprio cliente).
Etapa número 3 - estabeleça uma conexão segura através de um canal público.
No exemplo n ° 2, existe uma vulnerabilidade - nada impede que os bem-intencionados interceptem a solicitação http e editem as informações da chave pública.
Assim, o intermediário verá quase todo o conteúdo das mensagens enviadas e recebidas até que o canal de comunicação mude.
Combater isso é extremamente simples - basta enviar a chave pública do navegador como uma mensagem criptografada com a chave pública do servidor da web.
O servidor da Web envia, em primeiro lugar, uma resposta como "sua chave pública é assim" e criptografa essa mensagem com a mesma chave pública.
O navegador procura a resposta - se a mensagem "sua chave pública é assim" é recebida -, isso é uma garantia de 100% de que esse canal de comunicação é seguro.
Quão seguro é isso?
A criação desse canal de comunicação seguro ocorre em uma velocidade ping * 2. Por exemplo, 20ms.
Um invasor deve ter uma chave privada de uma das partes com antecedência. Ou escolha uma chave privada por alguns milissegundos.
Hackear uma chave privada moderna levará décadas em um supercomputador.
Etapa # 4 - banco de dados público de chaves públicas.
Obviamente, nesta história toda, existe a possibilidade de um invasor sentado no canal de comunicação entre o cliente e o servidor.
A oportunidade para o cliente é apresentada pelo servidor e para o servidor a ser apresentado pelo cliente. E emule um par de chaves nas duas direções.
Em seguida, o invasor verá todo o tráfego e poderá "editar" o tráfego.
Por exemplo, altere o endereço para onde enviar dinheiro ou copie a senha do banco online ou bloqueie o conteúdo "censurável".
Para combater esses invasores, eles criaram um banco de dados público com chaves públicas para cada site https.
Cada navegador "sabe" sobre a existência de cerca de 200 desses bancos de dados. Isso é pré-instalado em todos os navegadores.
O "conhecimento" é copiado por uma chave pública para cada certificado. Ou seja, é impossível falsificar uma conexão com cada autoridade de certificação específica.
Agora, existe um entendimento simples de como usar o SSL para https.
Se você mexer o cérebro, ficará claro como os serviços especiais podem quebrar algo nesse design. Mas isso lhes custará enormes esforços.
E organizações menores que a NSA ou a CIA - é quase impossível decifrar o nível de proteção existente, mesmo para vip.
Também adicionarei sobre conexões ssh. Não há chaves públicas, o que fazer. A questão é resolvida de duas maneiras.
Opção de senha ssh:
Na primeira conexão, o cliente ssh deve avisar que aqui temos uma nova chave pública do servidor ssh.
E com outras conexões, se o aviso "uma nova chave pública do servidor ssh" aparecer, significa que eles estão tentando ouvi-lo.
Ou na primeira conexão que você ouviu, e agora você está conversando com o servidor sem intermediários.
Na verdade, devido ao fato de o fato de as escutas telefônicas serem reveladas com facilidade, rapidez e facilidade, esse ataque é usado apenas em casos especiais para um cliente específico.
Opção chave ssh:
Tomamos uma unidade flash, escrevemos uma chave privada para o servidor ssh (para isso existem termos e várias nuances significativas, mas estou escrevendo um programa educacional, não instruções de uso).
Deixamos a chave pública na máquina onde o cliente ssh estará e também a mantemos em segredo.
Trazemos a unidade flash para o servidor, inserimos, copiamos a chave privada, queimamos a unidade flash e espalhamos a poeira pelo vento (ou pelo menos formata-a com zeros).
Isso é tudo - após uma operação desse tipo, será impossível quebrar uma conexão ssh. Obviamente, em 10 anos você pode ver o tráfego em um supercomputador - mas essa é uma história diferente.
Peço desculpas pelo offtopic.
Então agora que a teoria é conhecida. Vou falar sobre o fluxo de criação de um certificado SSL.
Usando "openssl genrsa", criamos uma chave privada e "espaços em branco" para a chave pública.
Enviamos os "espaços em branco" para uma empresa terceirizada, à qual pagamos aproximadamente US $ 9 pelo certificado mais simples.
Em algumas horas, recebemos dessa empresa terceirizada nossa chave "pública" e outro conjunto de várias chaves públicas.
Por que uma empresa terceirizada deve pagar pela emissão da minha chave pública - uma questão separada, que não consideraremos aqui.
Agora está claro qual é o significado da inscrição:
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
Na pasta "/ etc / ssl", todos os arquivos para perguntas sobre ssl são armazenados.
domain1.com - nome de domínio.
2018 é o ano da criação das chaves.
"Chave" - designação de que o arquivo é chave privada.
E o significado deste arquivo:
smtpd_tls_cert_file = / etc / ssl / domain1.com.2018.chained.crt
domain1.com - nome de domínio.
2018 é o ano da criação das chaves.
encadeado - uma designação de que existe uma cadeia de chaves públicas (a primeira é a nossa chave pública e o restante é o que veio da empresa que emitiu a chave pública).crt - designação de que existe um certificado pronto (chave pública com explicações técnicas). smtp_bind_address = XX.XX.XX.X0 smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1
Essa configuração não é usada neste caso, mas é escrita como um exemplo.Porque um erro neste parâmetro levará ao envio de spam do seu servidor (sem sua vontade).Então prove a todos que você não é o culpado. recipient_delimiter = +
Talvez muitos não saibam, portanto esse é um símbolo padrão para pastoreio, e isso é suportado pela maioria dos servidores de correio modernos.Por exemplo, se você tiver uma caixa de correio "nomedeusuário@gmail.com", tente enviá-la para "nomedeusuário+spam@gmail.com" - veja o que acontece. inet_protocols = ipv4
Talvez isso seja confuso.Mas isso não é justo. Cada novo domínio é, por padrão, apenas IPv4, então habilito o IPv6 para cada um individualmente. virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
Aqui, definimos que todo o correio recebido vai para dovecot.E as regras para domínio, caixa de correio, alias - procure no banco de dados./etc/postfix/mysql-virtual-mailbox-domains.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_domains WHERE name='%s'
/etc/postfix/mysql-virtual-mailbox-maps.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT 1 FROM virtual_users WHERE email='%s'
/etc/postfix/mysql-virtual-alias-maps.cf user = usermail password = mailpassword hosts = 127.0.0.1 dbname = servermail query = SELECT destination FROM virtual_aliases WHERE source='%s'
Agora, o postfix sabe que você só pode aceitar e-mails para envio posterior por autorização com dovecot.Realmente não entendo por que isso é duplicado aqui. Já indicamos no virtual_transport tudo o que é necessário.Mas o sistema postfix é muito antigo - provavelmente são os castelos dos tempos antigos. smtpd_recipient_restrictions = ... smtpd_helo_restrictions = ... smtpd_client_restrictions = ...
Isso é configurado para cada servidor de correio à sua maneira.Tenho 3 servidores de correio à minha disposição e essas configurações são muito diferentes devido a diferentes requisitos de uso.Você deve configurar com cuidado - caso contrário, o spam o inundará ou pior, o spam o inundará.
Configurando para algum tipo de plugin relacionado à verificação do SPF das mensagens recebidas.
Configurando que todas as cartas enviadas devemos fornecer uma assinatura DKIM.
Este é um detalhe importante no roteamento de email ao enviar emails de scripts php.Arquivo "/etc/postfix/sdd_transport.pcre": /^www-domain1@domain1\.com$/ domain1: /^www-domain2@domain1\.com$/ domain2: /^www-domain3@domain1\.com$/ domain3: /@domain1\.com$/ domain1: /@domain2\.com$/ domain2: /@domain3\.com$/ domain3:
— . — , .
Postfix — .
postfix — «master.cf».
4, 5, 6 — . — .
php «from». .
— nginx+fpm.
— linux-user . fpm-pool.
O Fpm-pool usa qualquer versão do php (isso é ótimo quando você pode usar uma versão diferente do php e até mesmo um php.ini diferente no mesmo servidor para sites vizinhos).
Portanto, um usuário do Linux em particular, "www-domain2", tem um site domain2.com. Este site possui um código para enviar cartas sem especificar o campo de.
Portanto, mesmo nesse caso, as cartas desaparecerão corretamente e nunca entrarão em spam.
Meu "/etc/postfix/master.cf" fica assim: ... smtp inet n - y - - smtpd -o content_filter=spamassassin ... submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject ... policyd-spf unix - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} ... domain1 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X1 -o smtp_helo_name=domain1.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1 -o syslog_name=postfix-domain1 domain2 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X5 -o smtp_helo_name=domain2.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1 -o syslog_name=postfix-domain2 domain3 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X2 -o smtp_helo_name=domain3 -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1 -o syslog_name=postfix-domain3
O arquivo não é completamente fornecido - ele já é muito grande.Observou apenas o que foi alterado. smtp inet n - y - - smtpd -o content_filter=spamassassin ... spamassassin unix - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
Estas são as configurações relacionadas ao spamassasin, sobre isso mais tarde. submission inet n - y - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject
Permitimos que você se conecte ao servidor de correio pela porta 587.Para fazer isso, certifique-se de fazer login. policyd-spf unix - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf
Ative a verificação do SPF. apt-get install postfix-policyd-spf-python
Instale o pacote para verificações do SPF acima. domain1 unix - - n - - smtp -o smtp_bind_address=XX.XX.XX.X1 -o smtp_helo_name=domain1.com -o inet_protocols=all -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1 -o syslog_name=postfix-domain1
. IPv4/IPv6 .
rDNS. rDNS — - IP .
, helo rDNS , email.
helo , — .
Helo rDNS — .
IP .
OVH — rDNS.
tech.ru — .
AWS — .
"Inet_protocols" e "smtp_bind_address6" - é assim que habilitamos o suporte ao IPv6.
Para o IPv6, você também precisa registrar o rDNS.
"Syslog_name" - e é para a conveniência de ler logs.
Eu recomendo comprar certificados aqui .Configurando um monte de postfix + dovecot aqui .Configuração do SPF.============== Pombal ==============
apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam
Configure o mysql, instale os próprios pacotes.Arquivo "/etc/dovecot/conf.d/10-auth.conf" disable_plaintext_auth = yes auth_mechanisms = plain login
A autorização é apenas criptografada.Arquivo "/etc/dovecot/conf.d/10-mail.conf" mail_location = maildir:/var/mail/vhosts/%d/%n
Aqui indicamos a localização das letras.Quero que eles sejam armazenados em arquivos e agrupados por domínio.Arquivo "/etc/dovecot/conf.d/10-master.conf" service imap-login { inet_listener imap { port = 0 } inet_listener imaps { address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1] port = 993 ssl = yes } } service pop3-login { inet_listener pop3 { port = 0 } inet_listener pop3s { address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1] port = 995 ssl = yes } } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 user = postfix group = postfix } } service imap { } service pop3 { } service auth { unix_listener auth-userdb { mode = 0600 user = vmail } unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } user = dovecot } service auth-worker { user = vmail } service dict { unix_listener dict { } }
Este é o principal arquivo de configurações dovecot.Aqui desconectamos conexões não seguras.E habilite conexões seguras.Arquivo "/etc/dovecot/conf.d/10-ssl.conf" ssl = required ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt ssl_key = </etc/nginx/ssl/domain1.com.2018.key local XX.XX.XX.X5 { ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt ssl_key = </etc/nginx/ssl/domain2.com.2018.key }
Configure ssl. Indicamos que o ssl é necessário.
E o próprio certificado. E um detalhe importante é a diretiva "local". Indica ao conectar-se a qual IPv4 local - qual certificado SSL usar.
A propósito, o IPv6 não está configurado aqui, corrigirei essa omissão como um thread posteriormente.
XX.XX.XX.X5 (domínio2) - sem certificado. Para conectar clientes, você deve especificar domain1.com.
XX.XX.XX.X2 (domínio3) - existe um certificado, você pode especificar domain1.com ou domain3.com para conectar clientes.
Arquivo "/etc/dovecot/conf.d/15-lda.conf" protocol lda { mail_plugins = $mail_plugins sieve }
Isso será necessário no futuro para spamassassin.Arquivo "/etc/dovecot/conf.d/20-imap.conf" protocol imap { mail_plugins = $mail_plugins antispam }
Este é um plugin antispam. É necessário treinar spamassasin no momento da transferência de / para a pasta Spam.Arquivo "/etc/dovecot/conf.d/20-pop3.conf" protocol pop3 { }
Apenas esse arquivo é.Arquivo "/etc/dovecot/conf.d/20-lmtp.conf" protocol lmtp { mail_plugins = $mail_plugins sieve postmaster_address = admin@domain1.com }
Configure lmtp.Arquivo "/etc/dovecot/conf.d/90-antispam.conf" plugin { antispam_backend = pipe antispam_trash = Trash;trash antispam_spam = Junk;Spam;SPAM antispam_pipe_program_spam_arg = --spam antispam_pipe_program_notspam_arg = --ham antispam_pipe_program = /usr/bin/sa-learn antispam_pipe_program_args = --username=%Lu }
Configurações de treinamento da Spamassasin no momento da transferência de / para a pasta Spam.Arquivo "/etc/dovecot/conf.d/90-sieve.conf" plugin { sieve = ~/.dovecot.sieve sieve_dir = ~/sieve sieve_after = /var/lib/dovecot/sieve/default.sieve }
Um arquivo que indica o que fazer com os e-mails recebidos.Arquivo "/var/lib/dovecot/sieve/default.sieve" require ["fileinto", "mailbox"]; if header :contains "X-Spam-Flag" "YES" { fileinto :create "Spam"; }
É necessário compilar o arquivo: "sievec default.sieve".Arquivo "/etc/dovecot/conf.d/auth-sql.conf.ext" passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n }
Especificando arquivos sql para autorização.E o próprio arquivo é uma forma de autorização.Arquivo "/etc/dovecot/dovecot-sql.conf.ext" driver = mysql connect = host=127.0.0.1 dbname=servermail user=usermail password=password default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
Isso corresponde às mesmas configurações do postfix.Arquivo "/etc/dovecot/dovecot.conf" protocols = imap lmtp pop3 listen = *, :: dict { } !include conf.d/*.conf !include_try local.conf
O arquivo de configuração principal.O importante é que especificemos aqui, adicione protocolos.============== SpamAssassin ==============
apt-get install spamassassin spamc
Instale os pacotes. adduser spamd --disabled-login
Adicione um usuário em nome de quem. systemctl enable spamassassin.service
Ative o serviço de spamassassin de download automático na inicialização.Arquivo "/ etc / default / spamassassin": CRON=1
Ative a atualização automática de regras por padrão.Arquivo "/etc/spamassassin/local.cf": report_safe 0 use_bayes 1 bayes_auto_learn 1 bayes_auto_expire 1 bayes_store_module Mail::SpamAssassin::BayesStore::MySQL bayes_sql_dsn DBI:mysql:sa:localhost:3306 bayes_sql_username sa bayes_sql_password password
É necessário tornar o banco de dados "sa" no mysql com o usuário "sa" com a senha "password" (substitua por algo adequado).report_safe - em vez de uma carta, um relatório sobre a mensagem de spam será enviado.use_bayes são massagens de spa em configurações de aprendizado de máquina.As configurações restantes de spamassassin foram aplicadas anteriormente neste artigo.O cenário geral é spamassassin .Sobre como mover novos e-mails de spam para a pasta IMAP Spam .Sobre um monte simples de Dovecot + SpamAssassin .Recomendo a leitura da teoria de aprender spamassasin ao mover letras nas pastas do imap (e não a recomendo) .============== Contatando a comunidade ==============
Eu também gostaria de lançar uma idéia na comunidade sobre como aumentar o nível de segurança das cartas encaminhadas. Desde que eu estou tão imerso no tópico do correio.Para que o usuário possa criar um par de chaves em seu cliente (outlook, thunderbird, plugin do navegador, ...). Público e privado. Público - envie para o DNS. Privado - salve no cliente. Os servidores de email poderão usar a chave pública para enviar para um destinatário específico.E para se proteger contra spam com esses e-mails (sim, o servidor de e-mail não poderá ver o conteúdo) - será necessário introduzir três regras:- Assinatura DKIM real obrigatória, SPF obrigatório, rDNS obrigatório.
- Uma rede neural sobre o tópico de treinamento antispam + DB no lado do cliente.
- O algoritmo de criptografia deve ser tal que o lado de envio precise gastar 100 vezes mais energia na CPU do que o lado de recebimento.
Além de cartas públicas - para desenvolver uma carta-convite padrão "para começar a correspondência segura". Um dos usuários (caixa de correio) envia uma carta para a outra caixa de correio com um anexo. Na carta, a proposta de texto para iniciar um canal de comunicação seguro para correspondência e a chave pública do proprietário da caixa de correio (com a chave privada no lado do cliente).Você pode até criar um par de chaves especificamente para cada correspondência. O usuário destinatário pode aceitar esta oferta e enviar sua chave pública (também feita especificamente para essa correspondência). Em seguida, o primeiro usuário envia uma carta de controle de serviço (criptografada com a chave pública do segundo usuário) - após o recebimento da qual o segundo usuário pode considerar confiável o canal de comunicação formado. Em seguida, o segundo usuário envia uma carta de controle - e o primeiro usuário também pode considerar o canal formado como protegido.Para combater a interceptação de chaves na estrada - é necessário no protocolo prever a possibilidade de transmitir pelo menos uma chave pública usando uma unidade flash.E o mais importante, que tudo funciona (a pergunta é "quem pagará por isso?"):Introduzir certificados de correio no valor de US $ 10 por 3 anos. O que permitirá ao remetente indicar no DNS que "minhas chaves públicas estão disponíveis". E eles terão a oportunidade de iniciar uma conexão segura. Ao mesmo tempo, tome esses compostos gratuitamente.o gmail finalmente monetiza seus usuários. Por US $ 10 em 3 anos - o direito de criar canais de correspondência seguros.============== Conclusão ==============
Para testar o artigo inteiro, eu alugaria um servidor dedicado por um mês e compraria um domínio com um certificado SSL.Mas as circunstâncias da vida se desenvolveram e esse problema se arrastou por 2 meses.E quando o tempo livre voltou a aparecer - decidi publicar o artigo como está, e não arrisco o atraso da publicação por mais um ano.Se houver muitas perguntas como "mas isso não for descrito em detalhes suficientes" - provavelmente haverá força para contratar um servidor dedicado com um novo domínio e um novo certificado SSL e descrever com mais detalhes e o mais importante - identifique todos os detalhes importantes ausentes.Também gostaria de receber feedback sobre o tópico de idéias sobre certificados de correio. Se você gostou da idéia, tentarei encontrar forças para escrever um rascunho para o rfc.— .
— .
.