Ver Feed RSS

lpriori

MTA Selor - Projeto GPL Brasileiro

Avaliação: 2 votos, 4,50 média.
Selor é um MTA (Servidor SMTP) Open Source criado com o intuito de ser extremamente rápido, seguro e muito flexível.

Este projeto foi feito por mim, escrito em C e Assembly. Fiquem a vontade para estudar seu código e contribuir com informações, críticas e sugestões.

Ele é baseado em eventos e arquivos de regras, onde podemos testar diversas condições e tomar inúmeras ações como:

- Fazer um log personalizado
- Executar um programa externo
- Criar regras no Firewall do Servidor automaticamente e se proteger contra ataques
- Alterar o link de saída para determinado email
- Fechar a conexão, recusando a mensagem
- Rodar testes de SPF e RBL ( Blacklists )
- Forçar um MX de destino para um ou mais destinatários do email
- Alterar opções internas do servidor em tempo de execução
etc...

Vou demonstrar abaixo com o criar um servidor de emails completo: SMTP, POP3, IMAP, Base de emails com MySQL, Webmail, Filtros básicos Anti-Spam e Quota de envio para clientes não abusarem.



Programas usados:
MTA Selor 1.1 (SMTP)
Dovecot 2.2.12 (POP3/IMAP)
RoundCube (Webmail)
Linux Slackware 13.37 64bits (Full)

Downloads dos programas:

Código :
mkdir /home/progs
cd /home/progs
wget http://www.mtaselor.com.br/downloads/selor/selor_src_1.1.tar.bz2
wget http://www.mtaselor.com.br/downloads/modulos/selor_mysql_src_1.0.tar.bz2
wget http://www.mtaselor.com.br/downloads/utilitarios/selor_rquota_src_1.0.tar.bz2
wget http://dovecot.org/releases/2.2/dovecot-2.2.12.tar.gz
wget http://ufpr.dl.sourceforge.net/project/roundcubemail/roundcubemail/1.0.0/roundcubemail-1.0.0.tar.gz

Instalando o MTA Selor

Para compilá-lo, você precisará do GCC (Compilador C), do NASM (montador Assembly) e opcionalmente da libcap-devel(apenas para GNU/Linux e para quem pretende um dia usar a ação "So_mark!" do Selor que permite marcar pacotes TCP de saída e ter controle usando "traffic shaping" e "IP route").

Código :
cd /home/progs
tar xjf selor_src_1.1.tar.bz2
cd selor_src_1.1
make linux

Obs.: se ele reclamar da libcap. Você tem duas opções:

1. Procurar e instalar a libcap/libcap-devel.
2. Compilá-lo sem suporte a função "So_mark": use o comando 'make linux_nocap' para isto.

Obs: Se o seu Linux for 64bits e você não estiver afim de compilar o Selor, puxe o seu código binário por este link: http://www.mtaselor.com.br/downloads...64bits.tar.bz2

Código :
make linux_install
groupadd -g 105 selor
useradd -g selor -u 105 selor
chown -R selor. /var/spool/selor
chown -R selor. /var/log/selor

Edite o arquivo de selor.conf para configurarmos o módulo mysql e outras opções

Código :
cd /usr/local/selor
pico selor.conf

1- Procure e altere a opção Server_name para o nome do IP REVERSO do seu IP de Internet
2- Procure e altere a opção Module para:
Código :
Module "/usr/local/selor/mod/selor_mysql.so /usr/local/selor/mod/selor_mysql.conf"
3- Procure e altere a opção Dlocal para:
Código :
Dlocal "/usr/local/libexec/dovecot/deliver -d %l <"

Salve e saia do arquivo. Compile o módulo MySQL do Selor:

Código :
cd /home/progs/
tar xjf selor_mysql_src_1.0.tar.bz2
cd selor_mysql_1.0

Como o meu Linux é 64 bits, eu o compilo desta forma:

Código :
gcc -shared -nostartfiles selor_mysql.c -o selor_mysql.so -DA64 -lcrypt -lmysqlclient -Wall -fPIC

