A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Slackware + Postfix + Domínios Virtuais

Seg

20

Mar

2006


12:34

(5 votos, média 4.60 de 5) 


Image Os tutoriais sobre o Postfix anteriores a este consideram apenas um domínio canônico e contas Unix. Acontece que a maioria dos servidores web hospeda mais de um domínio e, para cada um deles, costumam existir dezenas, centenas e até milhares de usuários. Para criar endereços de email para os domínios hospedados e seus usuários existem algumas soluções. Neste tutorial veremos como implementá-las.

Domínios e Classes de Endereços

Antes de botar a mão na massa, alguns conceitos precisam ficar bem claros. Sei que é teoria pura, mas não tem como prosseguir sem ela. A primeira coisa é fazer a distinção entre domínio canônico e domínio hospedado.

Domínio canônico é o primitivo, ou seja, está diretamente associado ao hostname e ao endereço IP da máquina onde o Postfix está instalado. Também podemos considerá-lo como domínio principal ou domínio "chefe da casa". Mantendo o exemplo dos tutoriais anteriores, o domínio canônico será mail.numaboa.com.br com o endereço IP 100.200.300.402, de acordo com o que foi definido no Bind (veja "Arquivos de registros II" no tutorial "Bind na jaula"):

;
; numaboa.com.br.domain
;
...
mail            A               100.200.300.402
                MX              5 mail
...

Domínios hospedados são todos os domínios que convivem com o domínio canônico. Não estão associados ao hostname e, como não são proprietários da casa, podem ser considerados como convidados ou "fila bóia" smile Digamos que o chefe numaboa.com.br tenha colocado à disposição de numaboa.org seu endereço IP - eles têm o nome numaboa em comum, mas são de famílias diferentes: o chefe tem sobrenome .com.br e o fila bóia tem o sobrenome .org.

Os endereços eletrônicos dos habitantes destes domínios são de classes diferentes. A família do chefe, geralmente, tem endereços da classe domínio local. Já os convidados costumam ter endereços da classe domínio de alias virtual e/ou da classe domínio de mailbox virtual.

A classe domínio local é de contas do tipo Unix cujo destino final é o Postfix. O nome do domínio (e seus aliases) é fornecido pelo parâmetro mydestination, seus endereços são dados pelo parâmetro local_recipient_maps e o transporte é especificado pelo parâmetro local_transport, todos no arquivo de configuração /etc/postfix/main.cf.

A classe domínio virtual com alias atende domínios hospedados onde cada endereço tem um alias local Unix ou um endereço remoto. Os domínios virtuais são listados no parâmetro virtual_alias_domains, todos os endereços precisam ser um alias (apelido) de algum outro endereço (local ou remoto) e não existe um parâmetro para o tipo de transporte.

A classe domínio virtual com caixa postal é o destino final para domínios hospedados onde cada endereço possui uma caixa de correio própria e os destinatários não precisam ter uma conta Unix. Os nomes dos domínios são listados no parâmetro virtual_mailbox_domains, os endereços são fornecidos pelo parâmetro virtual_mailbox_maps e o transporte é especificado através do parâmetro virtual_transport.

Soluções possíveis

De acordo com o tipo de domínio e as classes de endereços, podemos criar vários tipos de solução. As mais comuns estão listadas a seguir:

  • Domínio canônico com contas Unix
  • Domínios compartilhados com contas Unix
  • Domínios separados com contas Unix
  • Domínios separados com contas não Unix

Cada uma das soluções será vista em detalhes a seguir.

Domínio canônico + contas Unix

Se você seguiu os tutoriais anteriores a este, a solução de domínio canônico com contas Unix é a configuração do Postfix citada nos tutoriais Slackware + Postfix (formato mailbox) e Slackware + Postfix + Maildir (formato Maildir). Nesta solução, apenas os usuários do sistema podem enviar e receber emails. Já pensou um servidor de email deste tipo com milhares de usuários, onde o administrador do sistema precisa cadastrar cada um deles? Seria de endoidar :nuts:

