El tunelado TCP es útil porque puedes reenviar conexiones que no son sólo sitios web ejecutando HTTP(s). Los casos de uso donde esto se aplica es el reenvío de cosas como SSH, RDP o Postgres. Recientemente quise usar Cloudflare Tunnels para reenviar conexiones TCP para mi base de datos. Esto me permitiría acceder a mi base de datos desde cualquier parte del mundo usando un túnel seguro y protegido.
Protocolos Soportados
| Servicio | Descripción | Ejemplo service valor |
|---|---|---|
| HTTP/S | Incoming HTTP requests are proxied directly to your local service. | https://localhost:8000 |
| HTTP over Unix socket | Just like HTTP, but using a Unix socket instead. | unix:/home/production/echo.sock |
| HTTPS over Unix socket | Just like HTTPS, but using a Unix socket instead. | unix+tls:/home/production/echo.sock |
| TCP | TCP connections are proxied to your local service. | tcp://localhost:2222 |
| SSH | SSH connections are proxied to your local service. Learn more. | ssh://localhost:22 |
| RDP | RDP connections are proxied to your local service. Learn more. | rdp://localhost:3389 |
| kubectl bastion mode | cloudflared will act like a jumphost, allowing access to any local address. | bastion |
| Hello World | Test server for validating your Cloudflare Tunnel setup. | hello_world |
| HTTP status | Responds to all requests with the given HTTP status. | http_status:404 |
Tunnel TCP - Cloudflared (CloudFlare Daemon Tunnel)
Los túneles TCP con CFT requieren que cloudflared se esté ejecutando tanto en el nodo de destino como en todos los nodos cliente conectados. (Esto sólo se aplica para TCP sin procesar y no para protocolos de capa 7). Vamos a instalarlo.
sudo apt-get update; sudo apt-get -y install cloudflared
Autentifica el nodo servidor con el comando:
cloudflared tunnel login
- Cert.pem
cloudflared tunnel create postgres
Esto creará un túnel con un UUID. Anota el ID y vamos a configurar una ruta DNS que se utilizará para transportar nuestros paquetes desde nuestro reenviador local a través de la red de transporte de Cloudflare.
Archivo de credenciales
cloudflared tunnel route dns <TUNNEL_UUID> <SUBDOMINIO_DESEADO>
El subdominio deseado sería algo así como base de datos (db). Ahora debe tener un registro CNAME DNS personalizado aliasing db.<TU_DOMINIO>.com al dominio del túnel.
cloudflared tunnel route ip showMostrar información:
cloudflared tunnel info <UUID or NAME>
Ahora vamos a configurar nuestro cloudflared config YAML ubicado en ~/.cloudflared.
~/.cloudflared/config.yaml
tunnel: <TUNNEL_UUID>
credentials-file: <PATH_TO_TUNNEL_UUID>.json
ingress:
- hostname: <SUBDOMAIN>.<YOURDOMAIN>.com
service: tcp://<PRIVATE_INTERNAL_IP>:<PORT>
# catch all
- service: http_status:404
Inicia el túnel con:
cloudflared tunnel run <UUID or NAME>
# instalar el servicio cloudflared
sudo cloudflared --config ~/.cloudflared/config.yml service install
Puedes editar la configuración del servicio con:
sudo vim /etc/systemd/system/cloudflared.service
Para asegurarte de que se está ejecutando, comprueba el estado del servicio con:
systemctl status cloudflared
Ahora que el túnel se está ejecutando, el cliente necesita conectarse también. Asegúrate de que cloudflared fue instalado en el cliente y también autenticado.
cloudflared access tcp --hostname <SUBDOMAIN>.<YOURDOMAIN>.com --url 127.0.0.1:<LOCAL_PORT_FORWARD>
El comando anterior tomará las conexiones TCP enviadas a localhost:5432 en mi caso y enviará los paquetes sobre el túnel asociado con el nombre de host especificado. En mi caso con Postgres, simplemente me conecto a la IP del host 127.0.0.1 con el puerto 5432 y será reenviado al nodo servidor Postgres.
cloudflared tunnel --hostname tcp.site.com --url tcp://localhost:7870
Acceder al tunnel como cliente:
cloudflared access tcp --hostname tcp.site.com --url localhost:9210
Puedes ver la documentación de Cloudflare Tunnel aquí.
Usuario RDP
cloudflared access rdp --hostname rdp.example.com --url rdp://localhost:3389
Usuario SMB
cloudflared access tcp --hostname smb.example.com --url localhost:8445
Permisos de túnel
- Un certificado de cuenta (cert.pem) se emite para una cuenta de Cloudflare cuando inicia sesión en cloudflared. Asegúrese de ser intencional acerca de las ubicaciones y máquinas en las que almacena este certificado, ya que este certificado permite a los usuarios crear, eliminar y administrar todos los túneles para la cuenta.
- Un archivo de credenciales de túnel (<TUNNEL-UUID>.json) se emite para un túnel cuando se crea el túnel. El archivo de credenciales sólo permite al usuario ejecutar ese túnel específico, y nada más. Por lo tanto, como administrador, puede compartir las credenciales del túnel con los usuarios que ejecutarán el túnel.
| Account certificate | Tunnel credential | |
|---|---|---|
| File name | cert.pem | <TUNNEL-UUID>.json |
| Purpose | Authenticates your instance of cloudflared against your Cloudflare account | Authenticates the tunnel it is associated with |
| Scope | Account-wide | Tunnel-specific |
| File type | .pem | .json |
| Stored in | Default directory | Default directory |
| Issued when running | cloudflared tunnel login | cloudflared tunnel create <NAME> |
| Valid for | At least 10 years, and the service token it contains is valid until revoked | Does not expire |
| Needed to | Manage tunnels (for example, create, route, delete and list tunnels) | Run a tunnel. Create a config file. |
Fuentes:



No hay comentarios:
Publicar un comentario