# Comunicación punto a punto con ngrok

**Ngrok** es una herramienta que permite exponer un servidor local a Internet de manera segura y sencilla. Básicamente, crea una especie de "túnel" entre tu ordenador (o servidor local) y la red externa, asignándote una URL pública temporal.&#x20;

Esta aplicación es sobretodo útil en entornos de testeo de aplicaciones o para acceder a servicios locales desde otros dispositivos o desde Internet, sin necesidad de configurar un dominio o modificar el router, algunas utilidades:

* **Desarrollo y pruebas remotas**: Ideal para probar aplicaciones web y APIs con servicios externos o para mostrar avances a clientes sin desplegar la app en un servidor real.
* **Pruebas de Webhooks**: Herramientas como Stripe, GitHub, Slack, entre otros, requieren URLs públicas para enviar notificaciones, y Ngrok facilita recibir esos datos en tu entorno de desarrollo.
* **Pruebas en diferentes dispositivos**: Puedes acceder a tu aplicación desde otros dispositivos (como móviles) usando la URL pública que Ngrok genera.

<figure><img src="/files/dfyxUQFcLgJUrGte6kNz" alt="" width="375"><figcaption><p>ngrok funciona como servidor intermedio y seguro</p></figcaption></figure>

Puedes redirigir el trafico de cualquier servicio y protocolo que requieras, por ejemplo:

```
ngrok tcp 22 (Para SSH)
ngrok http 80 (Para web)
ngrok http 3000 (Para node)

```

Para ello sigue estos pasos: primero de todo, [regístrate en *ngrok*](https://ngrok.com/) y elige que entorno de trabajo utilizas (Linux, Windows, Docker...) y sigue las instrucciones de instalación. Dependiendo de la plataforma elegida sigue los pasos:

## Para Windows

Podrías hacerlo de dos formas:

* Mediante el archivo `.exe`
* Mediante chocolatey :chocolate\_bar:

Empezando de forma más sencilla:

1. Descarga el archivo .exe a tu carpeta de proyecto (si es node.js o si esta en xampp con localhost)

<figure><img src="/files/zjFUD8yLKSmAWqPwNZ9p" alt=""><figcaption></figcaption></figure>

2. Ejecutamos ngrok en el mismo terminal de VScode y como aparece en las instrucciones o mediante el propio archivo .exe (`.\ngrok.exe`) con el token de autorización que te ha dado el propio ngrok:

<figure><img src="/files/i9adWC4Ua5BFvoUoeQN3" alt=""><figcaption></figcaption></figure>

```batch
.\ngrok.exe config add-authtoken XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

3. Ejecutamos el comando (siendo 80 el puerto http de localhost por defecto, 3000 si es node por ejemplo):

```batch
ngrok http 80
```

4. Este creará un dominio de forwarding, accede a él a través de navegador.

<figure><img src="/files/N1tFV8doaPCpMIvVZQ0V" alt=""><figcaption><p>En la imagen se ve abajo el enlace temporal</p></figcaption></figure>

5. Ya podemos entrar a nuestro servidor localhost a través de dominio público.

<figure><img src="/files/6wCVCrQlFfxV0KQ7NcaN" alt=""><figcaption><p>El enlace es temporal y solo funcionará mientras el tunel de terminal siga activo.</p></figcaption></figure>

### Instalación con chocolatey

Con el uso de **chocolatey** :chocolate\_bar:, este es un packet manager para Windows que se encarga de la instalación y mantenimiento de aplicaciones del paquete de forma automática. Para realizarlo con este gestor :

1. Descarga e instala chocolatey desde su página oficial mediante el comando que te aparece
2. Instala ngrok con el comando especificado en la documentación de ngrok (`choco install ngrok`)
3. Revisa la versión con `ngrok -v`
4. Añade el token de autenticación tal y como se ha visto en pasos anteriores.
5. Ahora vuelve a ejecutar el comando `ngrok http 80`&#x20;

### Para un dominio estático

Si lo que quieres es servir tu aplicación a través de un dominio estático comprado, el comando seria tal que así:

```batch
ngrok http 8080 --url https://example.ngrok.app
```

## Para Linux

En Linux, ngrok se ejecutará como un servicio de systemd pero podemos instalarlo de varias formas dependiendo de la distro, en distros de Debian:

```bash
apt install ngrok
```

o

{% code overflow="wrap" %}

```bash
curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
	| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
	&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
	| sudo tee /etc/apt/sources.list.d/ngrok.list \
	&& sudo apt update \
	&& sudo apt install ngrok
```

{% endcode %}

o

```bash
wget https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz

#despues de hacer el wget hacemos esto para descomprimir
tar -xvzf ngrok-v3-stable-linux-amd64.tgz -C /usr/local/bin/
```

A continuación, como siempre, añade el token:

```bash
ngrok config add-authtoken XXXXXXXXXXXX
```

Y ahora para que lo contemple como servicio deberemos crear una unidad service en `/etc/systemd/system/ngrok.service`:

```bash
sudo nano /etc/systemd/system/ngrok.service
```

```ini
[Unit]
Description=Ngrok Tunnel Service
After=network.target

[Service]
ExecStart=/usr/local/bin/ngrok http 80
Restart=always
User=root
WorkingDirectory=/usr/local/bin

[Install]
WantedBy=multi-user.target
```

Reiniciamos el daemon sin parar servicios:

```bash
systemctl daemon-reload
```

Reiniciamos el servicio de ngrok:

```bash
systemctl restart ngrok.servive
```

Podemos revisar ahora si está activo o no:

```bash
systemctl status ngrok.servive
```

Activarlo por defecto con el inicio del servidor:

```bash
systemctl enable ngrok.servive
```

En la web de Ngrok (en endpoints) podemos encontrar ahora la URL efímera que nos ha creado:

```
http://7.tcp.eu.ngrok.io:19089
```

{% hint style="info" %}
Una aplicación interesante es crear un **túnel SSH** para poder conectarnos en remoto, para ello simplemente el comando es `ngrok tcp 22` como ya hemos visto y desde la web, en endpoints copiaremos el dominio.

```
ssh -L 8006:localhost:8006 root@7.tcp.eu.ngrok.io -p 19089
```

Con esto podemos conseguir redirigir (como en el comando) la visualización de proxmox (puerto 8006) y generar una conexión SSH a la vez.
{% endhint %}

## Para Docker

Con docker simplemente hay que descargar la imagen de ngrok con el siguiente comando:

```
docker pull ngrok/ngrok
```

Para el dominio público aleatorio de ngrok, ejecutaremos el contenedor redirigiendo el tráfico del servicio que queremos. Por ejemplo, en http por el puerto 80 (`http://localhost:8080`). Recuerda añadir el token correspondiente de la web:

```
docker run --net=host -it -e NGROK_AUTHTOKEN=XXXXXXXXXX ngrok/ngrok:latest http 80
```

Una vez ejecutado, podrás revisar los *endpoints* en su página correspondiente.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://apuntes-alex.gitbook.io/apuntes-sistemas-y-redes/redes/vpn-y-escritorio-remoto/comunicacion-punto-a-punto-con-ngrok.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