Só para refrescar a memória, os atuais parâmetros desta configuração são (/etc/postfix/main.cf):

myhostname = mail.numaboa.com.br
mydomain = numaboa.com.br
mydestination = $myhostname, $mydomain, localhost.$mydomain, ns1.$mydomain,
  ns2.$mydomain, www.$mydomain, webmail.$mydomain, ftp.$mydomain
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
local_transport = local:$myhostname
home_mailbox = Maildir/
mail_spool_directory = /home/postfix

Domínios compartilhados + contas Unix

O exemplo mais simples de domínio canônico + domínios hospedados com contas Unix é colocar os domínios hospedados no parâmetro mydestination. São chamados de domínios compartilhados porque compartilham o mesmo destino. Considerando numaboa.org como domínio hospedado, teremos:

myhostname = mail.numaboa.com.br
mydomain = numaboa.com.br
mydestination = $myhostname, $mydomain, localhost.$mydomain, ns1.$mydomain,
  ns2.$mydomain, www.$mydomain, webmail.$mydomain, ftp.$mydomain, numaboa.org
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
local_transport = local:$myhostname
home_mailbox = Maildir/
mail_spool_directory = /home/postfix

Assim como no modelo anterior, esta solução exige que cada usuário tenha uma conta Unix, ou seja, sobra novamente para o administrador do sistema :nuts:

Existe um problema adicional neste tipo de solução. Digamos que exista um usuário local registrado como maria, que queira um endereço adicional como usuário maricota e que toda a correspondência seja entregue na mesma caixa postal. Não tem como fazer! O administrador do sistema vai precisar criar dois usuários locais que terão caixas de correio separadas. Mas a encrenca não pára por aí: o usuário maria vai receber não só os emails que tenham o endereço maria@numaboa.com.br, como também os que tenham o endereço maria@numaboa.org!

Mas nem tudo é desvantagem. Com esta solução, um administrador que tenha vários domínios sob a sua responsabilidade pode, por exemplo, criar um usuário postmaster e, independentemente do domínio que conste no endereço (postmaster@numaboa.com.br, postamaster@numaboa.org, etc), todos os emails enviados para postmaster irão para a mesma caixa postal. Sob este aspecto, isto facilita a vida do administrador. Mesmo assim não vale a pena, pois o trabalho de gerenciar o resto é um tormento.

Domínios separados + contas Unix

Para evitar os problemas de domínios compartilhados, o jeito é separar o domínio canônico dos domínios hospedados declarando os domínios hospedados como domínios virtuais. As contas Unix de usuários de domínios canônicos são encontradas pelo sistema porque estão num mapa próprio (unix:passwd.byname). Quando criamos um domínio virtual, os endereços também são virtuais e precisam ser apontados para usuários locais que tenham contas Unix. É aí que entra um mapa de aliases que fará a "tradução" de endereços para usuários.

Para declarar um domínio como virtual, existe o parâmetro virtual_alias_domains e, para declarar o mapa de aliases, há o parâmetro virtual_alias_maps. Além disso, mais duas coisas devem ser observadas: os domínios virtuais NÃO podem ser listados no parâmetro mydestination porque senão o agente de entrega fica todo embananado e os domínios virtuais NÃO podem constar no parâmetro relay_domains. Veja como fica a configuração em /etc/postfix/main.cf:

myhostname = mail.numaboa.com.br
mydomain = numaboa.com.br
mydestination = $myhostname, $mydomain, localhost.$mydomain, ns1.$mydomain,
  ns2.$mydomain, www.$mydomain, webmail.$mydomain, ftp.$mydomain (não pode ter numaboa.org)
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
local_transport = local:$myhostname
home_mailbox = Maildir/
mail_spool_directory = /home/postfix
virtual_alias_domains = numaboa.org
virtual_alias_maps = hash:/etc/postfix/mapa_virtual

