En el momento de escribir esto, la última versión de stunnel es la 3.8p4, que es muy aconsejable porque permite, entre otras cosas, un mayor control sobre la ubicación de certificados. Se puede conseguir en http://www.stunnel.org.
La opción -d indica en qué puerto debe escuchar. En este caso, puesto que hemos supuesto que el cliente soporta IMAP sobre SSL, el puerto debe ser 993, que es el asignado para ello (imaps). La opción -r indica a qué host y puerto debe redirigir la conexión (ésta última ya no es SSL). Si no se indica host se conecta a sí mismo. En este ejemplo es el puerto habitual de IMAP.stunnel -d 993 -r 143
Otra forma de hacerlo es:
En este caso no redirige la conexión al puerto estandar de IMAP, sino que el mismo stunnel se encarga de lanzar el servidor, asumiendo así el mismo papel que inetd. En este caso el programa servidor debe soportar ese modo de ejecución (via inetd, no abriendo la conexión por sí mismo). Tras el doble guión se pone lo mismo que en el fichero inetd.conf tras el nombre del ejecutable.stunnel -d 993 -l /usr/sbin/imapd -- imapd
Si el extremo de la conexión donde no tenemos un software SSL es el cliente, también podemos usar SSL. En este caso hay que ejecutar, en la máquina cliente:
y configuramos el cliente para que se conecte a locahost al puerto 1999.stunnel -c -d 1999 -r sslserver:puerto-s
Lo importante a recordar a es que:
stunnel -c -d 143 -r servidor_imap:1999Habrá que configurar el programa de correo para indicarle que el servidor IMAP es el propio PC (una de las cosas buenas de stunnel es que tiene una versión casi totalmente funcional para PC).
stunnel -d 1999 -r localhost:143
Este último caso es lo mismo que se puede conseguir con SSH de la forma:
La ventaja de stunnel es que no hay que tener una cuenta de la máquina remota. Debe ser el administrador de la misma (o nosotros si tenemos allí cuenta) quien arranque el servidor stunnel. No hay que indicarle a SSH un puerto aleatorio porque todo el tráfico encriptado va por la conexión que se establece con el servidor.ssh -L 143:servidor_imap:143 servidor_imap
La autentificación de cliente puede imponerse ejecutando el servidor con la opción -v, cuyo argumento indica el nivel de autentificación exigido. Los valores que puede tomar son:
Estas opciones nos pueden servir para implementar un control de acceso, para lo cual también se puede utilizar el control de TCP Wrappers, si stunnel se compiló con soporte para ello.
Para crear los certificados podemos usar OpenSSL. En la página Creación de certificados para stunnel se muestra una forma sencilla de hacerlo.
Veamos un ejemplo completo de cómo conseguir una comunicación segura con control de acceso al puerto 25 (SMTP) de un servidor desde un PC, suponiendo que en ninguna de las máquinas tenemos software SSL, y que hemos seguido el procedimiento de la página antes mencionada para crear los certificados de servidor y de clientes:
stunnel -d 1999 -r 25 -p $CADIR/certs/server.pem \ -v 3 -A $CADIR/cacert.pem -a $CADIR/certs
stunnel -c -d 25 -r servidor:1999 -p client.pem
stunnel -d 1999 -r 25 -p $CADIR/certs/server.pem \ -v 2 -A $CADIR/cacert.pem
Nota: En modo cliente, el fichero con el certificado debe estar accesible cuando stunnel se ejecuta, aunque éste no lo usará si no se da la opción -p. Como, si no se da esa opción, el fichero que busca por defecto es stunnel.pem, tendremos que tener ese fichero con ese nombre (a no ser que usemos otro con -p).
En el caso del cliente, hay tres fuentes de las que puede obtener la conexión a enviar por el canal SSL:
En este caso no es necesario usar la opción -d porque obviamente la conexión se la da abierta inetd. Esta forma tiene el inconveniente de la lentitud por el arranque del programa en cada. conexión.servicio stream tcp nowait root /usr/local/sbin/stunnel \ stunnel -c -r host:puerto-s
Aquí en cuanto termina el programa, termina stunnel.stunnel -c -r server:puerto-s -l /.../programa
En el caso del servidor, puede obtener la conexión SSL de dos fuentes:
servicio-s stream tcp nowait root /usr/local/sbin/stunnel \ stunnel -r host:1999
En este caso se conecta con las entrada/salida estandar del programa.stunnel -d puerto-s -l /.../programa
En resumen:
Origen | Destino | |
---|---|---|
Cliente (-c) | -d, -l, -L, inetd | -r |
Servidor | -d, inetd | -r, -l, -L |
Nota: En la versión de PC no están disponibles las opciones -l y -L.
Veamos un último ejemplo que permite enviar texto a un servidor, el cual lo va almacenando en un fichero:
servicio-s stream tcp nowait root /usr/local/sbin/stunnel \ stunnel -l /bin/dd -- dd of=/tmp/salida
stunnel -c -r server:servicio-s -l /bin/cat -- cat fichero
Más notas: Si ejecutamos stunnel en el modo inetd, tenemos problemas en sistemas operativos, como Solaris, que no permiten pasar a un programa arrancado de esta forma más de 5 argumentos, por lo que si hay que usar la opción -p o -R (para indicar el fichero de datos aleatorios, si es necesario), puede que tengamos que compilar el programa con esos datos por defecto, de forma que no haya que pasárselos como argumentos.
http://www.stunnel.org
http://mike.daewoo.com.pl/computer/stunnel
http://www.ssh.com
http://www.openssh.com
http://munitions.vipul.net/0208.shtml
http://www.openssl.org
http://www.stunnel.org/faq/certs.html
http://www.rickk.com/sslwrap/ - programa semejante a stunnel