Sospechamos que posiblemente se esté enviando SPAM desde uno de nuestros servidores (tal vez desde un sitio Wordpress comprometido) y queremos monitorear y registrar (loguear en Spanglish) todo intento de conexión TCP saliente hacia puertos 25
(SMTP) y 587
(SMTPS). Para ello es posible recurrir a la capacidad de logueo de iptables
(o UFW en Ubuntu y derivados), a través de reglas simples.
UFW
En sistemas Ubuntu, es posible loguear cualquier regla a través de la opción log
. Por ejemplo, para permitir y loguear el tráfico saliente (out
) hacia el puerto 25
, utilizar la siguiente regla:
root@ubuntu:/home/sysadmin# ufw allow out log 25 Rule added Rule added (v6)
Si se desea, repetir para el puerto 587
(SMTPS).
Al listar las reglas, se observa la palabra "log", entre paréntesis, a la derecha de las reglas que se loguean:
root@ubuntu:/home/sysadmin# ufw status Status: active To Action From -- ------ ---- 2244/tcp ALLOW Anywhere 80/tcp ALLOW Anywhere 2244/tcp (v6) ALLOW Anywhere (v6) 80/tcp (v6) ALLOW Anywhere (v6) 25 ALLOW OUT Anywhere (log) 25 (v6) ALLOW OUT Anywhere (v6) (log)
Los registros del log del firewall UFW se envían al log del sistema, que en Ubuntu (al igual que Debian) es /var/log/syslog
. Aunque también se escriben en el archivo /var/log/ufw.log
.
Para probar el funcionamiento de la regla, enviar un correo hacia cualquier destinatario válido:
root@ubuntu:/home/sysadmin# echo "test" | mail -s prueba sysadmin@linuxito.com
Se observa que el tráfico saliente hacia el puerto 25 (de la dirección IP del servidor de correo del destinatario, en este ejemplo reemplazado por asteriscos para conservar la privacidad) queda registrado correctamente en el log:
root@ubuntu:/home/sysadmin# grep "DPT=25" /var/log/ufw.log | grep "OUT=eth0" Apr 4 12:53:24 ubuntu kernel: [347241.160052] [UFW ALLOW] IN= OUT=eth0 SRC=***.***.***.*** DST=***.***.***.*** LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=1946 DF PROTO=TCP SPT=53098 DPT=25 WINDOW=29200 RES=0x00 SYN URGP=0
iptables
En iptables es posible utilizar una única regla para varios puertos destino a través de la opción -m multiport
.
Suponiendo que la política de la cadena OUTPUT es ACCEPT, agregar la siguiente regla en dicha cadena para loguear el tráfico SMTP/SMTPS saliente:
iptables -A OUTPUT -p tcp -m multiport --dports 25,587 -m state --state NEW -j LOG --log-uid --log-prefix "SMTP SALIENTE "
La opción --log-uid
permite registrar el PID del proceso que originó le paquete y --log-prefix
permite definir un prefijo personalizado para la entrada en el log (en este caso "SMTP SALIENTE ").
Listar la cadena para comprobar la correctitud:
root@linuxito:~# iptables -nL OUTPUT Chain OUTPUT (policy ACCEPT) target prot opt source destination LOG tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 25,587 state NEW LOG flags 8 level 4 prefix "SMTP SALIENTE "
Si la política para el tráfico de salida es DROP (la opción más recomendable y segura), y se desea permitir y loguear el tráfico SMTP/SMTPS, antes de esta regla será necesario agregar la siguiente:
iptables -A OUTPUT -p tcp -m multiport --dports 25,587 -j ACCEPT
Recordar que las reglas de iptables
son evaluadas en orden.
Enviar un mail de prueba:
root@linuxito:~# echo "prueba" -s "prueba fw" sysadmin@linuxito.com
En el syslog se observa el mensaje:
root@linuxito:~# tail /var/log/syslog | grep SMTP Apr 5 10:24:41 linuxito kernel: [7416562.948591] SMTP SALIENTE IN= OUT=venet0 SRC=***.***.***.*** DST=***.***.***.*** LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=31515 DF PROTO=TCP SPT=51119 DPT=25 WINDOW=14600 RES=0x00 SYN URGP=0 UID=103 GID=105
Notar el prefijo (y por qué se deja un espacio en blanco cuando se define).
De esta forma es posible analizar cuántos paquetes y hacia qué destinos están saliendo a través del protocolo SMTP/SMTP (correo saliente), lo cual nos permitirá determinar si efectivamente se está enviando SPAM (o no) desde nuestro servidor.