Se você ver o conteúdo do arquivo comp.sh que vem com o selor_mysql, vai ver os exemplos de compilação para cada caso: (Linux32, Linux64, FreeBSD32 e FreeBSD64)

Obs: Se você tiver problemas para compilar este módulo, é porque você não tem as libs Mysql, o MySQL-devel ou então o compilador não esta encontrando elas em /usr/lib64 ou /usr/lib64/mysql/. As libs são:
libmysqlclient*
Você pode adicionar o /usr/lib64/mysql/ dentro do /etc/ld.so.conf e recarregar esta lista apenas executando o ldconfig


Código :
cp selor_mysql.so selor_mysql.conf /usr/local/selor/mod

Entre no MySQL para criar a base de emails:

Código :
mysql
mysql> CREATE DATABASE mail;
mysql> grant all privileges on mail.* to selor@localhost identified by 'minhasenha';
mysql> flush privileges;
mysql> quit

Crie as tabelas do banco com base no arquivo selor_mysql.sql que vem junto do pacote selor_mysql e prepare o diretório do usuário de testes:

Código :
mysql mail < selor_mysql.sql
mkdir -p /home/mail/dominio.com.br/lucas/Maildir/new
mkdir -p /home/mail/dominio.com.br/lucas/Maildir/cur
mkdir -p /home/mail/dominio.com.br/lucas/Maildir/tmp
chmod -R 755 /home/mail/dominio.com.br
chown -R selor. /home/mail/dominio.com.br

Volte no MySQL e insira um domínio e usuário de testes:

Código :
mysql
mysql> use mail;
mysql> INSERT INTO domain VALUES ('dominio.com.br');
mysql> INSERT INTO users (mail,home,pass,maildir,date_add,time_add,domain,name)
 VALUES ('[email protected]','/home/mail/dominio.com.br/lucas/',
 encrypt('senha123','$1$9Fg5N/bT'),'Maildir','2014-05-13','22:38:00','dominio.com.br','Lucas');
 
mysql> quit;

Configure o módulo selor_mysql com o usuário e senha que você usou na linha: ‘grant all privileges...’ (No caso do meu exemplo acima, o usuário é ‘selor’ e a senha ‘minhasenha’)

Código :
pico /usr/local/selor/mod/selor_mysql.conf

Salve e saia do arquivo.

Você pode testar o módulo para ver se ele esta conectando-se corretamente no banco de dados usando a ferramenta selor_mod_test:

Código :
cd /usr/local/selor
./selor_mod_test /usr/local/selor/mod/selor_mysql.so /usr/local/selor/mod/selor_mysql.conf

Digite os seguintes comandos para testar o módulo:

local dominio.com.br
auth [email protected] senha123
quit

Já podemos ligar o servidor SMTP e testa-lo com o telnet:

Código :
/etc/rc.d/rc.selor start
 
telnet localhost 25

Segue abaixo o que você vai ver, e digite 'quit' para sair

220 localhost() MTA Selor 1.1
quit

Servidor SMTP pronto.


Vamos para o Servidor POP3/IMAP Dovecot:

Código :
cd /home/progs
tar xzf dovecot-2.2.12.tar.gz
cd dovecot-2.2.12
./configure --with-mysql
make
make install
useradd dovenull
cd /usr/local/etc/dovecot

Crie o arquivo dovecot.conf com o seguinte conteúdo:

Código :
protocols = imap pop3
listen = *, ::
 
base_dir = /var/run/dovecot/
instance_name = dovecot
login_greeting = POP3/IMAP Server
shutdown_clients = yes
maildir_copy_with_hardlinks = yes
 
#--- AUTH
disable_plaintext_auth = no
auth_cache_size = 2048
auth_cache_ttl = 1 hour
auth_cache_negative_ttl = 0
auth_realms =
auth_default_realm =
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
auth_worker_max_count = 30
auth_mechanisms = plain
 
