Abrir puertos del router desde la Raspberry Pi

Sección Unicamente para Tutoriales y Guías
Responder
Avatar de Usuario
egrueda
Pi God
Pi God
Mensajes: 3426
Registrado: 10 Feb 2017, 19:31
Agradecido: 7 veces
Agradecimiento recibido: 269 veces

A raiz de una consulta en el foro, creo interesante hacer un pequeño artículo respecto al UPNP que soportan la mayoría de los routers.

¿Qué es UPnP?
Para que nos entendamos sin profundizar, es un conjunto de protocolos que permiten a los equipos en redes privadas descubrir configuraciones de red y enrutamientos, así como crear y modificar estas configuraciones (https://es.wikipedia.org/wiki/Universal_Plug_and_Play)

¿Para qué lo usamos?
En este caso vamos a usar UPNP para abrir los puertos en el servidor, directamente desde nuestra Raspberry Pi.
De esta forma no tenemos que acceder al router para abrir el puerto, y además funcionará si cambiamos de router o si movemos la raspi a otra red.

¿Qué se necesita?
  • Un router compatible
  • El software MiniUPnP
  • Acceso SSH a la raspberry pi
La mayoría de los routers actuales soportan UPnP
Eso no quiere decir que venga habilitado por defecto o que venga desconfigurado.
Muchos routers con UPnP sólo permiten abrir puertos locales por encima del 1024

Instalación
Primero necesitamos instalar MiniUPnP

Código: Seleccionar todo

sudo apt-get install miniupnpc
Una vez instalado ya podemos ejecutar el comando upnpc:

Código: Seleccionar todo

pi@raspberry:~ $ upnpc
upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
Usage : upnpc [options] -a ip port external_port protocol [duration]
                Add port redirection
        upnpc [options] -d external_port protocol [port2 protocol2] [...]
                Delete port redirection
        upnpc [options] -s
                Get Connection status
        upnpc [options] -l
                List redirections
        upnpc [options] -L
                List redirections (using GetListOfPortMappings (for IGD:2 only)
        upnpc [options] -n ip port external_port protocol [duration]
                Add (any) port redirection allowing IGD to use alternative external_port (for IGD:2 only)
        upnpc [options] -N external_port_start external_port_end protocol [manage]
                Delete range of port redirections (for IGD:2 only)
        upnpc [options] -r port1 protocol1 [port2 protocol2] [...]
                Add all redirections to the current host
        upnpc [options] -A remote_ip remote_port internal_ip internal_port protocol lease_time
                Add Pinhole (for IGD:2 only)
        upnpc [options] -U uniqueID new_lease_time
                Update Pinhole (for IGD:2 only)
        upnpc [options] -C uniqueID
                Check if Pinhole is Working (for IGD:2 only)
        upnpc [options] -K uniqueID
                Get Number of packets going through the rule (for IGD:2 only)
        upnpc [options] -D uniqueID
                Delete Pinhole (for IGD:2 only)
        upnpc [options] -S
                Get Firewall status (for IGD:2 only)
        upnpc [options] -G remote_ip remote_port internal_ip internal_port protocol
                Get Outbound Pinhole Timeout (for IGD:2 only)
        upnpc [options] -P
                Get Presentation url

protocol is UDP or TCP
Options:
  -e description : set description for port mapping.
  -6 : use ip v6 instead of ip v4.
  -u url : bypass discovery process by providing the XML root description url.
  -m address/interface : provide ip address (ip v4) or interface name (ip v4 or v6) to use for sending SSDP multicast packets.
  -p path : use this path for MiniSSDPd socket.
Y para ver si funciona con nuestro router, podemos ver un listado de las redreciones UPnP que existen actualmente en nuestro router:

Código: Seleccionar todo

pi@raspberry:~ $ upnpc -l
upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.1.1:44947/rootDesc.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Found valid IGD : http://192.168.1.1:44947/ctl/IPConn
Local LAN ip address : 192.168.1.10
Connection Type : IP_Routed
Status : Connected, uptime=1111171s, LastConnectionError : ERROR_NONE
  Time started : Wed Aug  2 12:12:50 2017
MaxBitRateDown : 4200000 bps (4.2 Mbps)   MaxBitRateUp 4200000 bps (4.2 Mbps)
ExternalIPAddress = 11.22.3.44
 i protocol exPort->inAddr:inPort description remoteHost leaseTime
 0 UDP 51413->192.168.1.10:51413 'Transmission at 51413' '' 0
 1 TCP  8621->192.168.1.10:8621  'AceStream port 8621 -> 8621' '' 0
 2 TCP  8622->192.168.1.10:8621  'AceStream port 8621 -> 8622' '' 0
 3 TCP 51413->192.168.1.10:51413 'NAT-PMP 51413 tcp' '' 3474
Conceptos de redirecciones
Cuando "abrimos" un puerto, en realidad estamos creando una redirección desde el exterior de nuestro router a nuestra raspberry.
Por tanto, para abrir un puerto necesitamos:
  • La IP externa de nuestro router
  • Un puerto externo
  • La IP interna de nuestra raspberry
  • El puerto de la raspberry que queremos abrir.
La IP externa no hace falta que la proporcionemos, el router ya tiene esa información.
El puerto externo es un número de puerto (del 1 al 65535) al que conectaremos desde fuera. Usamos un puerto para cada servicio, así podemos acceder a varios servicios desde una misma dirección IP.
La IP interna de la Raspberry Pi es la que le hemos asignado en su instalación. Si tenemos IP dinámica, podemos ver la IP actual desde la línea de comandos.
Por ejemplo, si estamos conectados con cable de red:

Código: Seleccionar todo

ifconfig eth0
Y si estamos conectados de forma inalámbrica:

Código: Seleccionar todo

ifconfig wlan0
Por último, el puerto local de la raspberry es el puerto al que queremos acceder, es decir, al servicio que tenemos en la raspberry.

Manos a la obra
En nuestro ejemplo, la Raspberry Pi tiene la dirección 192.168.1.10 y tiene kodi instalado.
Kodi tiene una interfaz web a la que se accede por el puerto 8080 (http://192.168.1.10:8080)
Nuestro router tiene la dirección local 192.168.1.1 y la IP externa es 11.22.33.44
Yo en este caso quiero que cuando alguien se conecte desde fuera a la IP 11.22.33.44 en el puerto 8080, esa conexión sea redirigida a la IP 192.168.1.10, al puerto 8080.

O sea, quiero hacer esta redirección:

Código: Seleccionar todo

11.22.33.44:8080 => 192.168.1.10:8080
Y este es el comando para hacerlo:

Código: Seleccionar todo

upnpc -a 192.168.1.10 8080 8080 TCP
¡Así de fácil! Veamos cada uno de los parámetros:
  • upnpc -a sirve para añadir una regla en el router
  • Después indicamos la IP local a la que queremos redirigirlo (la IP de la Raspberry Pi)
  • A continuación indicamos el puerto local, el de la Raspberry Pi
  • Luego indicamos el puerto exterior al que nos conectamos desde fuera, que puede ser igual o distinto al puerto interno
  • Por último indicamos el protocolo (TCP ó UDP), en este caso TCP
Veamos el resultado:

Código: Seleccionar todo

pi@raspberry:~ $ upnpc -a 192.168.1.10 8080 8080 TCP
upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.1.1:44947/rootDesc.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Found valid IGD : http://192.168.1.1:44947/ctl/IPConn
Local LAN ip address : 192.168.1.10
ExternalIPAddress = 11.22.33.44
InternalIP:Port = 192.168.1.10:8080
external 11.22.33.44:8080 TCP is redirected to internal 192.168.1.10:8080 (duration=0)
En la última línea nos indica:
external 11.22.33.44:8080 TCP is redirected to internal 192.168.1.10:8080
Eso nos indica claramente el resultado de nuestra prueba :-)

Y también podemos ver un listado de reglas UPnP, para comprobar que se ha añadido la nuestra:

Código: Seleccionar todo

pi@raspberry:~ $ upnpc -l
upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.1.1:44947/rootDesc.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Found valid IGD : http://192.168.1.1:44947/ctl/IPConn
Local LAN ip address : 192.168.1.10
Connection Type : IP_Routed
Status : Connected, uptime=1111171s, LastConnectionError : ERROR_NONE
  Time started : Wed Aug  2 12:12:50 2017
MaxBitRateDown : 4200000 bps (4.2 Mbps)   MaxBitRateUp 4200000 bps (4.2 Mbps)
ExternalIPAddress = 11.22.3.44
 i protocol exPort->inAddr:inPort description remoteHost leaseTime
 0 UDP 51413->192.168.1.10:51413 'Transmission at 51413' '' 0
 1 TCP  8621->192.168.1.10:8621  'AceStream port 8621 -> 8621' '' 0
 2 TCP  8622->192.168.1.10:8621  'AceStream port 8621 -> 8622' '' 0
 3 TCP 51413->192.168.1.10:51413 'NAT-PMP 51413 tcp' '' 3474
 4 TCP  8080->192.168.1.10:8080 'libminiupnpc' '' 0
La última línea es la regla que acabamos de añadir.

Borrar una regla
Para borrar una regla que hemos creado usamos el parámetro -d
Por ejemplo, para borrar nuestra regla de ejemplo:

Código: Seleccionar todo

upnpc -d 8080 TCP
Comando completo:

Código: Seleccionar todo

pi@raspberry:~ $ upnpc -d 8080 TCP
upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard
Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
for more information.
List of UPNP devices found on the network :
 desc: http://192.168.1.1:44947/rootDesc.xml
 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1

Found valid IGD : http://192.168.1.1:44947/ctl/IPConn
Local LAN ip address : 192.168.1.10
UPNP_DeletePortMapping() returned : 0
Opciones avanzadas

¿Temporal o permanente?

Es posible crear una regla que sólo se aplique durante un determinado tiempo.
Esto es práctico para que se borren automáticamente las reglas del router.
En nuestro ejemplo anterior, podemos hacer que la regla se mantenga durante una hora simplemente añadiéndole el número de segundos (en este ejemplo, 3600 segundos):

Código: Seleccionar todo

upnpc -a 192.168.1.10 8080 8080 TCP 3600
En este caso el comando responderá:

Código: Seleccionar todo

external 11.22.33.44:8080 TCP is redirected to internal 192.168.1.10:8080 (duration=3600)
Crear un script

Podemos crear un script para abrir el puerto de forma más rápida y cómoda.
Por ejemplo, voy a crear un script en /home/pi/upnpc.sh para automatizar mi ejemplo.

1. Editamos el archivo con nuestro editor preferido (vim, nano, etc.)

Código: Seleccionar todo

vim /home/pi/upnpc.sh

Código: Seleccionar todo

#!/bin/bash

# Configuracion
LOCAL_IP=`ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1`
REMOTE_PORT=8080
LOCAL_PORT=8080
PROTOCOL=TCP
DURATION=3600

# Comando
/usr/bin/upnpc -a $LOCAL_IP $LOCAL_PORT $REMOTE_PORT $PROTOCOL $DURATION
2. Damos permiso de ejecución al fichero

Código: Seleccionar todo

chmod +x /home/pi/upnpc.sh
3. Ya podemos llamar al script:

Código: Seleccionar todo

/home/pi/upnpc.sh
¡Fácil!, ¿verdad?
Última edición por egrueda el 16 Ago 2017, 10:28, editado 1 vez en total.
Estos usuarios agradecieron al autor egrueda por el mensaje:
danpacu
Avatar de Usuario
Kike
Administrador
Administrador
Mensajes: 2311
Registrado: 13 May 2016, 18:53
Ubicación: Islas Baleares - Menorca
Agradecido: 47 veces
Agradecimiento recibido: 175 veces
Contactar:

Muchísimas gracias por toda esta información @egrueda muy bien explicado y todo claro , cada día me sorprendo más lo que puedo llegar a aprender por aqui y el nivel que tienen algunos :mrgreen: :mrgreen:
Si lo puedes soñar, lo puedes hacer
Avatar de Usuario
Luthor10
Pi Destroyer
Pi Destroyer
Mensajes: 879
Registrado: 23 Mar 2017, 13:57
Agradecido: 0
Agradecimiento recibido: 0

Gracias crack! Muy interesante
tonymcgrady
Pi Beta
Pi Beta
Mensajes: 128
Registrado: 10 Feb 2017, 12:23
Agradecido: 0
Agradecimiento recibido: 0

Muchas gracias por la información :mrgreen:
javh55
Pi Newbie
Pi Newbie
Mensajes: 2
Registrado: 09 Sep 2017, 15:19
Agradecido: 0
Agradecimiento recibido: 0

Se lee muy fácil :roll:

Voy a probar en una Orange a ver como me va.

Muchas gracias


NOTA:
Tenia una PI de las ultimas con Wifi pero ya no carga ningún OS, es curioso la compre nueva y nunca me cargo la imagen normal, solo por Noob´s... actualice y plof ya ni video da, creo que me llego mal de fabrica.
jose2024
Pi Newbie
Pi Newbie
Mensajes: 1
Registrado: 13 Mar 2024, 01:47
Agradecido: 0
Agradecimiento recibido: 0

Hola amigo, gracias por tu respuesta. Pero aun sigo teniendo un problema, cuando ingreso el comando upnpc me dice connect: conection timed out, y eso que con el ejemplo que tu pusiste no aparecio ese resultado. Aqui abajo ajuntare una imagen del resultado que me arrojo el comando, quiero resolver eso porque no he podido abrir los puertos de mi Raspberry Pi 5. De antemano habilite la opcion de UPnP de mi router, estoy intentando correr un nodo de Flux, pero no he podido completar la instalacion debido a ese comando upnpc. Gracias de antemano por tu respuesta.
Adjuntos
Upnp.png
Avatar de Usuario
egrueda
Pi God
Pi God
Mensajes: 3426
Registrado: 10 Feb 2017, 19:31
Agradecido: 7 veces
Agradecimiento recibido: 269 veces

jose2024 escribió: 13 Mar 2024, 01:56estoy intentando correr un nodo de Flux, pero no he podido completar la instalacion debido a ese comando upnpc
Creo que no necesitas upnpc en la raspi para esto, simplemente abre los puertos que necesites directamente en el router.
Respecto a la captura de pantalla, detecta dos routers: uno en IPv4 y otro en IPv6.
Dado que te está dando datos reales del router, supongo que el primer error puede deberse a que lo intenta con ipv6 y falla
Responder