[{"data":1,"prerenderedAt":1118},["ShallowReactive",2],{"content-index":3,"guide-es-self-hosting-expose-docker-containers-to-the-internet":80,"guides-navigation-es":1030},{"en":4,"de":54,"es":67},{"paths":5,"docs":29},[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28],"\u002Fdocs\u002Fgetting-started","\u002Fdocs\u002Flinux","\u002Fdocs\u002Fmacos","\u002Fdocs\u002Fwindows","\u002Fdocs\u002Fdocker","\u002Fdocs\u002Fcreate-api-key","\u002Fguides\u002Ffind-your-public-ip-address\u002Ffind-your-ip-address-on-linux","\u002Fguides\u002Ffind-your-public-ip-address\u002Ffind-your-ip-address-on-mac","\u002Fguides\u002Ffind-your-public-ip-address\u002Ffind-your-ip-address-on-windows","\u002Fguides\u002Ffind-your-public-ip-address","\u002Fguides\u002Fself-hosting\u002Fdocker-desktop-mac-client-ip","\u002Fguides\u002Fself-hosting\u002Fexpose-docker-containers-to-the-internet","\u002Fguides\u002Fself-hosting\u002Fexpose-home-server-to-internet","\u002Fguides\u002Fself-hosting\u002Fgetpublicip-vs-cloudflare-tunnel-vs-tailscale","\u002Fguides\u002Fself-hosting\u002Fmac-mini-home-server","\u002Fguides\u002Fself-hosting\u002Fport-forwarding-not-working","\u002Fguides\u002Fself-hosting\u002Fself-hosting-behind-carrier-grade-nat-cgnat","\u002Fguides\u002Fself-hosting\u002Fwireguard-simple-watchdog-script","\u002Fguides\u002Fstatic-public-ip-address\u002Fhow-to-get-a-public-ip-address","\u002Fguides\u002Fstatic-public-ip-address\u002Fhow-to-get-a-static-ip-address","\u002Fguides\u002Fstatic-public-ip-address","\u002Fguides\u002Fuse-cases\u002Fhome-server","\u002Fguides\u002Fuse-cases\u002Foffice-server",[30,34,38,42,46,50],{"path":6,"title":31,"icon":32,"stem":33},"Getting Started","mdi-file-document-outline","docs\u002F1.getting-started",{"path":7,"title":35,"icon":36,"stem":37},"Linux","mdi-linux","docs\u002F2.linux",{"path":8,"title":39,"icon":40,"stem":41},"macOS","mdi-apple","docs\u002F3.macos",{"path":9,"title":43,"icon":44,"stem":45},"Windows","mdi-microsoft-windows","docs\u002F3.windows",{"path":10,"title":47,"icon":48,"stem":49},"Docker","mdi-docker","docs\u002F4.docker",{"path":11,"title":51,"icon":52,"stem":53},"Create API Key","mdi-key","docs\u002F5.create-api-key",{"paths":55,"docs":58},[6,7,8,9,10,11,12,14,15,56,17,18,57,19,21,22,24,25,26,27,28],"\u002Fguides\u002Fself-hosting\u002Fdyndns-hinter-cgnat","\u002Fguides\u002Fself-hosting\u002Ffritzbox-portfreigabe-ds-lite",[59,61,62,63,64,65],{"path":6,"title":60,"icon":32,"stem":33},"Erste Schritte",{"path":7,"title":35,"icon":36,"stem":37},{"path":8,"title":39,"icon":40,"stem":41},{"path":9,"title":43,"icon":44,"stem":45},{"path":10,"title":47,"icon":48,"stem":49},{"path":11,"title":66,"icon":52,"stem":53},"API-Schlüssel erstellen",{"paths":68,"docs":71},[6,7,8,9,10,11,12,14,15,69,70,17,18,19,21,22,24,25,26,27,28],"\u002Fguides\u002Fself-hosting\u002Fcomo-saber-si-tengo-cgnat","\u002Fguides\u002Fself-hosting\u002Fddns-detras-de-cgnat",[72,74,75,76,77,78],{"path":6,"title":73,"icon":32,"stem":33},"Primeros pasos",{"path":7,"title":35,"icon":36,"stem":37},{"path":8,"title":39,"icon":40,"stem":41},{"path":9,"title":43,"icon":44,"stem":45},{"path":10,"title":47,"icon":48,"stem":49},{"path":11,"title":79,"icon":52,"stem":53},"Crear clave API",{"id":81,"title":82,"body":83,"createdAt":1012,"description":1013,"extension":1014,"faq":1015,"meta":1022,"navigation":1023,"path":17,"seo":1026,"stem":1027,"updatedAt":1028,"__hash__":1029},"content_es\u002Fguides\u002Fself-hosting\u002Fexpose-docker-containers-to-the-internet.md","Exponer contenedores Docker a internet sin abrir puertos",{"type":84,"value":85,"toc":997},"minimark",[86,91,104,170,200,248,279,401,468,500,725,758,787,818,916,980,993],[87,88,90],"h1",{"id":89},"cómo-exponer-contenedores-docker-a-internet","Cómo exponer contenedores Docker a internet",[92,93,96],"guide-quick-answer",{"cta-title":94,"cta-text":95},"¿Quieres una IP pública para tu stack de Compose?","Una IPv4 y una IPv6 públicas dedicadas, enviadas a tu host de Docker por un túnel cifrado. Sin puertos publicados, sin cambios en el router y funciona detrás de CGNAT.",[97,98,99,103],"p",{},[100,101,102],"strong",{},"En resumen."," Una entrada ports: publica un contenedor en tu equipo host y no llega más allá. Hay cuatro formas de ir más lejos: una regla en tu router para abrir puertos, que requiere una IP pública real de tu proveedor de internet; Cloudflare Tunnel, para HTTP y HTTPS; Tailscale, para acceder de forma privada a tus propios dispositivos; o una IP pública dedicada enviada a tu proyecto de Docker, que admite cualquier protocolo y no necesita abrir nada en ningún sitio.",[105,106,116],"v-sheet",{"className":107,"rounded":114,"max-width":115},[108,109,110,111,112,113],"mx-auto","pa-lg-4","pa-2","mt-2","mb-4","ma-0","","1200",[117,118,121,122,121,136],"v-row",{"className":119},[120],"align-center","\n  ",[123,124,127,128,121],"v-col",{"cols":125,"md":126},12,"5","\n    ",[129,130],"v-img",{"src":131,"alt":132,"className":133,"height":135,"cover":114},"\u002Fimages\u002Fguides\u002Fdocker_containers_stacked_glowing.webp","Ilustración isométrica de cuatro contenedores de transporte de color ámbar brillante apilados sobre un pedestal oscuro, encima de un tenue patrón de placa de circuito",[134],"rounded",420,[123,137,127,139,127,152,127,159,121],{"cols":125,"md":138},"7",[97,140,142,143,147,148,151],{"style":141},"text-align: left; hyphens: none;","Tu stack de Docker Compose funciona: ejecutas ",[144,145,146],"code",{},"docker compose up -d",", abres ",[144,149,150],{},"http:\u002F\u002Flocalhost:8080"," y ahí está la aplicación. Ahora quieres poner tu proyecto en línea para compartirlo con otras personas.",[97,153,154,155,158],{"style":141},"Cuando te pones a averiguar cómo exponer contenedores Docker a internet, las cosas se complican, porque a esas alturas ya no es un problema de Docker. Tus entradas ",[144,156,157],{},"ports:"," ya han hecho todo lo que podían, y lo que se interpone entre tu stack e internet es la red de tu operador.",[97,160,163,164,169],{"className":161,"style":141},[162],"mb-0","Esta guía explica qué se interpone, las cuatro formas de sortearlo y qué cambia una IP pública dedicada en un proyecto de Compose. La referencia completa de la configuración está en la ",[165,166,168],"a",{"href":167},"\u002Fes\u002Fdocs\u002Fdocker","documentación de configuración de Docker",".",[105,171,173,178,193],{"className":172,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,175,177],"h2",{"id":176},"qué-hace-realmente-ports","Qué hace realmente ports:",[97,179,180,181,184,185,188,189,192],{},"Cuando escribes ",[144,182,183],{},"ports: \"8080:80\"",", Docker le pide al kernel del host que reenvíe el tráfico que llega al puerto 8080 del host al puerto 80 dentro del contenedor. El servicio pasa a ser accesible en la propia dirección del host: ",[144,186,187],{},"localhost:8080"," en el mismo equipo y algo como ",[144,190,191],{},"192.168.1.50:8080"," desde un portátil de la misma red.",[97,194,195,196,199],{},"Hasta ahí llega. ",[100,197,198],{},"Un puerto publicado llega al host y, a través del host, a tu red local."," No va más allá de tu router, y ningún ajuste de Compose lo cambia, porque el obstáculo no está dentro de Docker.",[105,201,203,207,230,237,240],{"className":202,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,204,206],{"id":205},"las-direcciones-privadas-y-la-traducción-que-las-oculta","Las direcciones privadas y la traducción que las oculta",[97,208,209,210,213,214,217,218,221,222,225,226,229],{},"Mira la dirección que tiene tu equipo en tu red. Si empieza por ",[144,211,212],{},"192.168."," o ",[144,215,216],{},"10.",", o está entre ",[144,219,220],{},"172.16."," y ",[144,223,224],{},"172.31.",", es una ",[100,227,228],{},"dirección privada",": un rango reservado para uso interno que ningún router de la internet pública encamina. Todos los dispositivos de tu red tienen una, y también todos los contenedores.",[97,231,232,233,236],{},"Tu router tiene la única dirección pública que te dio tu proveedor de internet y se la presta a todo lo que hay detrás mediante la ",[100,234,235],{},"traducción de direcciones de red",", o NAT. Cuando tu portátil se conecta hacia fuera, el router reescribe la dirección de origen del paquete con la suya, anota lo que ha hecho y reescribe las respuestas para que lleguen al equipo que las pidió.",[97,238,239],{},"Eso solo funciona en un sentido. Una conexión saliente crea su propia entrada en la tabla del router al salir; una conexión entrante de un desconocido llega sin ninguna entrada que coincida y sin ningún sitio al que enviarla, así que se descarta. Abrir puertos consiste en crear a mano, y por adelantado, una de esas entradas.",[97,241,242,243,247],{},"Si no sabes con seguridad qué te da tu conexión, la guía sobre ",[165,244,246],{"href":245},"\u002Fes\u002Fguides\u002Fstatic-public-ip-address\u002Fhow-to-get-a-public-ip-address","cómo conseguir una IP pública"," explica cómo comprobarlo.",[105,249,251,255,258,269,276],{"className":250,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,252,254],{"id":253},"cgnat-donde-abrir-puertos-deja-de-ser-una-opción","CGNAT, donde abrir puertos deja de ser una opción",[97,256,257],{},"Detrás del primer muro hay un segundo, y cada vez hay más gente detrás de él.",[97,259,260,261,264,265,268],{},"Muchos proveedores de internet se han quedado sin direcciones IPv4, así que hacen la misma traducción una segunda vez, un nivel más arriba. Entonces la dirección WAN de tu router también es privada, normalmente del rango ",[144,262,263],{},"100.64.0.0\u002F10",", y la dirección pública real se comparte entre ti y muchos otros clientes. Esto es el ",[100,266,267],{},"NAT de operador"," (carrier-grade NAT), o CGNAT.",[97,270,271,272,169],{},"Una regla para abrir puertos en tu propio router apunta ahora a un tráfico que nunca llega, porque el destino de una conexión entrante se decide más arriba, en equipos a los que no tienes acceso. Puedes confirmar en qué situación estás, y ver qué proveedores lo hacen, en la guía sobre ",[165,273,275],{"href":274},"\u002Fes\u002Fguides\u002Fself-hosting\u002Fself-hosting-behind-carrier-grade-nat-cgnat","cómo alojar tus propios servicios detrás de CGNAT",[97,277,278],{},"Para un stack de Compose merece la pena considerar cuatro enfoques, y todo lo que sobrevive al CGNAT lo hace por un mismo motivo: se basa en una conexión que tu equipo establece hacia fuera.",[105,280,282,286,394],{"className":281,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,283,285],{"id":284},"las-cuatro-opciones-comparadas","Las cuatro opciones, comparadas",[287,288,290],"div",{"style":289},"overflow-x: auto;",[291,292,293,318],"table",{},[294,295,296],"thead",{},[297,298,299,303,306,309,312,315],"tr",{},[300,301,302],"th",{},"Método",[300,304,305],{},"Funciona detrás de CGNAT",[300,307,308],{},"Protocolos",[300,310,311],{},"Quién termina el TLS",[300,313,314],{},"Cambios en el router",[300,316,317],{},"Dirección por la que te llegan",[319,320,321,342,360,378],"tbody",{},[297,322,323,327,330,333,336,339],{},[324,325,326],"td",{},"Abrir puertos en el router",[324,328,329],{},"No",[324,331,332],{},"Cualquiera sobre TCP o UDP",[324,334,335],{},"Tu propio servicio",[324,337,338],{},"Sí",[324,340,341],{},"La de tu proveedor, que suele cambiar",[297,343,344,347,349,352,355,357],{},[324,345,346],{},"Cloudflare Tunnel",[324,348,338],{},[324,350,351],{},"HTTP y HTTPS",[324,353,354],{},"Cloudflare",[324,356,329],{},[324,358,359],{},"El espacio compartido de Cloudflare",[297,361,362,365,367,370,373,375],{},[324,363,364],{},"Tailscale",[324,366,338],{},[324,368,369],{},"Cualquiera, pero solo en privado",[324,371,372],{},"De extremo a extremo dentro de tu tailnet",[324,374,329],{},[324,376,377],{},"Una dirección privada de la tailnet",[297,379,380,383,385,387,389,391],{},[324,381,382],{},"IP pública dedicada",[324,384,338],{},[324,386,332],{},[324,388,335],{},[324,390,329],{},[324,392,393],{},"Una IPv4 pública que es tuya",[97,395,396,397,169],{},"Las dos primeras columnas deciden la mayoría de los casos. Con una IP pública real y un puerto sin bloquear, abrir puertos es gratis y difícil de superar; si todo lo que ejecutas habla HTTP, el túnel de Cloudflare es gratis y hace muy bien ese trabajo. Hay una comparación más a fondo en ",[165,398,400],{"href":399},"\u002Fes\u002Fguides\u002Fself-hosting\u002Fgetpublicip-vs-cloudflare-tunnel-vs-tailscale","GetPublicIP vs Cloudflare Tunnel vs Tailscale",[105,402,404,408],{"className":403,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,405,407],{"id":406},"las-cuatro-opciones-en-detalle","Las cuatro opciones en detalle",[117,409,121,410,121,433,121,444,121,456],{},[123,411,127,413,127,418,127,422,121],{"cols":125,"md":412},"6",[414,415,326],"h3",{"style":416,"id":417},"font-size: 1.3rem !important; margin: 0 0 0.4rem !important;","abrir-puertos-en-el-router",[97,419,421],{"style":420},"color: #ffb74d; font-weight: 600; font-size: 0.95rem; text-align: left; margin-bottom: 0.5rem;","Cualquier protocolo, si tu proveedor de internet te da una IP pública real.",[97,423,424,425,427,428,432],{"style":141},"Asigna una dirección fija al host de Docker, publica el puerto del contenedor con una entrada ",[144,426,157],{}," y añade en el router una regla que envíe a ese host el tráfico entrante de un puerto que elijas. No cuesta nada, siempre que tu proveedor no te haya puesto detrás de CGNAT ni bloquee el puerto que necesitas; el 25 para el correo y el 80 para HTTP son las víctimas habituales. Además, las direcciones residenciales cambian cada cierto tiempo. Si una regla no se comporta como debería, la ",[165,429,431],{"href":430},"\u002Fes\u002Fguides\u002Fself-hosting\u002Fport-forwarding-not-working","guía para solucionar problemas al abrir puertos"," repasa en orden las causas habituales.",[123,434,127,435,127,438,127,441,121],{"cols":125,"md":412},[414,436,346],{"style":416,"id":437},"cloudflare-tunnel",[97,439,440],{"style":420},"HTTP y HTTPS, con Cloudflare terminando tu TLS.",[97,442,443],{"style":141},"Un pequeño daemon, que puede ejecutarse como un contenedor más del mismo proyecto de Compose, establece una conexión saliente con la red de Cloudflare y la mantiene abierta. Como esa conexión es saliente, el CGNAT no es un problema y tu router no necesita nada. Es gratis, está bien documentado y, para una aplicación web autoalojada, es una respuesta realmente buena. Antes de decidirte, conviene conocer sus límites: un servidor de juegos, un servidor de correo, un resolvedor DNS o cualquier cosa que hable TCP o UDP sin más quedan fuera de su alcance; Cloudflare descifra tu tráfico en su red perimetral y lo vuelve a cifrar de camino a ti, y se llega a ti a través de un espacio de direcciones compartido, así que no hay ningún registro de DNS inverso que configurar.",[123,445,127,446,127,450,127,453,121],{"cols":125,"md":412},[414,447,449],{"style":416,"id":448},"tailscale-y-otras-vpn-malladas","Tailscale y otras VPN malladas",[97,451,452],{"style":420},"Tus propios dispositivos, desde cualquier lugar. No es alojamiento público.",[97,454,455],{"style":141},"Tailscale crea una red privada con tus propios dispositivos. Instálalo en el host de Docker, en tu portátil y en tu teléfono, inicia sesión con la misma cuenta en cada uno y podrán comunicarse entre sí sin importar el NAT o el CGNAT. Para acceder a tus propios servicios cuando estás fuera de casa, es lo que menos trabajo da de todo lo que aparece aquí. Eso sí, solo pueden conectarse los dispositivos que hayas dado de alta, y esa es precisamente la idea del diseño: un visitante que nunca ha oído hablar de ti no puede llegar a tu tailnet, así que las webs, los servidores de juegos y todo lo demás pensado para otras personas quedan fuera de lo que pretende hacer.",[123,457,127,458,127,462,127,465,121],{"cols":125,"md":412},[414,459,461],{"style":416,"id":460},"una-dirección-ip-pública-dedicada","Una dirección IP pública dedicada",[97,463,464],{"style":420},"Cualquier protocolo, en una dirección que te pertenece.",[97,466,467],{"style":141},"En lugar de llegar a tu stack a través de la infraestructura de otro, recibes una dirección IPv4 pública propia, enrutada hasta tu equipo. El túnel es una conexión saliente, así que el CGNAT y la configuración del router dejan de importar. Lo que llega al otro extremo son paquetes normales en una dirección pública normal: del protocolo que sean, en el puerto que hayas decidido redirigir, sin que nada los inspeccione ni los reescriba por el camino.",[105,469,471,475,481,487,493],{"className":470,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,472,474],{"id":473},"cuál-encaja-con-lo-que-ejecutas","Cuál encaja con lo que ejecutas",[97,476,477,480],{},[100,478,479],{},"Una aplicación web y nada más."," Cloudflare Tunnel, a menos que quieras algo de privacidad y un verdadero cifrado de extremo a extremo.",[97,482,483,486],{},[100,484,485],{},"Solo tus propios dispositivos necesitan acceso."," Tailscale. No hace falta que exista nada público.",[97,488,489,492],{},[100,490,491],{},"Cualquier cosa que no sea HTTP,"," o CGNAT y algo más que tráfico web. Abrir puertos si tu conexión lo permite; si no, una IP pública dedicada.",[97,494,495,496,169],{},"Si tu stack no está en Docker, sirven las mismas cuatro opciones, y se explican en ",[165,497,499],{"href":498},"\u002Fes\u002Fguides\u002Fself-hosting\u002Fexpose-home-server-to-internet","cómo acceder a tu servidor en casa desde internet",[105,501,503,507,536],{"className":502,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,504,506],{"id":505},"cómo-queda-en-un-archivo-de-compose","Cómo queda en un archivo de Compose",[117,508,121,511,121,528],{"className":509},[120,510],"mb-2",[123,512,127,513,127,517,127,524,121],{"cols":125,"md":138},[97,514,516],{"className":515,"style":141},[162],"El agente es un servicio más junto a los que ya ejecutas. Se une a la misma red que tus otros contenedores, mantiene el túnel abierto y redirige los puertos que indiques a los servicios que nombres.",[97,518,520,521,169],{"className":519,"style":141},[162],"Dos puertos de tu dirección pública, enviados al servicio `web` por su nombre. La sintaxis de las redirecciones también admite UDP, IPv6, doble pila y destinos fuera del proyecto de Compose; esa referencia, con un ejemplo completo, está en la ",[165,522,523],{"href":167},"página de configuración de Docker",[97,525,527],{"className":526,"style":141},[162],"Tus propios servicios no se tocan. El `web` de arriba es lo que ya tuvieras en marcha, sin variables de entorno nuevas, sin etiquetas y sin enterarse de nada de lo que está pasando.",[123,529,127,530,121],{"cols":125,"md":126},[129,531],{"src":532,"alt":533,"className":534,"height":535,"cover":114},"\u002Fimages\u002Fguides\u002Fdocker_compose_adding_one_container.webp","Ilustración isométrica de una grúa pórtico que baja un contenedor de transporte de color ámbar brillante sobre una fila de contenedores grises en una plataforma oscura",[134],260,[537,538,542],"pre",{"className":539,"code":540,"language":541,"meta":114,"style":114},"language-yaml shiki shiki-themes monokai","services:\n  web:\n    image: nginx:alpine\n    restart: unless-stopped\n\n  getpublicip:\n    image: ghcr.io\u002Fgetpublicip\u002Fgetpublicip:latest\n    restart: unless-stopped\n    environment:\n      GETPUBLICIP_API_KEY: \"${GETPUBLICIP_API_KEY}\"\n      GETPUBLICIP_MAPPINGS: \"80\u002Ftcp->web:80; 443\u002Ftcp->web:443\"\n    cap_add:\n      - NET_ADMIN\n    devices:\n      - \u002Fdev\u002Fnet\u002Ftun\n    sysctls:\n      net.ipv4.ip_forward: 1\n      net.ipv4.conf.all.src_valid_mark: 1\n      net.ipv6.conf.all.forwarding: 1\n","yaml",[144,543,544,557,565,578,589,596,604,614,623,631,642,653,660,669,677,685,693,705,715],{"__ignoreMap":114},[545,546,549,553],"span",{"class":547,"line":548},"line",1,[545,550,552],{"class":551},"s8I7P","services",[545,554,556],{"class":555},"sCdxs",":\n",[545,558,560,563],{"class":547,"line":559},2,[545,561,562],{"class":551},"  web",[545,564,556],{"class":555},[545,566,568,571,574],{"class":547,"line":567},3,[545,569,570],{"class":551},"    image",[545,572,573],{"class":555},": ",[545,575,577],{"class":576},"s_Ekj","nginx:alpine\n",[545,579,581,584,586],{"class":547,"line":580},4,[545,582,583],{"class":551},"    restart",[545,585,573],{"class":555},[545,587,588],{"class":576},"unless-stopped\n",[545,590,592],{"class":547,"line":591},5,[545,593,595],{"emptyLinePlaceholder":594},true,"\n",[545,597,599,602],{"class":547,"line":598},6,[545,600,601],{"class":551},"  getpublicip",[545,603,556],{"class":555},[545,605,607,609,611],{"class":547,"line":606},7,[545,608,570],{"class":551},[545,610,573],{"class":555},[545,612,613],{"class":576},"ghcr.io\u002Fgetpublicip\u002Fgetpublicip:latest\n",[545,615,617,619,621],{"class":547,"line":616},8,[545,618,583],{"class":551},[545,620,573],{"class":555},[545,622,588],{"class":576},[545,624,626,629],{"class":547,"line":625},9,[545,627,628],{"class":551},"    environment",[545,630,556],{"class":555},[545,632,634,637,639],{"class":547,"line":633},10,[545,635,636],{"class":551},"      GETPUBLICIP_API_KEY",[545,638,573],{"class":555},[545,640,641],{"class":576},"\"${GETPUBLICIP_API_KEY}\"\n",[545,643,645,648,650],{"class":547,"line":644},11,[545,646,647],{"class":551},"      GETPUBLICIP_MAPPINGS",[545,649,573],{"class":555},[545,651,652],{"class":576},"\"80\u002Ftcp->web:80; 443\u002Ftcp->web:443\"\n",[545,654,655,658],{"class":547,"line":125},[545,656,657],{"class":551},"    cap_add",[545,659,556],{"class":555},[545,661,663,666],{"class":547,"line":662},13,[545,664,665],{"class":555},"      - ",[545,667,668],{"class":576},"NET_ADMIN\n",[545,670,672,675],{"class":547,"line":671},14,[545,673,674],{"class":551},"    devices",[545,676,556],{"class":555},[545,678,680,682],{"class":547,"line":679},15,[545,681,665],{"class":555},[545,683,684],{"class":576},"\u002Fdev\u002Fnet\u002Ftun\n",[545,686,688,691],{"class":547,"line":687},16,[545,689,690],{"class":551},"    sysctls",[545,692,556],{"class":555},[545,694,696,699,701],{"class":547,"line":695},17,[545,697,698],{"class":551},"      net.ipv4.ip_forward",[545,700,573],{"class":555},[545,702,704],{"class":703},"s7s5_","1\n",[545,706,708,711,713],{"class":547,"line":707},18,[545,709,710],{"class":551},"      net.ipv4.conf.all.src_valid_mark",[545,712,573],{"class":555},[545,714,704],{"class":703},[545,716,718,721,723],{"class":547,"line":717},19,[545,719,720],{"class":551},"      net.ipv6.conf.all.forwarding",[545,722,573],{"class":555},[545,724,704],{"class":703},[105,726,728,732,739,746,755],{"className":727,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,729,731],{"id":730},"por-qué-no-hay-entradas-ports","Por qué no hay entradas ports:",[97,733,734,735,738],{},"Vuelve a mirar ",[144,736,737],{},"web"," en ese archivo. No publica nada. En una guía sobre cómo exponer contenedores, esa es la parte en la que merece la pena detenerse.",[97,740,741,742,745],{},"El tráfico dirigido a tu dirección pública llega dentro del contenedor del agente, por la interfaz del túnel. Después, el agente aplica una regla de ",[100,743,744],{},"NAT de destino",": el mismo tipo de regla que aplica tu router cuando abres un puerto, solo que se ejecuta dentro del contenedor y no en el borde de tu red. Reescribe el destino del paquete, de la dirección pública a la dirección del contenedor en la red de Compose, y lo deja pasar.",[97,747,748,749,751,752,754],{},"En ese camino no interviene ningún puerto publicado en el host. El puerto está abierto en tu dirección IPv4 pública, no en tu host ni en tu router, así que no hay nada nuevo a la escucha que pueda encontrar un escaneo de la conexión de tu casa. Añadir una entrada ",[144,750,157],{}," a ",[144,753,737],{}," solo lo publicaría también en tu red local, que normalmente es justo lo contrario de lo que pretendías.",[97,756,757],{},"Los destinos se escriben como nombres de servicio y no como direcciones, porque Compose asigna las direcciones de los contenedores como le parece. De forma predeterminada, el agente vuelve a comprobar esos nombres cada 30 segundos, así que un contenedor que se reinicia con otra dirección sigue funcionando.",[105,759,761,765,776],{"className":760,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,762,764],{"id":763},"qué-necesita-el-contenedor-y-qué-no","Qué necesita el contenedor y qué no",[97,766,767,768,771,772,775],{},"Tres cosas, todas visibles arriba: la capacidad ",[144,769,770],{},"NET_ADMIN",", para poder configurar la interfaz del túnel y las reglas de reenvío; el dispositivo ",[144,773,774],{},"\u002Fdev\u002Fnet\u002Ftun",", que es el propio túnel; y los sysctls de reenvío, para que el tráfico que llega por el túnel pueda pasar a otro contenedor.",[97,777,778,779,782,783,786],{},"No necesita ",[144,780,781],{},"privileged: true",". Si encuentras una configuración que lo pide, se está sorteando algún problema en lugar de configurar las cosas bien. Tampoco necesita el módulo de WireGuard del kernel: la imagen lo usa cuando el kernel lo ofrece y, si no, recurre al ",[144,784,785],{},"wireguard-go"," en espacio de usuario que incluye.",[105,788,790,794,800,806,812],{"className":789,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,791,793],{"id":792},"lo-que-obtienes-y-los-túneles-no-te-dan","Lo que obtienes y los túneles no te dan",[97,795,796,799],{},[100,797,798],{},"Cualquier protocolo, no solo HTTP."," El reenvío se hace a nivel de paquete, así que lo que circule por él es cosa tuya. Un servidor de Minecraft por UDP, un servidor de correo en los puertos 25 y 587, SSH: cada uno es el mismo tipo de redirección que un servidor web.",[97,801,802,805],{},[100,803,804],{},"Una dirección que es tuya."," No un nombre de host en una infraestructura compartida. Sigue siendo tuya si trasladas el stack a otro equipo, a otro proveedor o a otro país, así que los registros DNS que apuntan a ella sobreviven al traslado.",[97,807,808,811],{},[100,809,810],{},"DNS inverso."," Como la dirección está asignada a ti, se le puede configurar un registro PTR. La entregabilidad del correo depende por completo de ello, y por eso los servidores de correo quedan fuera del alcance de los otros enfoques.",[97,813,814,817],{},[100,815,816],{},"Tu TLS sigue siendo tuyo."," GetPublicIP reenvía paquetes y nunca termina el TLS, así que en nuestro lado no se guarda ningún certificado ni ninguna clave. La sesión se negocia entre tu visitante y el contenedor tuyo que la termine, y se descifra por primera vez ahí. Ese servicio necesita su propio certificado válido, como en cualquier host público.",[105,819,821,825],{"className":820,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,822,824],{"id":823},"detalles-que-suelen-dar-problemas","Detalles que suelen dar problemas",[117,826,121,827,121,842,121,852,121,866,121,884,121,906],{},[123,828,127,829,127,834,121],{"cols":125,"md":412},[414,830,833],{"style":831,"id":832},"font-size: 1.3rem !important; margin: 0 0 0.5rem !important;","una-clave-api-controla-un-solo-túnel","Una clave API controla un solo túnel",[97,835,837,838,169],{"className":836,"style":141},[162],"Una clave de WireGuard pertenece a un único extremo, así que dos contenedores iniciados con la misma clave API se van desconectando el uno al otro, y siempre gana el que haya completado el handshake más reciente. Se manifiesta como fallos intermitentes y no como un error claro, con una señal fiable: los dos contenedores se reinician una y otra vez, porque cada uno sigue concluyendo que el averiado es él. Crea una clave distinta para cada túnel, como se explica en la ",[165,839,841],{"href":840},"\u002Fes\u002Fdocs\u002Fcreate-api-key","página sobre la clave API",[123,843,127,844,127,848,121],{"cols":125,"md":412},[414,845,847],{"style":831,"id":846},"restart-unless-stopped-no-es-opcional","restart: unless-stopped no es opcional",[97,849,851],{"className":850,"style":141},[162],"La mayoría de las interrupciones se resuelven solas. Ante los fallos más raros, que una reconexión no puede arreglar, el agente se cierra a propósito en lugar de reparar sobre la marcha un túnel a medio romper, y cuenta con que Docker lo vuelva a iniciar. Sin una política de reinicio, se detiene y se queda detenido.",[123,853,127,854,127,858,121],{"cols":125,"md":412},[414,855,857],{"style":831,"id":856},"ipv6-hay-que-activarlo-en-la-red","IPv6 hay que activarlo en la red",[97,859,861,862,865],{"className":860,"style":141},[162],"Las redes bridge de Docker solo transportan IPv4 salvo que se indique lo contrario, así que un contenedor en una red predeterminada no tiene ninguna dirección IPv6 a la que reenviar el tráfico. Configura ",[144,863,864],{},"enable_ipv6: true"," y una subred IPv6 antes de añadir redirecciones IPv6.",[123,867,127,868,127,872,121],{"cols":125,"md":412},[414,869,871],{"style":831,"id":870},"windows-necesita-un-kernel-66-de-wsl2","Windows necesita un kernel 6.6 de WSL2",[97,873,875,876,879,880,883],{"className":874,"style":141},[162],"Docker Desktop ejecuta los contenedores en una máquina virtual de WSL2, y el túnel necesita un módulo de netfilter que el kernel 5.15 no incluye. ",[144,877,878],{},"wsl --version"," te dice cuál tienes y ",[144,881,882],{},"wsl --update"," te lleva a una versión más reciente.",[123,885,127,886,127,890,121],{"cols":125,"md":412},[414,887,889],{"style":831,"id":888},"tus-contenedores-ven-al-agente-no-al-visitante","Tus contenedores ven al agente, no al visitante",[97,891,893,894,897,898,901,902,905],{"className":892,"style":141},[162],"De forma predeterminada, la dirección de origen del tráfico entrante se reescribe con la del propio agente, así que todos los visitantes aparecen en tus registros con la misma dirección local. Eso importa para la geolocalización, la limitación de peticiones y ",[144,895,896],{},"fail2ban",". ",[144,899,900],{},"GETPUBLICIP_PRESERVE_CLIENT_IP"," desactiva esa reescritura y requiere, además, un cambio de ruta en cada servicio de destino: en cuanto las respuestas van dirigidas a clientes reales de internet, es la ruta predeterminada del servicio la que decide adónde van, y no su propia subred. La ",[165,903,904],{"href":167},"documentación de Docker"," lo explica; con el ajuste por sí solo te queda un servicio que se cuelga mientras los registros siguen pareciendo correctos.",[123,907,127,908,127,912,121],{"cols":125,"md":412},[414,909,911],{"style":831,"id":910},"http-sin-cifrar-sigue-sin-cifrar","HTTP sin cifrar sigue sin cifrar",[97,913,915],{"className":914,"style":141},[162],"El túnel cifra el tramo entre nuestra red perimetral y tu equipo. No hace nada por el tramo entre tu visitante y la dirección pública, que es internet. Sirve HTTPS desde tu propio contenedor.",[105,917,919,923,935,944,953,962,971],{"className":918,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,920,922],{"id":921},"preguntas-frecuentes","Preguntas frecuentes",[924,925,928,932],"details",{"className":926},[927],"faq-item",[929,930,931],"summary",{},"¿Cómo expongo un contenedor Docker a internet?",[97,933,934],{},"Hay cuatro opciones prácticas. Abrir puertos en el router funciona si tu proveedor de internet te da una IP pública real y no bloquea el puerto. Cloudflare Tunnel publica HTTP y HTTPS a través de una conexión saliente. Tailscale conecta tus propios dispositivos de forma privada. Una IP pública dedicada envía una dirección IPv4 real a tu stack a través de un túnel WireGuard y admite cualquier protocolo sin abrir nada en tu router.",[924,936,938,941],{"className":937},[927],[929,939,940],{},"¿Puede un contenedor Docker tener su propia IP pública?",[97,942,943],{},"No con la dirección de tu proveedor de internet, que tu router tiene en nombre de todo lo que hay detrás. Lo que sí puedes hacer es que una dirección IPv4 pública propia llegue a tu equipo a través de un túnel WireGuard y, desde ella, redirigir puertos concretos a los contenedores por su nombre de servicio. La dirección es tuya, no de un contenedor concreto.",[924,945,947,950],{"className":946},[927],[929,948,949],{},"¿Puedo exponer un servicio de Docker Compose sin abrir puertos?",[97,951,952],{},"Sí. Un túnel llega a tu stack a través de una conexión que tu equipo establece hacia fuera, así que no hay ningún puerto entrante que abrir ni nada que cambiar en el router. Con GetPublicIP, los servicios expuestos tampoco necesitan puertos publicados, porque el tráfico llega por la interfaz del túnel y no por un puerto publicado en el host.",[924,954,956,959],{"className":955},[927],[929,957,958],{},"¿Cómo expongo contenedores Docker si mi proveedor de internet usa CGNAT?",[97,960,961],{},"Con el carrier-grade NAT, tu router recibe una dirección privada en lugar de una pública, así que ninguna regla que añadas en casa sirve de nada. Todo lo que funciona se basa en una conexión saliente desde tu equipo: Cloudflare Tunnel para HTTP y HTTPS, Tailscale para el acceso privado entre tus propios dispositivos y una IP pública dedicada para cualquier protocolo.",[924,963,965,968],{"className":964},[927],[929,966,967],{},"¿El contenedor de GetPublicIP necesita el modo privilegiado?",[97,969,970],{},"No. Necesita la capacidad NET_ADMIN, el dispositivo \u002Fdev\u002Fnet\u002Ftun y los sysctls de reenvío, y nada más. Tampoco necesita el módulo de WireGuard del kernel en el host, porque la imagen recurre a la implementación en espacio de usuario wireguard-go cuando el módulo del kernel no está disponible.",[924,972,974,977],{"className":973},[927],[929,975,976],{},"¿Funciona en Windows y macOS?",[97,978,979],{},"Sí, con Docker Desktop, y el archivo de Compose es el mismo en las tres plataformas. En macOS y Windows tus contenedores se ejecutan dentro de una máquina virtual Linux, así que el dispositivo del túnel lo proporciona esa máquina virtual. En Windows, comprueba la versión del kernel de WSL2: a la 5.15 le falta un módulo de netfilter que el túnel necesita, y la 6.6 lo incluye.",[105,981,983,987],{"className":982,"rounded":114,"max-width":115},[108,109,110,111,112,113],[174,984,986],{"id":985},"siguientes-pasos","Siguientes pasos",[97,988,989,990,992],{},"Si una IP pública dedicada encaja con lo que ejecutas, la ",[165,991,168],{"href":167}," tiene la referencia completa: toda la sintaxis de las redirecciones, un ejemplo que funciona, IPv6, el reenvío a un servicio del host de Docker y las notas para cada plataforma.",[994,995,996],"style",{},"html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":114,"searchDepth":559,"depth":559,"links":998},[999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011],{"id":176,"depth":559,"text":177},{"id":205,"depth":559,"text":206},{"id":253,"depth":559,"text":254},{"id":284,"depth":559,"text":285},{"id":406,"depth":559,"text":407},{"id":473,"depth":559,"text":474},{"id":505,"depth":559,"text":506},{"id":730,"depth":559,"text":731},{"id":763,"depth":559,"text":764},{"id":792,"depth":559,"text":793},{"id":823,"depth":559,"text":824},{"id":921,"depth":559,"text":922},{"id":985,"depth":559,"text":986},"2026-09-15","Cómo exponer contenedores Docker a internet sin abrir puertos en el router. Compara Cloudflare Tunnel, Tailscale y una IP pública dedicada para Docker Compose.","md",[1016,1017,1018,1019,1020,1021],{"question":931,"answer":934},{"question":940,"answer":943},{"question":949,"answer":952},{"question":958,"answer":961},{"question":967,"answer":970},{"question":976,"answer":979},{},{"title":1024,"icon":48,"description":1025},"Exponer contenedores Docker a internet","Cuatro formas de hacer accesible desde internet un stack de Docker Compose, y por qué una IP pública dedicada no necesita ningún puerto publicado.",{"title":82,"description":1013},"guides\u002Fself-hosting\u002Fexpose-docker-containers-to-the-internet","2026-10-13","pkPN2VQABgNT9dcn1U4OWDTwBZOJcESVJSYJOTDlsGg",[1031,1046,1088,1103],{"path":15,"title":1032,"icon":1033,"children":1034},"Cuál es mi IP pública","mdi-folder",[1035,1041],{"path":12,"title":1036,"navigation":1037},"Cómo ver mi IP pública en Linux: un comando curl (2026)",{"title":1038,"icon":1039,"description":1040},"Cómo ver tu IP en Linux","mdi-penguin","Averigua tu IP pública y tu IP local en Linux con curl, wget, dig y las herramientas del sistema.",{"path":14,"title":1042,"navigation":1043},"Cómo saber mi IP en Windows (CMD y PowerShell)",{"title":1044,"icon":44,"description":1045},"Cómo ver tu IP en Windows","Averigua tu IP pública y tu IP local en Windows con PowerShell y el símbolo del sistema.",{"path":1047,"title":1048,"icon":1033,"children":1049},"\u002Fguides\u002Fself-hosting","Servidor propio",[1050,1056,1062,1064,1070,1076,1082],{"path":69,"title":1051,"navigation":1052},"¿Cómo saber si tengo CGNAT? 3 formas de comprobarlo",{"title":1053,"icon":1054,"description":1055},"¿Cómo saber si tengo CGNAT?","mdi-help-network-outline","Qué es CGNAT, tres formas de comprobar si tu operador lo usa y las opciones para salir de CGNAT y volver a tener una IP pública.",{"path":70,"title":1057,"navigation":1058},"DNS dinámico (DDNS) detrás de CGNAT: por qué no funciona",{"title":1059,"icon":1060,"description":1061},"DDNS detrás de CGNAT","mdi-dns-outline","Por qué el DNS dinámico (DuckDNS, No-IP o el del router) no sirve detrás de CGNAT, cuándo funciona con IPv6 y qué alternativas tienes.",{"path":17,"title":82,"navigation":1063},{"title":1024,"icon":48,"description":1025},{"path":18,"title":1065,"navigation":1066},"Acceder a tu servidor en casa desde internet: 5 métodos",{"title":1067,"icon":1068,"description":1069},"Acceder a tu servidor en casa desde internet","mdi-server-network","Cinco métodos realistas para que tu servidor en casa sea accesible desde internet, desde abrir puertos hasta una IP pública dedicada.",{"path":19,"title":1071,"navigation":1072},"GetPublicIP vs Cloudflare Tunnel vs Tailscale: comparativa",{"title":1073,"icon":1074,"description":1075},"GetPublicIP vs Cloudflare vs Tailscale","mdi-compare","Compara GetPublicIP, Cloudflare Tunnel y Tailscale para alojar tus propios servidores en casa o en la oficina.",{"path":21,"title":1077,"navigation":1078},"¿No puedes abrir puertos del router? 6 causas (2026)",{"title":1079,"icon":1080,"description":1081},"¿No puedes abrir puertos?","mdi-lan-disconnect","Diagnostica las 6 razones más comunes por las que abrir puertos falla y aprende a solucionar cada una, incluido el problema oculto del CGNAT.",{"path":22,"title":1083,"navigation":1084},"CGNAT: qué es y cómo tener un servidor en casa (2026)",{"title":1085,"icon":1086,"description":1087},"¿Qué es CGNAT?","mdi-lan-pending","Qué es CGNAT, cómo saber si estás detrás de él, qué operadores lo usan y cómo alojar tus propios servicios con una IP pública real saltándote el CGNAT.",{"path":26,"title":1089,"icon":1033,"children":1090},"IP pública fija",[1091,1097],{"path":24,"title":1092,"navigation":1093},"Cómo conseguir una IP pública (4 métodos, 2026)",{"title":1094,"icon":1095,"description":1096},"Cómo conseguir una IP pública","mdi-earth","Qué es una IP pública, cómo ver la tuya y 4 formas de conseguir una IP pública dedicada para alojar tus servicios.",{"path":25,"title":1098,"navigation":1099},"Cómo conseguir una IP fija (IP estática) para tu servidor",{"title":1100,"icon":1101,"description":1102},"Cómo conseguir una IP fija","mdi-ip-network","Qué es una IP fija, qué opciones tienes para conseguir una y cuál es la mejor forma de obtenerla.",{"path":1104,"title":1105,"icon":1033,"children":1106},"\u002Fguides\u002Fuse-cases","Casos de uso",[1107,1113],{"path":27,"title":1108,"navigation":1109},"Tu propio servidor en casa: privacidad e independencia",{"title":1110,"icon":1111,"description":1112},"Soluciones para servidores en casa","mdi-home-account","Crea tu propia nube personal y soberana. Recibe una dirección IP pública en tu servidor de casa para tener tus propios servicios de correo y chat.",{"path":28,"title":1114,"navigation":1115},"Servidor en la oficina: soluciones y ventajas",{"title":1116,"icon":1068,"description":1117},"Soluciones para servidores en la oficina","Descubre por qué las empresas con visión de futuro vuelven a llevar ciertas cargas de trabajo a la oficina para reducir el gasto en la nube y ganar agilidad.",1793914061115]