#   %u - username
#   %n - user part in user@domain, same as %u if there's no domain
#   %d - domain part in user@domain, empty if there's no domain
#   %h - home directory
mail_location = maildir:~
 
mail_uid = selor
mail_gid = selor
 
first_valid_uid = 105
last_valid_uid = 105
first_valid_gid = 105
last_valid_gid = 105
 
#------
default_process_limit = 100
default_client_limit = 1000
default_vsz_limit = 256M
 
mail_fsync = never
 
#-----
service imap-login {
 service_count = 1
 inet_listener imap {
   port = 143
 }
}
service pop3-login {
 service_count = 1
 inet_listener pop3 {
   port = 110
 }
}
service auth {
 unix_listener auth-userdb {
  user = selor
 }
}
#----------
ssl = no
 
#----------
protocol lda {
 postmaster_address = [email protected]
 hostname = srv1.dominio.com.br
 sendmail_path = /usr/local/selor/selor_mail
 mail_plugins = quota
 lda_mailbox_autocreate = yes
}
protocol imap {
 mail_plugins = quota imap_quota
}
protocol pop3 {
 mail_plugins = quota
}
passdb {
  driver = sql
  args = /usr/local/etc/dovecot/dovecot-sql.conf
}
userdb {
  driver = sql
  args = /usr/local/etc/dovecot/dovecot-sql.conf
}

OBS: Não se esqueça de trocar as opções postmaster e hostname, colocando corretamente o nome do seu servidor.

Crie agora o arquivo dovecot-sql.conf com o seguinte conteúdo:

Código :
driver = mysql
connect = host=localhost dbname=mail user=selor password=minhasenha
default_pass_scheme = CRYPT
password_query = SELECT mail as name, domain, pass as password FROM users WHERE mail = '%u'
user_query = SELECT concat(home,'/',maildir) AS home, uid, gid,concat('maildir') AS quota FROM users WHERE mail = '%u'

OBS: Lembre-se de colocar o usuário e a senha que você usou durante a configuração da base de dados, com o comando: ‘grant all privileges...’

Crie o script de inicialização do Dovecot ( /etc/rc.d/rc.dovecot ) com o seguinte conteúdo:

Código :
#!/bin/sh
#############################################
# Script de controle do servidor Dovecot
# ./rc.dovecot start -> Ligar servidor
# ./rc.dovecot stop -> Parar servidor
# ./rc.dovecot restart -> Reiniciar servidor
#
#
#
ligar_dovecot() {
 echo "INICIANDO Dovecot..."
 /usr/local/sbin/dovecot
}
# Stop dovecot:
parar_dovecot() {
 echo "Parando Dovecot..."
 killall dovecot
}
case "$1" in
'start')
 ligar_dovecot
;;
'stop')
 parar_dovecot
;;
'restart')
 parar_dovecot
 sleep 1
 ligar_dovecot
;;
*)
echo "Os parametros aceitaveis sao: $0 start|stop|restart"
esac
#------- Fim do SCRIPT ---------

De permissão de execução para o script e ligue o Dovecot:

Código :
chmod 555 /etc/rc.d/rc.dovecot
/etc/rc.d/rc.dovecot start

Teste o servidor POP3 com o telnet:

Código :
telnet localhost 110

Segue abaixo o que você vai ver (OBS: É claro, coloque o email e senha que você criou no INSERT do MySQL lá em cima):

+OK POP3/IMAP Server

user [email protected]
+OK

pass senha123
+OK

list
+OK 0 messages:
.

quit

Servidor POP3/IMAP pronto.

Vamos ao Webmail RoundCube

O seu Apache precisa estar funcionando.
Copie os arquivos do RoundCube para o DocumentRoot do seu site/servidor ( No caso do meu, fica em /var/www/htdocs/. Procure pela opção DocumentRoot do seu Apache em /etc/httpd/conf/httpd.conf)

Código :
cd /home/progs
cp roundcubemail-1.0.0.tar.gz /var/www/htdocs
cd /var/www/htdocs
tar xzf roundcubemail-1.0.0.tar.gz
mv roundcubemail-1.0.0 webmail
cd webmail
chmod 777 temp logs

