MTA Selor - Projeto GPL Brasileiro
por
em 13-05-2014 às 22:46 (3071 Visualizações)
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:
3- Procure e altere a opção Dlocal para:Código :Module "/usr/local/selor/mod/selor_mysql.so /usr/local/selor/mod/selor_mysql.conf"
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.
Comentários
+ Enviar Comentário