Observe que os dois novos parâmetros estão no plural (domains e maps). Isto significa que podemos declarar vários domínios virtuais e vários mapas virtuais. No parâmetro virtual_alias_maps informamos que o mapa é do tipo hash, está no diretório /etc/postfix/ e se chama mapa_virtual. Se tivermos dois usuários registrados (teste e teste1), um exemplo de mapa de aliases seria:

numaboa.org            DOMÍNIO

info@numaboa.org       teste
contato@numaboa.org    teste

duvidas@numaboa.org    teste1

# Qualquer endereço não resolvido
@numaboa.org           teste1

A primeira linha diz que numaboa.org é um domínio virtual (a porção da direita, DOMÍNIO, é ignorada). Isto parece chover no molhado porque já declaramos numaboa.org como sendo um domínio virtual com alias usando o parâmetro virtual_alias_domains. Acontece que, se esta declaração não existir, as mensagens serão rejeitadas com "relay access denied" ou .

As linhas em branco ou iniciadas com # são ignoradas. Os endereços completos apontam para usuários locais e @numaboa.org é chamado de catch all (pega tudo) porque aponta para um usuário local todos os endereços que não estejam referidos. Não costumo usar o catch all porque acabo recebendo um caminhão de spams, principalmente daqueles engraçadinhos que criam endereços de A a Z para determinado domínio!

O domínio virtual possui seu próprio espaço de nomes de usuários. Isto significa que os nomes dos usuários locais não são visíveis num domínio virtual com alias. Tá complicado? É o seguinte... se enviarmos um email para teste@numaboa.org, este endereço não existe. Isto significa que o usuário local teste não é visível no domínio numaboa.org (e nem em qualquer outro domínio virtual). Se quisermos que este seja um endereço válido, ele precisaria estar declarado no mapa de aliases, ou seja, precisaríamos adicionar a linha

teste@numaboa.org       teste

Caso você tenha mais de um domínio virtual, não é preciso criar um mapa de aliases para cada um deles. Um único mapa de aliases pode declarar vários domínios virtuais e múltiplos endereços para usuários com contas Unix. A desvantagem desta solução continua sendo a criação das contas locais. Já a vantagem é que um mesmo usuário vai poder ter quantos endereços quiser (tanto no domínio canônico quanto nos domínios virtuais), com a correspondência centralizada numa única caixa postal.

Mas ainda falta uma etapa para fazer este modelo funcionar. O mapa de aliases precisa ser transformado num arquivo indexado e o Postfix precisa ser informado das mudanças. Usamos a ferramenta postmap para indexar o mapa_virtual e criar o arquivo mapa_virtual.db.

# postmap /etc/postfix/mapa_virtual
# postfix reload

Para testar esta configuração basta enviar um email para qualquer um dos usuários configurados no mapa usando o mailto ou um cliente de email. Não se esqueça que este email vai parar na caixa postal do usuário local teste ou teste1.


Domínios separados + contas não Unix

Em sistemas com vários domínios virtuais e um montão de usuários o gerenciamento de contas Unix dá um trabalho maluco. Até agora só vimos a atuação do agente de entregas local do Postfix. Mas, se é possível criar domínios virtuais, porque não acionar um agente de entregas virtual? Graças a Deus o Wietse Venema, autor do Postfix, pensou nisso e deu uma solução smile

Com o agente de entregas virtual, cada endereço pode ter sua própria caixa postal (mailbox) virtual. Ao contrário dos domínios virtuais com alias, os domínios virtuais com mailbox não precisam de traduções e os proprietários da caixa de correio virtual não precisam ter uma conta Unix.

O agente de entrega virtual controla o caminho da caixa postal, a uid (identificação do usuário) e a gid (identificação do grupo) usando tabelas específicas. E aí você pensa... xiiii, com alias só havia uma tabela para controlar, agora são três? Mas garanto que a solução é boa: uma vez que este modelo esteja funcionando com as tabelas, migrar para uma base de dados SQL são dois palitos. Aliás, este será o tema do próximo tutorial.

