27 de agosto de 2026 7 min de lectura

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
Opciones explicadas
OpciónEfecto
command -v smtp-sourceMuestra la ruta si el programa está en el PATH; de lo contrario, no muestra nada
/usr/sbin/... /usr/lib/postfix/sbin/...Las ubicaciones habituales fuera del PATH (RHEL y Debian/Ubuntu)
2>/dev/nullSuprime los mensajes de error de ls para rutas inexistentes

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
Opciones explicadas
OpciónEfecto
-qModo de consulta de rpm
-aEnumera todos los paquetes instalados
grep -i postfixFiltra la lista sin distinguir entre mayúsculas y minúsculas
yum list available postfix
Opciones explicadas
OpciónEfecto
list availableMuestra únicamente paquetes disponibles en los repositorios pero no instalados
postfixLimita la salida al paquete buscado

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
Opciones explicadas
OpciónEfecto
cd /tmpCambia a un directorio escribible; yum download guarda el RPM en el directorio actual
downloadSubcomando de dnf-plugins-core: descarga el paquete sin instalarlo
postfixNombre del paquete que se debe descargar

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
Opciones explicadas
OpciónEfecto
--downloadonlySe detiene tras la descarga; no se instala nada
--downloaddir=/tmpDirectorio de destino para el RPM descargado
postfixNombre del paquete

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/*'
Opciones explicadas
OpciónEfecto
rpm2cpio postfix-*.rpmConvierte el RPM en un flujo de archivo cpio en stdout
-iModo de extracción de cpio (copy-in)
-dCrea los directorios que falten durante la extracción
-mConserva las fechas de modificación de los archivos
-vEnumera cada archivo extraído
./usr/sbin/smtp-source ./usr/sbin/smtp-sinkLos dos binarios, rutas exactamente como en el archivo (con ./ inicial)
'./usr/lib64/postfix/*'Las bibliotecas de Postfix; el patrón está entre comillas para que lo evalúe cpio y no la shell

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 '
Opciones explicadas
OpciónEfecto
mountSin argumentos, enumera todos los sistemas de archivos montados con sus opciones de montaje
' /tmp 'Patrón de búsqueda con un espacio antes y después, para que solo coincida con el punto de montaje /tmp y no, por ejemplo, con /var/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
Opciones explicadas
OpciónEfecto
mkdir -p ~/binCrea el directorio de destino; sin error si ya existe
cp ... ~/bin/Copia los dos binarios y las bibliotecas libpostfix-*.so al directorio ejecutable
chmod +xEstablece el bit de ejecución en ambos binarios

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 ...
Opciones explicadas
OpciónEfecto
LD_LIBRARY_PATH=~/binAñade ~/bin a la ruta de búsqueda del enlazador dinámico para esta única invocación
~/bin/smtp-sourceInvocación mediante la ruta completa, ya que ~/bin no tiene por qué estar en el PATH

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
Opciones explicadas
OpciónEfecto
-v (smtp-sink)Registra cada paso del diálogo de las conexiones aceptadas
127.0.0.1:2525smtp-sink escucha únicamente en localhost, puerto 2525
100Backlog: longitud máxima de la cola de conexiones en espera según listen(2)
-s 2Dos sesiones SMTP paralelas
-m 10Diez mensajes en total, distribuidos entre las sesiones
-l 5120Tamaño del mensaje en bytes (sin encabezados), aquí 5 KB
-f / -tDirección del remitente y del destinatario

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
Opciones explicadas
OpciónEfecto
%1Especificación de trabajo de la shell: finaliza el primer trabajo en segundo plano, aquí smtp-sink
rm -rf /tmp/usr /tmp/postfix-*.rpm
Opciones explicadas
OpciónEfecto
-rElimina el árbol de directorios de forma recursiva
-fSin confirmaciones ni errores para rutas inexistentes
/tmp/usr /tmp/postfix-*.rpmEl árbol extraído y el RPM descargado

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.

Fuentes

  1. Postfix: smtp-source(1)

    página de manual con todos los parámetros del generador de carga, incluido el control de sesiones y mensajes.

    https://www.postfix.org/smtp-source.1.html
  2. Postfix: smtp-sink(1)

    página de manual del receptor de prueba, entre otras cosas con opciones para retrasos artificiales y respuestas de error.

    https://www.postfix.org/smtp-sink.1.html
  3. Red Hat: How to download a package without installing it

    documenta yum download y la alternativa --downloadonly.

    https://access.redhat.com/solutions/10154
  4. man7.org: mount(8)

    descripción de la opción de montaje noexec y su efecto sobre la ejecución de programas.

    https://man7.org/linux/man-pages/man8/mount.8.html

Comentarios

Los comentarios se cargan desde GitHub / Giscus.