\chapter{Servidores de Correo Electrónico}

Un E-mail (Correo Electrónico es un sistema de composición, envio y recepción de mensajes sobre sistemas de comunicación electrónica.
El Correo Electrónico comenzo en 1965 como una forma de enviar mensajes entre maquinas de un mismo sistema, pero no fue hasta la aprición de ARPANET cuando se hizo realmente popular.

En 1980 el IETF desarrollo el procolo SMTP (Simple Mail Transfer Protocol) que se ha convertido en el protocolo dominante para el envio de correo.

\section{Funcionamiento del Correo Electrónico}

Tenemos dos usuarios A y B, con sus dos maquinas HA y HB, dos servidores de correo a.org y b.org con cuentas de correo a@a.org y b@b.org.


\begin{enumerate}
\item A compone un nuevo mensaje en su MUA (Mail User Agent / Agente de Correo Electrónico) e indica en el mensaje en un campo denominado TO: la dirección de correo electrónico de B que sera b@b.org.\\
Al enviar el mensaje, el MUA lo formateara y lo enviara al servidor MTA (Mail Transfer Agent / Agente de Envio de Correo Electrónico) de A a traves de SMTP (smtp.a.org), este servidor estará configurado en el MUA de A.
\item La dirección de B es b@b.org, que está formada por dos partes, una antes de la "@" que es el nombre de usuario y otra despues que es el servidor de correo del usuario, por lo tanto el servidor SMTP de A(smtp.a.org) buscara a traves de los DNS el campo MX (Mail Exchange / Intercambiador de Correo Electrónico).
\item El servidor DNS le devolvera la dirección MX de b.org (en nuestro ejemplo sera mx.b.org).
\item El servidor smtp.a.org enviara el mensaje mx.b.org usando SMTP y mx.b.org lo guardara en la carpeta del usuario.
\item El usuario B quiere ver su correo y tendra dos formas de verlo:
\begin{enumerate}
\item Descargarlo, el usuario B utiliza un MUA que se descarga el correo en su maquina y utilizara el protocolo POP3 para ello.
\item Acceder sin descargarlo, el usuario B accede a su correo y lo lee, pero no los descarga en su maquina, usara entonces el protocolo IMAP4 para ello.
\end{enumerate}
\end{enumerate}

\section{SMTP Servers}

SMTP (Simple Mail Transfer Protocol / Protocolo simple de transferencia de correo electrónico) es el protocolo estandar de envío de correo electrónico a través de Internet.\\
SMTP usa el para las comunicaciones el puerto TCP 25.\\
Para encontar el servidor SMTP de un dominio se hace una buscada dns del campo MX de ese dominio.\\
RFC relacionados con SMTP: RFC 2821 \cite{2821}, RFC 2822 \cite{2822}, RFC 1869 \cite{1869}, RFC 1891 \cite{1891}, RFC 2554 \cite{2554}


\subsection{El problema del SPAM}
El SPAM (Recepción de mensajes no solicitados) es el gran problema del correo electrónico, mas del 50 por ciento del correo es correo basura. Para ello se están desarrollando técnicas como smtp-auth y el uso de paquetes especializados en la detección de estes  \ref{spam}.

\subsection{SMTP-AUTH}

Es una extensión al protocolo SMTP para que estos soporten autentificación, de esta manera el usuario que quiere enviar correo debe tener un usuario y contraseña en el servidor, asi queda registrado y se comprueba su identidad.

La idea original es que los servidores SMTP no estén en open-relay (Abiertos al publico) de tal manera que solo se puedan enviar correo desde redes controladas y que cada usuario sea identificado, así los servidores con smtp-auth no pueden ser utilizados por sistemas externos para el envio de SPAM.

\subsection{Comandos SMTP Básicos}

\begin{itemize}
\item[HELO] Identifica el servidor SMTP que envia al que recibe.
\item[MAIL] Comienza una transferencia de Correo Electrónico a uno o mas recipientes.\\ Indica quien envía el mensaje.
\item[RCPT] Identifica al usuario que va ha recibir el Correo Electrónico.
\item[DATA] La siguientes lineas serán el contenido del correo electrónico.
\item[SEND] Envia el correo electrónico a una o mas estacones.
\item[RSET] Termina una transferencia.
\item[VRFY] Pregunta al SMTP receptor si el usuario ha sido identificado.
\item[EXPN] Pregunta al receptor si la lista de correo ha sido identificada.
\item[QUIT] Cierra la conexión.
\end{itemize}

\subsection{Codigos de Error SMTP mas usuales}

Codigos de Error:
\begin{itemize}
\item[421] Service not available. Esto ocurre normalmente cuando el servidor remoto está caido.
\item[450] Mailbox unavailable. Suele ocurrir cuando no se tiene acceso a la carpeta de correo del recipiente o esta esta bloqueada por otra aplicación.
\item[451] Requested action aborted. Ocurre cuando existe un problema en la ejecución del SMTP.
\item[452] Requested action not taken. Tambien ocurre cuando hay problemas con la carpeta de correo del recipiento o está llena.
\item[500] Syntax error, command unrecognized. El servidor SMTP no soporta este comando.
\item[501] Syntax error in parameters. Soporta el comando, pero los argumentos no son correctos.
\item[502] Command not implemented. Un caso parecido a 500.
\item[503] Bad sequence of commands. La secuencias de comando no es correcta.
\item[550] mailbox unavailable. Como 450.
\item[554] Transaction failed. La transferencia no ha sido valida.
\end{itemize}

Codigo de Estado:
\begin{itemize}
\item[211] System status. Estado del sistema.
\item[214] Help message. Ayuda del sistema.
\item[220] Service ready. El servidor esta preparado para aceptar correo.
\item[221] Service closing transmission channel. El servidor cierra la conexión.
\item[250] Requested mail action okay. El comando pedido al servidor, se ha ejecutado correctamente.
\item[354] Start mail input; end with . . Indica que se puede enviar el contenido del mensaje, este debe terminar en un linea que contenga solo un ".".
\end{itemize}


\section{Postfix}

Postfix en un servidor SMTP opensource desarrollado originalmente por Wietse Venema en los laboratorios de IBM.\\
Es el recomendado para su uso con GOsa, entre otras cosas por sus caracteristicas tecnicas en el acceso ldap.

\subsection{Instalación}

Postfix se puede descargar de \hlink{http://www.postfix.org/download.html}, existe abundante documentación tanto en su página web en \hlink{http://www.postfix.org/documentation.html}, como en el wiki: \hlink{http://postfixwiki.org/index.php?title=Main\_Page}.

Postfix soporta una gran cantidad de extensiones, con las cuales gestionar los usuarios y los dominios. Existe incluso un howto que le permite usar qmail.schema para convertir sistemas basados en qmail-ldap a postfix y viceversa en  \hlink{http://gentoo-wiki.com/HOWTO\_Postfix-LDAP\_virtual\_users\_with\_qmail\_schema}.

En este manual nos concentraremos en su extensión ldap, para ello necesitaremos tener instalado el servidor ldap \ref{down_ldap}, openSSL \ref{down_ssl} y SaSL \ref{down_sasl}. Descargamos y descomprimimos postfix-2.2.X.tgz en /usr/src, y ejecutamos:

\bbox
\verb|# make makefiles CCARGS="-DMAX_DYNAMIC_MAPS -DHAS_PCRE -DHAS_LDAP -DHAS_SSL \ |\\
\verb|       -I/usr/include/openssl -DUSE_SASL_AUTH -I/usr/include/sasl -DUSE_TLS" |\\
\verb|# make install|\\
\ebox

En la instalación de ejemplo no se ha ejecutado make install y se han seguido las directrices del paquete debian, estas son:

\bbox
\verb|# install lib/*.1 /usr/lib|\\
\verb|# for i in /usr/lib/*.1; do ln -sf ${i##*/} ${i%.*.*}; done|\\
\verb|# install lib/dict_ldap.so /usr/lib/postfix|\\
\verb|# install lib/dict_pcre.so /usr/lib/postfix|\\
\verb|# install lib/dict_tcp.so /usr/lib/postfix|\\
\verb|# install libexec/[a-z]* /usr/lib/postfix|\\
\verb|# install bin/[a-z]* /usr/sbin|\\
\verb|# install auxiliary/qshape/qshape.pl /usr/sbin/qshape|\\
\verb|# install -m 0444 HISTORY /usr/share/doc/postfix/changelog|\\
\verb|# ln -s ../sbin/rmail /usr/bin/rmail|\\
\verb|# ln -s ../sbin/sendmail /usr/bin/newaliases|\\
\verb|# ln -s ../sbin/sendmail /usr/bin/mailq|\\
\verb|# ln -s ../sbin/sendmail /usr/lib/sendmail|\\
\verb|# install -m 0755 conf/postfix-script conf/post-install /etc/postfix|\\
\verb|# install -m 0644 conf/postfix-files /etc/postfix|\\
\verb|# install -m 0644 conf/main.cf /usr/share/postfix/main.cf.dist|\\
\verb|# install -m 0644 conf/master.cf /usr/share/postfix/master.cf.dist|\\
\verb|# install man/man1/*.1 /usr/share/man/man1|\\
\verb|# install man/man5/*.5 /usr/share/man/man5|\\
\verb|# for f in man/man8/*.8; do \|\\
\verb|  install ${f} /usr/share/${f}postfix; \|\\
\verb|done|\\
\verb|# install rmail/rmail.8 /usr/share/man/man8|\\
\verb|# gzip -9 /usr/share/man/man8/*.8postfix|\\
\verb|# ln -sf bounce.8postfix.gz /usr/share/man/man8/trace.8postfix.gz|\\
\verb|# ln -sf bounce.8postfix.gz /usr/share/man/man8/defer.8postfix.gz|\\
\ebox

\subsection{Configuración}

Antes de poder utilizar postfix debemos configurarlo, su configuración está guardada en /etc/postfix, y los puntos importantes de esta son:

\subsubsection{main.cf}

Es la configuración principal de postfix y se indican numerosos parametros de funcionamiento (Gracias a Cajus Pollmeier por la configuración):

\cbbox
\verb|# Configuración principal de POSTFIX|\\
\\
\verb|# Configuración específica para debian|\\
\verb|command_directory = /usr/sbin|\\
\verb|daemon_directory = /usr/libexec/postfix|\\
\verb|program_directory = /usr/libexec/postfix|\\
\verb|# Que muestra el servidor en un HELO|\\
\verb|smtpd_banner = $myhostname ESMTP $mail_name|\\
\verb|setgid_group = postdrop|\\
\verb|biff = no|\\
\verb|append_dot_mydomain = no|\\
\\
\verb|# Seguridad|\\
\verb|disable_vrfy_command = yes|\\
\verb|smtpd_sasl_auth_enable = yes|\\
\verb|smtpd_sasl_local_domain = $myhostname|\\
\verb|smtpd_tls_auth_only = no|\\
\verb|#smtpd_sasl_security_options = noplaintext|\\
\verb|smtpd_use_tls = yes|\\
\verb|smtpd_tls_cert_file = /etc/postfix/cert.pem|\\
\verb|smtpd_tls_key_file = /etc/postfix/key.pem|\\
\verb|smtpd_tls_CAfile = /etc/postfix/CAcert.pem|\\
\\
\verb|# Fix Microsoft mail clients|\\
\verb|broken_sasl_auth_clients = yes|\\
\\
\verb|# Cuotas por defecto|\\
\verb|mail_size_limit = 10240000|\\
\verb|message_size_limit = 10240000|\\
\verb|header_size_limit = 10240|\\
\verb|bounce_size_limit = 500000|\\
\\
\verb|# Colas por defecto|\\
\verb|virtualsource_server_host = 10.3.66.11|\\
\verb|virtualsource_search_base = dc=gonicus,dc=de|\\
\verb#virtualsource_query_filter = (&(|(mail=%s)(gosaMailAlternateAddress=%s))(objectClass=gosaAccount))#\\
\verb|virtualsource_result_attribute = uid,gosaMailForwardingAddress|\\
\\
\verb|# Carpetas compartidas|\\
\verb|sharedsource_server_host = 10.3.66.11|\\
\verb|sharedsource_search_base = dc=gonicus,dc=de|\\
\verb#sharedsource_query_filter = (&(|(mail=%s)(gosaMailAlternateAddress=%s))(objectClass=posixGroup))#\\
\verb|sharedsource_result_attribute = gosaSharedFolderTarget,gosaMailForwardingAddress|\\
\\
\verb|# Access Lists for Non Local Delivery|\\
\verb|acllocal_server_host = 10.3.66.11|\\
\verb|acllocal_search_base = dc=gonicus,dc=de|\\
\verb#acllocal_query_filter = (&(|(mail=%s)(gosaMailAlternateAddress=%s))(gosaMailDeliveryMode=*L*))#\\
\verb|acllocal_result_attribute = mail|\\
\verb|acllocal_result_filter = insiders_only|\\
\\
\verb|# Origen|\\
\verb|myorigin = $mydomain|\\
\\
\verb|# destinos|\\
\verb|mydestination = $myhostname localhost.localdomain localhost.$mydomain /etc/postfix/locals|\\
\\
\verb|# redes locales|\\
\verb|mynetworks = 127.0.0.0/8 10.0.0.0/8|\\
\\
\verb|# Nombre de host|\\
\verb|myhostname = mail.gonicus.local|\\
\\
\verb|# Dominio|\\
\verb|mydomain = gonicus.de|\\
\\
\verb|# Interfaces que escuchan|\\
\verb|inet_interfaces = all|\\
\\
\verb|# Protección contra SPAM, reglas regex basicas|\\
\verb|#header_checks = regexp:/etc/postfix/header_checks|\\
\verb|# Bsp.: /etc/postfix/header_checks|\\
\verb|#  /^to: *friend@public\.com$/ REJECT|\\
\verb|#  /^to: *friend@public\.com$/ IGNORE|\\
\verb|#  /^to: *friend@public\.com$/ WARN|\\
\\
\verb|# Restricciones SMTP|\\
\verb|#smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl|\\
\verb|#smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, reject_maps_rbl|\\
\verb|smtpd_client_restrictions = permit_mynetworks|\\
\\
\verb|# Para el envio SMTP|\\
\verb|#smtpd_sender_restrictions = hash:/etc/postfix/access, check_sender_access hash:|\\
\verb|#smtpd_sender_restrictions = reject_unknown_sender_domain, reject_non_fqdn_sender|\\
\verb|smtpd_sender_restrictions = regexp:/etc/postfix/protected, check_sender_access hash:/etc/postfix/badmailfrom|\\
\\
\verb|# Para los recipientes|\\
\verb|#smtpd_recipient_restrictions = permit_sasl_authenticated, reject_non_fqdn_recipient, check_client_access hash:/var/lib/pop|\\
\verb|smtpd_recipient_restrictions = regexp:/etc/postfix/protected,|\\
\verb|   permit_mynetworks,|\\
\verb|   permit_sasl_authenticated,|\\
\verb|   check_relay_domains|\\
\\
\verb|# Restricciones la comando HELO|\\
\verb|smtpd_helo_required = no|\\
\verb|#smtpd_helo_restrictions = permit_mynetworks, reject_unknown_hostname, reject_invalid_hostname|\\
\verb|smtpd_helo_restrictions = permit_mynetworks|\\
\\
\verb|# |\\
\verb|smtpd_delay_reject = yes|\\
\verb|strict_rfc821_envelopes = yes|\\
\\
\verb|# Mapas antispam|\\
\verb|#maps_rbl_domains = hash:/etc/postfix/rbl|\\
\verb|maps_rbl_domains = blackholes.mail-abuse.org|\\
\\
\verb|# Sobre los usuarios y autentificación|\\
\verb|smtpd_sasl_auth_enable = yes|\\
\\
\verb|smtpd_restriction_classes = insiders_only|\\
\verb|insiders_only = check_sender_access regexp:/etc/postfix/insiders, reject|\\
\\
\verb|# relay|\\
\verb|relay_domains = $mydestination|\\
\\
\verb|# transportes|\\
\verb|fallback_transport = smtp|\\
\verb|mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp|\\
\\
\verb|# Control de rendimiento|\\
\\
\verb|#local_destination_concurrency_limit = 2|\\
\verb|#default_destination_concurrency_limit = 10|\\
\verb|#uucp_destination_recipient_limit = 100|\\
\verb|#smtp_destination_recipient_limit = 100|\\
\\
\verb|# Manipulación de direcciones|\\
\verb|#rewrite gonicus.de!horst to horst@gonicus.de|\\
\verb|#rewrite horst%gonicus.de to horst@gonicus.de|\\
\verb|#rewrite horst to horst@gonicus.de|\\
\\
\verb|# Mapas canonicos|\\
\verb|#canonical_maps = hash:/etc/postfix/canonical|\\
\verb|#sender_canonical_maps = hash:/etc/postfix/sender_canonical|\\
\verb|#recipient_canonical_maps = hash:/etc/postfix/recipient_canonical|\\
\\
\verb|# Mascarada|\\
\verb|#masquerade_domains = $mydomain|\\
\verb|#masquerade_exceptions = root|\\
\verb|#masquerade_clases = envelope_sender, envelope_recipient, header-sender, header_recipient|\\
\\
\verb|# Direcciones Virtuales|\\
\verb|virtual_maps = ldap:virtualsource, ldap:sharedsource|\\
\\
\verb|# Mapas de Transportes|\\
\verb|#default_transport = smtp-relay|\\
\verb|#transport_maps = hash:/etc/postfix/transports|\\
\\
\verb|# Aliases|\\
\verb|alias_maps = hash:/etc/aliases|\\
\\
\verb|# Antivirus a traves de amavis|\\
\verb|#content_filter = vscan:|\\
\verb|#soft_bounce = yes|\\
\\
\ebox

\subsubsection{master.cf}
\subsubsection{sasl}
\subsubsection{ldap}

\section{Qmail-ldap}

\subsection{Instalación}
\subsection{Configuración}

\section{Sendmail}

\subsection{Instalación}
\subsection{Configuración}

\section{Exim}

\subsection{Instalación}
\subsection{Configuración}

\subsection{IMAP / POP Servers}

\section{Cyrus}

\section{Courier}

\section{SPAM}
\label{spam}

\section{VIRUS}
\label{virus}