Bem, então vamos fazer estas tabelas funcionarem. Você se lembra que no modelo anterior usamos alguns parâmetros para informar o Postfix de que queríamos habilitar domínios virtuais com alias. Neste caso, a coisa não é muito diferente. Existem parâmetros específicos para esta solução. Veja o que é preciso adicionar ao /etc/postfix/main.cf:

virtual_mailbox_domains = numaboa.org
virtual_mailbox_base = /home/postfix
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:1020
virtual_gid_maps = static:1020
virtual_alias_domains =
   (não pode referir numaboa.org)

Com virtual_mailbox_domains = numaboa.org declaramos o domínio numaboa.org como sendo do tipo virtual com mailbox. Todo endereço criado para este domínio irá para um diretório próprio criado em /home/postfix/ e a lista de endereços se encontra no arquivo /etc/postfix/vmailbox. Primeiro algumas considerações sobre o domínio.

Se declaramos o domínio numaboa.org como sendo virtual, ele NÃO pode ser declarado junto com o domínio canônico nos parâmetros mydestination e realy_domains. Mas tem mais: se declaramos o domínio como virtual com mailbox, ele NÃO pode também ser declarado como domínio virtual com alias. Ou bem uma coisa, ou bem outra para não acionar dois agentes de entrega diferentes para realizar a mesma tarefa. Caso você opte por usar domínios virtuais com alias e com mailbox (o que você pode fazer sem problemas com domínios virtuais diferentes), tome muito cuidado para não incluir um coringa de caixa postal de um domínio virtual com mailbox (por exemplo, @numaboa.org) no arquivo de aliases.

Proprietários

Os usuários locais são os proprietários dos seus diretórios (por exemplo, o diretório /home/postfix/teste/ é de teste:users). Como os usuários virtuais não podem ser proprietários de nada, eles precisam de uma espécie de fiador. Para exercer esta função vamos criar o usuário fiador com uid 1020 e o grupo fiador com gid 1020:

# groupadd -g 1020 fiador
# useradd -d /home/postfix -g 1020 -u 1020 -s /bin/false fiador

Este será o fiador para todos os usuários sem contas locais pois foi "empossado" através dos parâmetros virtual_uid_maps = static:1020 e virtual_gid_maps = static:1020.

atencao DICA: lembre-se destas uid e gid porque ainda serão utilizadas em configurações importantes nos tutoriais que fazem parte do pacote Postfix.

No tutorial Slackware + Postfix + Maildir criamos os diretórios base para as caixas de correio, só que usamos a identidade root. Isto fez com que o proprietário destes diretórios ficassem como root:root. Verifique com:

# ls -l /home
drwxr-xr-x  6 root root 168 2006-02-26 17:32 postfix/

Mude o usuário e o grupo e confira:

# chown fiador:fiador /home/postfix
# ls -l /home
drwxr-xr-x  6 fiador fiador 168 2006-02-26 17:32 postfix/

Se não fizermos esta alteração, os arquivos de emails não podem ser salvos nos respectivos diretórios por falta de autorização.

O mapa de dados

Indicamos como fonte de dados o arquivo vmailbox. Este arquivo precisa ser criado com o seguinte formato:

maria@numaboa.org     numaboa.org/maria/
pedro@numaboa.org     numaboa.org/pedro/
teste@numaboa.org     numaboa.org/teste

Cada linha deste arquivo especifica um endereço e o diretório onde deve ser criada sua caixa postal. Observe que os diretórios dos usuários maria e pedro terminam com uma barra (/) e que o do usuário teste termina sem barra. Quando existe a barra no final, os emails serão guardados no formato Maildir (um arquivo para cada email); caso contrário, os emails serão armazenados no formato mailbox (todos os emails num único arquivo).

Observe que há um usuário local teste e um usuário virtual teste. Não há problema algum. As mensagens para teste@numaboa.com.br serão entregues na caixa postal /home/postfix/teste/Maildir/new/ e as para teste@numaboa.org serão entregues na caixa postal /home/postfix/numaboa.org/teste/new/ porque os agentes de entrega são diferentes e trabalham com parâmetros de configuração diferentes. É coisa do tipo carta registrada e Sedex - tudo acontece no correio, mas os sistemas de entrega não se misturam.

