{"id":5177,"date":"2022-12-29T09:30:31","date_gmt":"2022-12-29T08:30:31","guid":{"rendered":"https:\/\/bitacora.eniac2000.com\/?p=5177"},"modified":"2022-12-29T09:30:31","modified_gmt":"2022-12-29T08:30:31","slug":"uso-de-un-servidor-publico-y-zerotier-para-publicar-servicios-hacia-internet-desde-una-red-con-cg-nat","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=5177","title":{"rendered":"Uso de un servidor p\u00fablico y ZeroTier para publicar servicios hacia Internet desde una red con CG-NAT"},"content":{"rendered":"<p>Desde hace algunos d\u00edas vengo experimentando problemas con mi conexi\u00f3n dom\u00e9stica a Internet. Esto es un problema bastante molesto para m\u00ed, porque hago uso de una serie de servicios en un servidor casero que publico hacia el exterior. El principal de ellos es este sitio web, pero hay algunos adicionales, como algunos servicios de dom\u00f3tica y una conexi\u00f3n VPN para acceder de manera segura desde el exterior. Hasta ahora, ven\u00eda public\u00e1ndolo todo de manera directa, ya que dispon\u00eda de una IPv4 con mi conexi\u00f3n, pero desde la semana pasada han pasado a darme acceso a Internet detr\u00e1s de un CG-NAT. Esto implica que ya no dispongo de una IPv4 propia, sino que salgo a trav\u00e9s de una NAT del operador, por lo que no es posible acceder de manera remota a dichos servicios.<\/p>\n<p>Mientras me lo solucionan, he optado por poner en pie un mecanismo para poder seguir publicando servicios, basado en el uso de un peque\u00f1o servidor p\u00fablico que se encarga de redireccionar los servicios hacia mi sistema detr\u00e1s del CG-NAT. Y para ello, hago uso de una plataforma que permite establecer redes securizadas mediante una combinaci\u00f3n de SG-NAT y VPN, llamada <a href=\"https:\/\/www.zerotier.com\/\" target=\"_blank\">ZeroTier<\/a>. La gracia de ZeroTier es que el entorno funciona como un concentrador de VPNs, de tal manera que entre los clientes que necesitemos conectar se establece una red privada, con lo que es posible dotar de conectividad entre ellos a los mismos, tan s\u00f3lo instalando un agente del propio ZeroTier entre ellos, y establecer la visibilidad oportuna entre nodos. Haciendo que el servidor publicado en Internet sea uno de los nodos, puedo proporcionar servicios utiliz\u00e1ndolo de pasarela p\u00fablica.<\/p>\n<p>La segunda pata del asunto es conseguir este servidor frontal p\u00fablico, y hacer que funcione de pasarela. En mi caso, he optado por hacer uso de <a href=\"https:\/\/www.oracle.com\/es\/cloud\/\" target=\"_blank\">Oracle Cloud Infrastructure<\/a>, donde se puede desplegar de manera gratuita un servidor basado en Linux. Y una vez que me he hecho con este servidor, he montado la pasarela con un servidor <a href=\"https:\/\/www.nginx.com\/\" target=\"_blank\">NGINX<\/a>, debido a que me permite redireccionar tanto servicios publicados por TCP (mi servidor web y mi servidor MQTT) como UDP (mi servidor VPN), con lo que me ahorro tener que andar instalando y gestionando servicios duplicados en este frontal. Sencillo y eficiente. El diagrama general de c\u00f3mo ha quedado el entorno es el siguiente:<\/p>\n<figure id=\"attachment_5178\" aria-describedby=\"caption-attachment-5178\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2022\/12\/oracle+zerotier.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2022\/12\/oracle+zerotier-400x269.png\" alt=\"Configuraci\u00f3n de acceso remoto con ZeroTier y Oracle Cloud\" title=\"Configuraci\u00f3n de acceso remoto con ZeroTier y Oracle Cloud\" width=\"400\" height=\"269\" class=\"size-medium wp-image-5178\" \/><\/a><figcaption id=\"caption-attachment-5178\" class=\"wp-caption-text\">Configuraci\u00f3n de acceso remoto con ZeroTier y Oracle Cloud<\/figcaption><\/figure>\n<p>La configuraci\u00f3n a nivel interno s\u00ed que tiene algunos puntos a tener en cuenta:<\/p>\n<ul>\n<li>El primero de ellos es relativo a la instalaci\u00f3n de ZeroTier. \u00c9sta es bastante sencilla, se trata de descargar el cliente VPN que proporciona el propio proveedor. A nivel Linux se instala con un simple wget desde la plataforma, y el despliegue se basa en indicarle la red privada que hemos registrado en la misma, y los propios nodos se a\u00f1aden a ella. El registro en la plataforma es gratuito para redes de hasta 25 nodos, y tambi\u00e9n permite desplegar sistemas autogestionados para entornos profesionales. Una vez a\u00f1adidos los nodos, es preciso darles permiso para conectarse a la red privada que hemos creado al registrarnos. Una vez hecho, podr\u00e1n verse entre ellos. A nivel de sistema operativo, esta conexi\u00f3n aparece como una nueva IP virtual, vinculada a la conexi\u00f3n VPN establecida con ZeroTier. En mi caso, lo he desplegado en dos sitios: el servidor VPS que he creado en Oracle Cloud, y en el servidor que hace de frontal web para las conexiones entrantes a mis sistemas, que act\u00faa de <a href=\"https:\/\/bitacora.eniac2000.com\/?p=4416\" target=\"_blank\">proxy inverso para el resto de servidores<\/a>.<\/li>\n<li>El segundo es el relativo al NGINX en el VPN de Oracle Cloud. Como comentaba, he optado por utilizar NGINX como frontal para publicar servicios. Dado que publico servicios HTTP y HTTPS, no ten\u00eda ganas de andar gestionando el tema de un proxy inverso convencional, teniendo que duplicar certificados y gestionar las redirecciones entre ellos. En este caso, he optado por realizar una simple redirecci\u00f3n mediante el uso de la directiva <em>stream<\/em> en nginx.conf, que viene a funcionar como un balanceador de carga, estilo F5 o HAProxy. La idea es que puedes definir un servicio <em>upstream<\/em>, en el que se indica a qu\u00e9 direcci\u00f3n IP y qu\u00e9 puerto de tu entorno interno quieres proporcionar acceso, y luego se define un <em>server<\/em> que publica los servicios. En mi caso, en el <em>upstream<\/em> declaro la IP interna correspondiente a mi servidor dom\u00e9stico proporcionada por ZeroTier (que, recordemos, es privada y accesible s\u00f3lo para mi VPS), con lo que me estoy saltando las limitaciones del CG-NAT, y en el <em>server<\/em> publico los servicios. La gracia del asunto, adem\u00e1s, es que vale para conexiones TCP y UDP. Como lo que quiero publicar es un servidor HTTPS, un servidor MQTT y un servidor VPN, todo queda de la siguiente manera:<br \/>\n<blockquote><p>stream {<br \/>\n    upstream web_server {<br \/>\n        server IP_PRIVADA_REMOTA_ZEROTIER:443;<br \/>\n    }<\/p>\n<p>    server {<br \/>\n        listen 443;<br \/>\n        ssl_preread on;<br \/>\n        proxy_pass web_server;<br \/>\n    }<\/p>\n<p>    upstream mqtt_server {<br \/>\n        server IP_PRIVADA_REMOTA_ZEROTIER:1883;<br \/>\n    }<br \/>\n    server {<br \/>\n        listen 1883;<br \/>\n        proxy_pass mqtt_server;<br \/>\n        proxy_connect_timeout 1s;<br \/>\n    }<\/p>\n<p>    upstream vpn_server {<br \/>\n        server IP_PRIVADA_REMOTA_ZEROTIER:1194;<br \/>\n    }<br \/>\n    server {<br \/>\n        listen 1194 udp;<br \/>\n        proxy_pass vpn_server;<br \/>\n    }<\/p>\n<p>}\n<\/p><\/blockquote>\n<\/li>\n<li>El tercer punto es la redistribuci\u00f3n de servicios en el lado del servidor dom\u00e9stico. Esto es importante para m\u00ed, dado que no hago uso de un solo servidor a nivel dom\u00e9stico, sino de una serie de servidores desplegados en un entorno de virtualizaci\u00f3n. Mientras que el frontal web (que es un NGINX, a su vez) y mi servidor MQTT residen en el servidor que he conectado a ZeroTier, el servidor WordPress y el servidor de VPN est\u00e1n en sistemas distintos. Esto implica que tengo que encargarme de redirigir las conexiones provenientes del nuevo frontal en Oracle a estos sistemas. La parte de WordPress ya la ten\u00eda resuelta, pero quedaba por solucionar la parte del servidor VPN. En este caso, como en el anterior, la idea es utilizar un <em>stream<\/em>. Siguiendo con la idea anterior:<br \/>\n<blockquote><p>stream {<\/p>\n<p>    upstream vpn_server {<br \/>\n        server IP_SERVIDOR_LOCAL_VPN:1194;<br \/>\n    }<br \/>\n    server {<br \/>\n        listen 1194 udp;<br \/>\n        proxy_pass vpn_server;<br \/>\n    }<\/p>\n<p>}\n<\/p><\/blockquote>\n<\/li>\n<li>Y por \u00faltimo, he tenido que jugar un poco con mi servidor DNS. He creado un nuevo nombre en mi dominio eniac2000.com para el frontal VPS de Oracle Cloud, y he redireccionado los <em>alias<\/em> que uso habitualmente (www, bitacora&#8230;) hacia este nuevo nombre. Con ello, todo queda configurado de manera transparente.<\/li>\n<\/ul>\n<p>En realidad, me gusta tanto c\u00f3mo ha quedado configurado, que es posible que lo deje as\u00ed incluso cuando se solucione el tema del CG-NAT, ya que a\u00f1ade una capa extra de seguridad y disponibilidad a mis sistemas.<\/p>\n<p><strong>Referencias:<\/strong><br \/>\n<a href=\"https:\/\/www.reddit.com\/r\/selfhosted\/comments\/u8n5hz\/how_to_bypass_cgnat_and_expose_your_server_to_the\/\" target=\"_blank\">How to bypass CGNAT and expose your server to the internet using ZeroTier, a VPS and NGINX<\/a><br \/>\n<a href=\"https:\/\/github.com\/mochman\/Bypass_CGNAT\" target=\"_blank\">Bypassing a CGNAT with Wireguard (Especialmente \u00fatil para la parte de configuraci\u00f3n del entorno en Oracle Cloud)<br \/>\n<\/a><a href=\"https:\/\/serverfault.com\/questions\/1063640\/how-to-set-nginx-reverse-proxy-to-an-ssl-site-without-certificate\" target=\"_blank\">How to set nginx reverse proxy to an SSL site without certificate?<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desde hace algunos d\u00edas vengo experimentando problemas con mi conexi\u00f3n<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[405,851,1134,1169,1208,1762,1763,1794,1815],"series":[],"class_list":["post-5177","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-cg-nat","tag-iot","tag-mqtt","tag-nginx","tag-oracle-cloud","tag-vpn","tag-vps","tag-wordpress","tag-zerotier"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/5177","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5177"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/5177\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5177"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=5177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}