smtp-source sin instalar Postfix: extraer herramientas de pruebas de carga del RPM
smtp-source y smtp-sink forman parte de Postfix, pero también funcionan sin un servidor de correo instalado. Cómo extraer ambas herramientas del paquete en RHEL, por qué ejecutarlas desde /tmp puede fallar debido a la opción de montaje noexec y qué bibliotecas deben incluirse.
Para las pruebas de carga SMTP, smtp-source es una buena opción: la herramienta abre sesiones paralelas, las mantiene abiertas durante varios mensajes y, por tanto, reproduce el comportamiento de conexión de un remitente masivo de forma mucho más realista que las herramientas de prueba que abren una conexión nueva por cada correo. Su equivalente, smtp-sink, acepta correos y los descarta sin entregar nada. Ambas forman parte de Postfix.
Ahí está precisamente el problema: a menudo no hay Postfix instalado en el sistema desde el que se desea realizar la prueba. Tampoco es recomendable instalarlo en un appliance de pasarela de correo, ya que un Postfix adicional incorpora su propia configuración en /etc/postfix y un servicio del sistema que, en el peor de los casos, ocupa el puerto 25 y bloquea así el sistema de correo propiamente dicho. Además, está la cuestión de qué opina el soporte del fabricante sobre paquetes instalados posteriormente en su appliance.
Sin embargo, ambas herramientas también pueden utilizarse sin instalación: descargar el RPM, extraer los binarios junto con las bibliotecas y listo. El proceso presenta dos particularidades que este artículo muestra en un sistema RHEL 8. No necesita permisos de root, solo acceso a las fuentes de paquetes.
¿Ya está disponible smtp-source?
Primero, compruebe si la herramienta ya se encuentra en el sistema. Dependiendo de la distribución, smtp-source se encuentra fuera del PATH habitual:
command -v smtp-source || \
ls /usr/sbin/smtp-source /usr/lib/postfix/sbin/smtp-source 2>/dev/null
Si la salida permanece vacía, también falta el paquete correspondiente. En sistemas RPM, confírmelo y compruebe al mismo tiempo si los repositorios ofrecen Postfix:
rpm -qa | grep -i postfix
yum list available postfix
En el sistema de prueba no estaba instalado Postfix, pero el repositorio BaseOS ofrecía postfix-3.5.8-8.el8_10 . Con ello queda libre el camino: el paquete puede descargarse sin instalarlo.
Descargar únicamente el RPM
yum download (del paquete de plugins dnf-plugins-core, habitualmente presente en RHEL 8) descarga un paquete en el directorio actual sin instalarlo. Funciona sin permisos de root siempre que el directorio de destino sea escribible:
cd /tmp && yum download postfix
Si yum informa No such command: download, falta el plugin. Con permisos de root puede lograr lo mismo mediante el comando de instalación con --downloadonly:
sudo yum install --downloadonly --downloaddir=/tmp postfix
Si no dispone de ninguna de las dos opciones, queda el rodeo mediante un segundo sistema con la misma versión de RHEL: descargue allí el RPM y cópielo al sistema de destino con scp.
Extraer binarios y bibliotecas
rpm2cpio convierte el RPM en un flujo de archivo cpio, del cual cpio extrae de forma selectiva rutas individuales. Además de los dos binarios, también necesita las bibliotecas de Postfix, ya que en RHEL las herramientas están enlazadas dinámicamente con libpostfix-*.so:
cd /tmp && rpm2cpio postfix-*.rpm | \
cpio -idmv ./usr/sbin/smtp-source ./usr/sbin/smtp-sink \
'./usr/lib64/postfix/*'
Los archivos quedan después bajo /tmp/usr/.
Problema 1: /tmp está montado con noexec
El inicio obvio directamente desde /tmp falla en sistemas reforzados:
bash: /tmp/usr/sbin/smtp-sink: Permission denied
[1]+ Exit 126
El código de salida 126 pese a tener correctamente establecido el bit de ejecución es el síntoma típico de un sistema de archivos con la opción de montaje noexec. En ese caso, el kernel rechaza toda ejecución de programas desde ese sistema de archivos, independientemente de los permisos del archivo. Puede comprobarlo directamente:
mount | grep ' /tmp '
La solución: copie los binarios y las bibliotecas a un directorio cuyo sistema de archivos permita la ejecución, por ejemplo, su propio directorio personal:
mkdir -p ~/bin && \
cp /tmp/usr/sbin/smtp-source /tmp/usr/sbin/smtp-sink \
/tmp/usr/lib64/postfix/libpostfix-*.so ~/bin/ && \
chmod +x ~/bin/smtp-source ~/bin/smtp-sink
Tenga en cuenta que noexec también afecta a la carga de bibliotecas compartidas. Por tanto, no basta con mover solo los binarios y dejar las bibliotecas en /tmp.
Problema 2: la ruta de las bibliotecas
Sin más indicaciones, el enlazador dinámico busca las bibliotecas de Postfix en /usr/lib64/postfix, donde no se encuentran al no haber instalación:
smtp-sink: error while loading shared libraries: libpostfix-global.so:
cannot open shared object file: No such file or directory
LD_LIBRARY_PATH añade el directorio propio a la ruta de búsqueda del enlazador. La variable se antepone a cada invocación:
LD_LIBRARY_PATH=~/bin ~/bin/smtp-source ...
Con ldd ~/bin/smtp-source puede comprobar de antemano si se pueden resolver todas las dependencias. Aparte de las bibliotecas de Postfix, las herramientas solo dependen de bibliotecas estándar del sistema.
Prueba de funcionamiento en loopback
Puede comprobar que todo funciona sin un solo correo real: smtp-sink escucha como receptor de descarte en un puerto alto, mientras que smtp-source realiza la entrega. Todo el tráfico permanece en localhost.
LD_LIBRARY_PATH=~/bin ~/bin/smtp-sink -v 127.0.0.1:2525 100 &
LD_LIBRARY_PATH=~/bin ~/bin/smtp-source -s 2 -m 10 -l 5120 \
-f test@example.com -t test@example.com 127.0.0.1:2525
Si tiene éxito, smtp-source no genera salida, mientras que smtp-sink muestra para cada mensaje el diálogo SMTP completo, desde HELO hasta QUIT. A continuación, detenga el proceso en segundo plano y elimine los restos de /tmp:
kill %1
rm -rf /tmp/usr /tmp/postfix-*.rpm
Indicaciones para la prueba de carga real
Para mediciones de rendimiento fiables, el generador de carga debe estar en una máquina independiente dentro del mismo segmento de red, no en el propio objeto de prueba. Si smtp-source se ejecuta en la pasarela evaluada, el generador y el sistema de correo compiten por CPU y E/S, y la medición muestra esa competencia en lugar de la capacidad real. Localmente en el sistema de destino, la herramienta extraída sirve sobre todo para pruebas funcionales del conjunto de reglas y para comprobaciones iniciales de plausibilidad.
En cuanto la prueba se realiza contra el puerto 25 real, se trata de correos reales que atraviesan el conjunto de reglas de la pasarela y que, según la configuración, se entregan. Por ello, utilice direcciones de destinatario que terminen en destinos controlados: un buzón de prueba dedicado, una regla que descarte los remitentes de prueba o un dominio de descarte previsto para ello por el proveedor. Las direcciones de producción no deben usarse en una prueba de carga.
El procedimiento descrito es útil más allá de las dos herramientas SMTP para cualquier programa de línea de comandos incluido en un paquete cuya instalación en el sistema de destino no sea una opción. La combinación de yum download, rpm2cpio y un directorio ejecutable en el directorio personal es igual en cualquier sistema RPM.
Comentarios
Los comentarios se cargan desde GitHub / Giscus.