Agora só falta indexar o mapa e atualizar o Postfix, ou seja:

# postmap /etc/postfix/vmailbox
# postfix reload

Prontinho! O postmap criou o arquivo vmailbox.db e o Postfix foi avisado das alterações. Agora é cruzar os dedos e partir para os testes. Com tanta coisa, será que ficou algum erro? :bug:


Os testes

Esta última configuração, sem dúvida nenhuma, é a mais versátil e a mais fácil de gerenciar. Juntamente com a configuração do domínio canônico + usuários locais, é a que vai ficar disponível para os próximos tutoriais. Mas vamos aos testes.

Podemos usar o mailto ou um telnet na porta 25 para enviar um email para qualquer um dos usuários configurados em vmailbox. Digamos que o cliente seja o mailto e que o usuário seja maria (não esqueça de terminar o texto com Ctrl-D):

# mailto
   To: maria@numaboa.org
   Subject: Teste
   Teste virtual
EOT

Como este é o primeiro email que maria recebe, os diretórios da caixa postal devem ser criados. Como configuramos o usuário maria com o padrão Maildir, os diretórios criados devem ser:

home ---|
        |--- postfix ---
                       |--- numaboa.org ---
                                          |--- maria ---
                                                       |--- cur
                                                       |--- new
                                                       |--- tmp

O email enviado deve estar em /home/postfix/numaboa.org/maria/new/ identificado com algo parecido com 1142990362.V304I54eM695619.ns2.

# cd /home/postfix/numaboa.org/maria/new
# cat 1142990362.V304I54eM695619.ns2
Return-Path: 
X-Original-To: maria@numaboa.org
Delivered-To: maria@numaboa.org
Received: by mail.numaboa.com.br (Postfix, from userid 0)
        id A38231C690; Tue, 21 Mar 2006 22:19:22 -0300 (BRT)
MIME-Version: 1.0
To: maria@numaboa.org
Subject: Teste
Message-ID: <0_14544_1142990362_1@ns2>
Content-ID: <0_14544_1142990362_2@ns2>
Content-type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Date: Tue, 21 Mar 2006 22:19:22 -0300 (BRT)
From: root@numaboa.com.br

Teste virtual

Podemos complementar o teste enviando um email para maria, pedro ou teste usando um cliente externo. O resultado deve ser o mesmo. Caso os testes não funcionem como o esperado, não esqueça de verificar o log do Postfix e do sistema com

# tail /var/log/maillog
# tail /var/log/syslog

Leia com atenção as mensagens para tentar descobrir o tipo e a localização do erro. Vai aqui mais uma dica.

:lapis: DICA: existe mais um arquivo de configuração do Postfix que não citei até agora. É o /etc/postfix/master.cf. Edite este arquivo e aumente o nível de debug do smtp adicionando -v à linha:

smtp      inet  n       -       n       -       -       smtpd -v

Colocando o smtp em verbose (-v), até pensamento é logado! Isto deve ajudar.


Considerações finais

O servidor de emails está ficando cada vez mais parrudo (e versátil também). Mas existem ainda uma porção de brechas. Por exemplo, a única autenticação até o momento é a existência de um usuário local "aliasado" ou de um usuário virtual. Todos têm permissão (relay) para alcançar outros usuários locais e virtuais, mas não têm relay para endereços externos... por enquanto. Mas não há males sem cura. Isto pode ser feito através de uma autenticação SASL - caso o usuário interno (local ou virtual) se autentique, então recebe autorização para relay externo. Este será o tema do tutorial Slackware + Postfix + SASL, mas não vamos dar o passo maior do que a perna. Antes disso falaremos sobre como substituir a base de dados do Postfix (o que acabamos de fazer) por uma base de dados SQL :thumbup:

mfx broker отзывы о компаниикак сделать форму бровейлобановский александр харьковBroker MFXотзывы полигоннациональный антикоррупционный центр харьковцерковь возрождение

Informações adicionais