POP before SMTP con Sendmail y Qpopper
October 26th, 2008 by Jorge MachinEsta es la solución basada en poprelay que utilizaba en mis años mozos en Interalia. Supone que se utiliza qpopper como servidor pop y sendmail como servidor SMTP.
Aunque la utilizaba hace mucho tiempo, pude comprobar que aún sigue siendo una opción vigente.
Poprelay
El código fuente de Poprelay se pueden encontrar en Sourceforge.
Una vez instalado, para hacerlo funcionar con sendmail, se debe integrar el siguiente código al archivo de configuración /etc/sendmail.mc:
FEATURE(access_db)dnl
# List of IP addresses we allow relaying from.
Klocalip hash -a<MATCH> /etc/mail/localip
Kpopip hash -a<MATCH> /etc/mail/popip
LOCAL_RULESETS
SLocal_check_rcpt
# Put the address into cannonical form (even if it doesn't resolve to an MX).
R$* $: $>Parse0 $>3 $1
R$* <$*> $* $: $1 <$2 .> $3 Pretend it's canonical.
R$* <$* . .> $* $1 <$2 .> $3 Remove extra dots.
# Allow relaying if the connected host is a local IP address.
R$* $: <$&{client_addr}> Get client IP address.
R<> $#OK Local is ok.
R<$* . $-> $* $(localip $1.$2 $: <$1> . $2 $) Check last three octets.
R$* <MATCH> $#OK
R<$-> $* $: $(localip $1 $: <> $1 $2 $) Check first octet.
R$* <MATCH> $#OK
# Allow relaying if the connected host has recently POP3 authenticated.
R$* $: <$&{client_addr}> Get client IP address.
R<$*> $(popip $1 $) Check full address.
R$* <MATCH> $#OK
# IP address didn't match.
Recreamos el archivo /etc/sendmail.cf con:
Crear el archivo /etc/mail/localip el cual contiene una lista de todas las direcciones IP y redes que se les va a permitir hacer relay sin autentificacion.
Crear el archivo /etc/mail/popip:
Copiar el archivo poprelay a /usr/bin y darle permisos de ejecución para sólo para root:
Modificar la función scanaddr del archivo /usr/bin/poprelay según la versión del servidor de correo POP:
qpoper 2.5X
local $s, $i, @adressen;
$s = $_[0];
$i = index ($s,'popper');
undef @adressen;
if ($i>=0){
($s =~ /.*?popper.*?POP login.*?(d{1,3}.d{1,3}.d{1,3}.d{1,3})/) && (push (@adressen,$1));
}
return @adressen;
}
qpoper 3.X o posterior:
local $s, $i, @adressen;
$s = $_[0];
$i = index ($s,'popper');
undef @adressen;
if ($i>=0){
($s =~ /.*?popper.*?(d{1,3}.d{1,3}.d{1,3}.d{1,3})/) && (push (@adressen,$1));
}
return @adressen;
}
Levantar el demonio y colocarlo en /etc/rc.d/rc.local:
o bien hacer un archivo de inicialización:
#
# Init file for poprelay server daemon
#
# chkconfig: 2345 55 25
# description: pop/imap client relay deamon
#
# processname: poprelayd
# pidfile: /var/run/poprelayd.pid
# source function library
. /etc/rc.d/init.d/functions
# pull in sysconfig settings
RETVAL=0
POPRD="/sbin/poprelayd";
prog="poprelayd"
start()
{
echo -n $"Starting $prog:"
initlog -c "$POPRD -d" && success || failure
RETVAL=$?
[ "$RETVAL" = 0 ] && touch /var/lock/subsys/poprelayd
echo
}
stop()
{
echo -n $"Stopping $prog:"
killproc $POPRD -TERM
RETVAL=$?
[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/poprelayd
echo
}
reload()
{
echo -n $"Reloading $prog:"
killproc $POPRD -HUP
RETVAL=$?
echo
}
check()
{
PROCS=`ps -ef | grep "poprelayd -d" | grep -v grep | wc -l`
if [ $PROCS -ne 1 ]; then
echo "Restarting dead poprelayd: $PROCS running";
stop;
start;
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
check)
check
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
RETVAL=1
esac
exit $RETVAL