Crie uma base de dados para o RoundCube:

Código :
mysql
mysql> create database roundcubemail;
mysql> grant all privileges on roundcubemail.* to roundcube@localhost identified by 'minhasenha';
mysql> flush privileges;
mysql> quit

Agora, usando um navegador, acesse o ‘installer’ do RoundCube.
Exemplo de endereço (http://meuservidor/webmail/installer)

A primeira tela é apenas uma checagem geral do seu sistema. Clique em ‘Next’

Na próxima tela, você pode preencher/alterar algumas informações.

Veja abaixo o que eu alterei nas seções:

(General configuration) -> Não alterei nada.

(Logging & Debugging) -> Desativei ‘Log errors’

(Database setup) -> Defini os dados da base do roundcube que nós criamos

(IMAP Settings) -> Não alterei nada.

(SMTP Settings) -> smtp_server = 127.0.0.1

(Display settings & user prefs) -> language = pt_BR

Clique agora em ‘CREATE CONFIG’

Ele vai te mostrar o conteúdo do arquivo de configuração ‘config.inc.php’ .
Copie todo o texto do arquivo e salve no arquivo: /var/www/htdocs/webmail/config/config.inc.php

Depois de salvar o conteúdo da configuração no arquivo, Clique no botão ‘CONTINUE’

Na próxima tela, clique em ‘Initialize Database’ para criar suas tabelas de controle

Feito. Agora, remova o diretório ‘install’ do RoundCube

Código :
rm -rf install

Agora você já pode acessar o seu Webmail. Exemplo: http://meuservidor/webmail/



Filtros ANTI-SPAM

O seu servidor de emails já esta pronto, mas, nós podemos colocar algumas regras básicas para cortar Lixo Eletrônico:
Vá até o diretório do Selor para acrescentarmos algumas regras:

Código :
cd /usr/local/selor


BLACKLIST mundial e SPF

Crie o arquivo referente ao evento Event.from ( /usr/local/selor/rules_from ) e coloque o seguinte conteúdo:

Código :
Auth? Stop!
Ip? "127.0.0.1" Stop!
Ip? "192.168.0.0/24" Stop!
 
# -- Fazendo teste de SPF --
Spf_test!
Spf_resp? "3" Reply! "550 Recusado por nao passar no SPF" Deny!
Spf_resp? "4" Reply! "550 Recusado por nao passar no SPF" Deny!
 
# -- Checando por BLACKLIST mundial --
Rbl_test! "b.barracudacentral.org zen.spamhaus.org"
Itest? "%R>0" Reply! "550 Voce esta listado em %R Blacklists. Resp: %T" Deny!


Explicação:

As primeiras regras, que contém o “Stop!”, impedem que o Selor rode o teste de SPF e Blacklist para conexões autenticadas, do localhost, da sua rede local ou de seus servidores.
É claro que você pode e DEVE acrescentar mais regras dessas especificando todas as suas redes locais e de seus servidores Internos ou de confiança.
Spf_test! à Realiza o teste de SPF no domínio do remetente que foi passado pelo host conectado.

Spf_rest? à Checa o resultado do teste SPF.
São possíveis os seguintes valores:

0 = None (Não tem SPF)
1 = Pass (Liberado)
2 = Neutral (Neutro)
3 = SoftFail (Este IP Não deveria estar usando este dominio.)
4 = Fail (IP NÃO autorizado. Voce DEVE recursar este email)
5 = TempError
6 = PermError

Rbl_test! à Realiza o teste nas blacklists passadas no parâmetro e armazena o número de blacklists no qual o IP foi encontrado na variável %R, para ser testado na regra de baixo, que começa com ‘Itest? ...’

Feito !! Não é preciso reiniciar o Selor quando se mexe nesses arquivos de eventos. A regra já esta valendo

Testes no Helo/Ehlo
Primeiro você precisa ter em mente qual é o IP do seu servidor na Internet. No exemplo abaixo, vou supor que o IP do meu servidor seja: 240.240.240.240 e seu nome seja srv1.meuservidordemails.com

Abra o arquivo referente ao evento Event.connection ( /usr/local/selor/rules_connection ) e coloque o seguinte conteúdo no FINAL do arquivo:

Código :
!Ip? "240.240.240.240" !Ip? "127.0.0.1" Find_str? "%h:127.0.0.1" Deny!
!Ip? "240.240.240.240" !Ip? "127.0.0.1" Find_str? "%h:srv1.meuservidordemails.com" Deny!

Limitar emails nulos

A regra é: Remetente nulo não pode enviar um email para mais de um destinatário.

Crie o arquivo referente ao evento Event.rcpt ( /usr/local/selor/rules_rcpt ) e coloque o seguinte conteúdo:

Código :
From? "" Itest? "%n>1" Reply! "550 Muitos destinatarios para um remetente anonimo" Deny!

Quota de envio de emails

Código :
cd /home/progs
tar xjf selor_rquota_src_1.0.tar.bz2
cd selor_rquota_1.0
gcc selor_rquota.c -o selor_rquota -lmysqlclient

Copie o programa, o arquivo de configuração e o arquivo .sql para o diretório do Selor:

Código :
mkdir /usr/local/selor/uteis
cp selor_rquota selor_rquota.conf selor_rquota.sql /usr/local/selor/uteis
cd /usr/local/selor/uteis

Crie a base de dados no seu MySQL com um usuário e uma senha.
Vamos supor que o usuário seja 'selor_user' e a senha 'minhasenha':

Código :
mysql
mysql> create database selor_rquota;
mysql> grant all privileges on selor_rquota.* to selor@localhost identified by 'minhasenha';
mysql> flush privileges;
mysql> quit

Agora, vamos criar as tabelas no banco:

Código :
mysql selor_rquota < selor_rquota.sql

Arrume o arquivo de configuração selor_rquota.conf de forma a colocar corretamente os dados para a conexão com o MySQL:
Abra o arquivo referente ao evento Event.from ( /usr/local/selor/rules_from ) e acrescente o seguinte conteúdo no COMEÇO do arquivo:

Código :
Auth? !From? "" Exec! "/usr/local/selor/uteis/selor_rquota --conf /usr/local/selor/uteis/selor_rquota.conf -c -u %f" 
Exec_resp? "1" Reply! "500 Limite de envio de emails foi excedido" Deny!

Abra o arquivo referente ao evento Event.data ( /usr/local/selor/rules_data ) e acrescente o seguinte conteúdo no arquivo:

Código :
Auth? !From? "" Exec! "/usr/local/selor/uteis/selor_rquota --conf /usr/local/selor/uteis/selor_rquota.conf -a %n -u %f -d 1000"

O valor 1000 é a quota padrão que o programa vai usar para cadastrar o remetente caso ele ainda não esteja cadastrado.
Agora é hora de você decidir como quer a sua quota: por hora, dia, semana ou mês:
Tudo depende do intervalo em que você roda o selor_rquota com a opção -z que ZERA os valores de emails enviados de todos.

Podemos usar o CRON para fazer o serviço para nós:
Caso queria...

por hora:
00 * * * * /usr/local/selor/uteis/selor_rquota -z

por dia:
00 0 * * * /usr/local/selor/uteis/selor_rquota -z

por semana:
00 0 * * 0 /usr/local/selor/uteis/selor_rquota -z

por mês:
00 0 1 * * /usr/local/selor/uteis/selor_rquota -z

Servidor de emails pronto!
Podem postar sua dúvidas e sugestões.

Boa parte dos recursos que ele tem hoje foram criados devido a sugestões.

Qualquer tipo de ajuda é bem vinda. Informações, Dúvidas, Dicas !

Obrigado à equipe do Under-Linux.
Categorias
Não Categorizado

Comentários

  1. Avatar de MarcusMaciel
    muito bom parabéns pela iniciativa.

+ Enviar Comentário