{"id":1672,"date":"2025-07-24T08:00:00","date_gmt":"2025-07-24T11:00:00","guid":{"rendered":"https:\/\/www.nerdadas.com\/blog\/?p=1672"},"modified":"2025-07-22T17:29:19","modified_gmt":"2025-07-22T20:29:19","slug":"hairpin-nat-vs-dns-split-horizon","status":"publish","type":"post","link":"https:\/\/www.nerdadas.com\/blog\/hairpin-nat-vs-dns-split-horizon\/","title":{"rendered":"Hairpin NAT vs DNS Split Horizon"},"content":{"rendered":"\n<p>Que pasa cuando tenemos alg\u00fan servicio publicado en internet, como por ejemplo un servidor web, accesible por DNS para la gente del <strong>exterior<\/strong> de la red y un usuario de <strong>dentro<\/strong> de la red quiere acceder al mismo. <\/p>\n\n\n\n<p>El Usuario exterior obtendr\u00e1 una ip p\u00fablica y podr\u00e1 acceder, pero el usuario de red local al obtener la misma ip p\u00fablica, no podr\u00e1 acceder al mismo ya que es su ip de salida a internet.<\/p>\n\n\n\n<p>Existen dos maneras de abordar esta situaci\u00f3n. <strong>DNS Split Horizon<\/strong> y <strong>Hairpin NAT<\/strong>. Realic\u00e9 laboratorios con <strong>Linux<\/strong>(Debian 12), <strong>Cisco<\/strong> y <strong>Mikrotik<\/strong>. Veamos como funciona cada una y cu\u00e1l es la mejor manera de solucionarlo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Harpin NAT<\/h2>\n\n\n\n<p><strong>Hairpin NAT<\/strong>, tambi\u00e9n conocido como, <strong>NAT Loopback<\/strong> o <strong>NAT Reflection<\/strong> es una t\u00e9cnica utilizada para permitir que los dispositivos dentro de una red interna accedan a un servicio publicado desde la misma red interna pero <strong>a trav\u00e9s de su direcci\u00f3n p\u00fablica<\/strong>. \u00datil en los escenarios que hablamos m\u00e1s arriba.<\/p>\n\n\n\n<p>Se basa en traducir la direcci\u00f3n ip p\u00fablica de destino a una ip interna y viceversa para redirigir el tr\u00e1fico con un NAT. De esta forma el destino es alcanzado correctamente modificando la ip de destino.<\/p>\n\n\n\n<p>Pasamos al lab en <strong>Cisco<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2025\/07\/image-24.png\"><img loading=\"lazy\" decoding=\"async\" width=\"924\" height=\"463\" src=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2025\/07\/image-24.png\" alt=\"\" class=\"wp-image-1753\" srcset=\"https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2025\/07\/image-24.png 924w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2025\/07\/image-24-300x150.png 300w, https:\/\/www.nerdadas.com\/blog\/wp-content\/uploads\/2025\/07\/image-24-768x385.png 768w\" sizes=\"auto, (max-width: 924px) 100vw, 924px\" \/><\/a><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>#Configuramos IP y como va el NAT\ninterface Gig0\/0\nip address 172.16.16.1 255.255.255.0\nip nat outside\n#La Interfaz LAN\ninterface Gig0\/1\nip address 10.0.0.1 255.255.255.0\nip nat inside\n\n#Habilitamos el Forward al puerto 80 de nuestro webserver\nip nat inside source static tcp 10.0.0.3 80 172.16.16.1 80\n\n# Para hairpin, necesitamos una ACL y un NAT rule para el tr\u00e1fico interno\nip access-list extended HAIRPIN\n permit ip 192.168.88.0 0.0.0.255 host 192.168.88.100\n\nip nat inside source list HAIRPIN interface Gig0\/1 overload<\/code><\/pre>\n\n\n\n<p>Ahora vamos a probar si funciona. Desde la pc dentro de la red (10.0.0.2) vamos a hacer un curl.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl http:\/\/172.16.16.1<\/code><\/pre>\n\n\n\n<p>Si todo sali\u00f3 correctamente nos responder\u00e1 con el archivo \u00abindex.html\u00bb o lo que tenga ese server como default page.<\/p>\n\n\n\n<p>Vamos a resolverlo de la misma forma pero en <strong>Mikrotik RouterOS 7<\/strong><\/p>\n\n\n\n<p>En este caso, en RouterOS, establecemos primero el NAT hacia el webserver desde el exterior:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/ip firewall nat add chain=dstnat action=dst-nat dst-address=172.16.16.1 dst-port=443 to-addresses=10.0.0.3 to-ports=443 protocol=tcp<\/code><\/pre>\n\n\n\n<p>Y ahora la regla de Hairpin NAT para el tr\u00e1fico interior.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># SRC-NAT para que el servidor vea como origen la IP del router\n\/ip firewall nat add chain=srcnat src-address=10.0.0.0\/24 dst-address=10.0.0.3 out-interface=LAN protocol=tcp action=masquerade<\/code><\/pre>\n\n\n\n<p>De esta manera todo el tr\u00e1fico en el puerto 80 con destino 172.16.16.1 ser\u00e1 redireccionado a la ip 10.0.0.3 pero enmascarado como si viniera desde la wan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">DNS Split Horizon<\/h2>\n\n\n\n<p>La soluci\u00f3n ideal, en estos casos, es ser due\u00f1o de un dns (o alquilarlo como CloudFlare o AWS Route 53) que nos permiten aplicar esta t\u00e9cnica.  En este caso el servidor de DNS tendr\u00e1 2 zonas y al recibir una solicitud de DNS dar\u00e1 una ip u otra dependiendo de d\u00f3nde viene la solicitud.<\/p>\n\n\n\n<p>Ejemplo:<\/p>\n\n\n\n<p><strong>Zona Interna: <\/strong>midominio.com &#8211;> <strong>10.0.0.3<\/strong><\/p>\n\n\n\n<p><strong>Zona Externa:<\/strong> midominio.com &#8211;><strong>172.16.16.1<\/strong><\/p>\n\n\n\n<p>En <strong>Windows Server <\/strong>tambi\u00e9n es posible con las zonas de b\u00fasquedas <strong>directas internas<\/strong>.<\/p>\n\n\n\n<p>En Linux podes instalar <strong>bind9<\/strong> para intentar emular<strong> DNS Split Horizon<\/strong> en tu laboratorio local.<\/p>\n\n\n\n<p>Edit\u00e1 el <strong>named.conf <\/strong>con algo como esto.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>view \"internal\" {\n    match-clients { 10.0.0.0\/24; };\n    zone \"empresa.com\" {\n        type master;\n        file \"\/etc\/bind\/zones\/db.empresa.com.internal\";\n    };\n};\n\nview \"external\" {\n    match-clients { any; };\n    zone \"empresa.com\" {\n        type master;\n        file \"\/etc\/bind\/zones\/db.empresa.com.external\";\n    };\n};\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hairpin NAT vs DNS Split Horizon<\/p>\n<p>Que pasa cuando tenemos alg\u00fan servicio publicado en internet, como por ejemplo un servidor web, accesible por DNS para la gente del exterior de la red y un usuario de dentro de la red quiere acceder al mismo.<\/p>\n<p>El Usuario exterior obtendr\u00e1 una ip p\u00fablica y podr\u00e1 acceder, pero el usuario de red local al obtener la misma ip p\u00fablica, no podr\u00e1 acceder al mismo ya que es su ip de salida a internet.<\/p>\n<p>Existen dos maneras de abordar esta situaci\u00f3n. DNS Split Horizon y Hairpin NAT. Realic\u00e9 laboratorios con Linux(Debian 12), Cisco y Mikrotik. Veamos como funciona cada una y cu\u00e1l es la mejor manera de solucionarlo.<\/p>\n","protected":false},"author":1,"featured_media":1749,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1243,1223,161,1,17,804],"tags":[1148,282,1376,37,1230,1225,1379,1378,242,569,1064,869],"class_list":["post-1672","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-montando-tu-red-corporativa-de-0","category-redes","category-seguridad","category-sin-categoria","category-tecnologia","category-ti","tag-cisco","tag-hack","tag-hairpin","tag-linux","tag-mikrotik","tag-nat","tag-nat-loopback","tag-nat-reflection","tag-network","tag-redes","tag-router","tag-seguridad"],"_links":{"self":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/1672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/comments?post=1672"}],"version-history":[{"count":14,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/1672\/revisions"}],"predecessor-version":[{"id":1761,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/posts\/1672\/revisions\/1761"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/media\/1749"}],"wp:attachment":[{"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/media?parent=1672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/categories?post=1672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nerdadas.com\/blog\/wp-json\/wp\/v2\/tags?post=1672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}