miniUPnPc. Abrir puertos del router desde la consola

Cuando necesitas que un servicio en tu ordenador sea accesible desde internet necesitas que en el router conste un mapeo del puerto que precisas. En el mapeo debe constar el puerto al que intentarán conectar desde internet (externo), el puerto al que debe redirigir las conexiones a tu ordenador (interno) y la IP de tu ordenador. Si la IP de tu ordenador cambia entonces el mapeo dejará de funcionarte, para evitarlo tienes varias opciones.

Una opción sería configurar, dentro de tu LAN, la IP de tu ordenador de forma manual o, si el router lo permite, que el servidor DHCP asigne siempre la misma IP a una determinada dirección MAC para así poder abrir un puerto en el router e indicarle a qué IP deben ir las conexiónes entrantes. Sabiendo que dicha IP no se modificará.

La otra opción es utilizar la herramienta miniUPnPc que mediante un sencillo comando nos permitirá hacer el mismo proceso que hacen automáticamente aplicaciones como Transmission, dando igual que cada vez que arranques el ordenador tengas una IP distinta. Pudiendo abrir y cerrar el puerto sólo cuando se inicie el servicio que necesitas. Sólo hay un requisito, que el router soporte y tenga activado UPnP.

En Ubuntu el paquete se llama miniupnpc y se puede instalar de la forma habitual:

# apt-get install miniupnpc

La forma más básica de abrir un puerto hacia tu ordenador, por ejemplo el 22 del protocolo TCP, es:

$ upnpc -r 22 TCP

También se puede cerrar el puerto:

$ upnpc -d 22 TCP

Tiene muchas más opciones relacionadas que puedes consultar ejecutando la utilidad sin parámetros (no tiene página man ni parámetro -h).

Siguiendo con el ejemplo de abrir el puerto 22 para el servicio ssh, es muy fácil crear el servicio de systemd (próximamente en Debian y derivados) para abrir el puerto automáticamente durante el arranque. Sólo habría que crear el archivo /etc/systemd/system/upnpcTCP@.service con el siguiente contenido:

[Unit]
Description=UPnP on port %i of TCP protocol
After=network.target

[Service]
ExecStart=/usr/bin/upnpc -r %i TCP

[Install]
WantedBy=multi-user.target

Y activar el servicio para el puerto 22:

# systemctl enable upnpcTCP@22.service