Blog

Otro blog de un desarrollador cualquiera en Internet.

Accediendo a un Servidor Detrás de un NAT Doble

Inicio Inicio

Usualmente los proveedores de internet no proveen direcciones IP dedicadas a usuarios residenciales, ya que por lo general para el uso domestico no suelen ser un requerimiento importante, Sin embargo puede darse la ocasión en la cual decidimos montar un servidor de casa, ya sea para compartir archivos, como hub central para nuestros gadgets IoT o hasta un simple servidor de contenido multimedia como Plex.

El problema viene cuando decidimos acceder a nuestro servidor que se encuentra en nuestra casa, desde otra ubicación o red diferente, ya que para esto necesitaríamos de una dirección IP dedicada. En muchos casos la solución puede ser contactar nuestro proveedor de internet y solicitar una, pero en muchos casos estas suelen estar reservadas únicamente para los planes corporativos o empresariales que suelen ser muy costosos para un usuario domestico.

Dado que los proveedores de internet en los usuarios domésticos utilizan direcciones IP compartidas, una sola dirección IP puede ser compartida entre muchos usuarios por medio de un NAT configurado por el proveedor, haciendo imposible que podamos acceder a nuestro servidor desde afuera de nuestra red privada.

Una de las soluciones mas factibles a este problema, si no es posible conseguir una dirección IP dedicada, es acceder a el servidor por medio de un VPN desde otro servidor que si tenga conexión a internet por medio de una IP dedicada.

En mi caso personal, compré un viejo Xserve de principios de el 2008 el cual instale en mi red privada para utilizarlo principalmente como servidor Git, pero los problemas comenzaron cuando intente acceder al servidor fuera de mi red, y es que aun abriendo y reenviando los puertos de mi servidor a mi router no era posible acceder el servidor desde fuera y esto era ocasionado dado que mi router estaba dentro de un gran NAT configurado por mi proveedor.

Basicamente me encontre con que mi red privada, se encontraba detrás de un NAT doble, El NAT de mi router y el NAT de mi proveedor de internet. Como se muestra en el siguiente diagrama:

diagram-double-nat

Instalando XL2TPD con IPsec en CentOS 6

Asi que finalmente decidi la segunda opción, utilizar un VPN para acceder a mi servidor. Adquiri un pequeño VPS de 1GB de RAM y 2 direcciones IP dedicadas (x.x.x.x & y.y.y.y) con CentOS 6 pre-instalado en el cual procedi a instalar xl2tpd con IPsec.

Es recomendable que antes de instalar cualquier software en el VPS, actualicemos nuestro sistema, esto puede hacerse fácilmente ejecutando el siguiente comando en el terminal:

$ sudo yum -y update

Despues de esto podemos proceder a instalar XL2TPD con IPsec en el servidor, la manera mas facil y rápida de instalarlo es utilizando el script de instalación "setup-ipsec-vpn" de @hwdsl2, el cual esta disponible en GitHub.

Puedes realizar todo el proceso de instalacion en tan solo un paso:

$ wget https://git.io/vpnsetup-centos -O vpnsetup.sh && sudo sh vpnsetup.sh && chkconfig ipsec on

Activando Redirección IP

Después de la instalación, probé el servidor VPN en mi ordenador, y la navegación funciona bastante bien. Para poder acceder a mi servidor desde Internet, he configurado la VPN en el sistema operativo de el servidor. Aquí encontrará una explicación detallada de cómo configurar una nueva red VPN en su sistema operativo: https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/docs/clients.md

Ahora cuando su servidor está conectado a la red VPN, tenemos que comprobar cuál es la IP local asignada por la VPN a nuestro servidor. Para fines de explicación usaré la IP z.z.z.z como la IP privada de nuestro servidor dentro de la red VPN, el script de instalación por defecto añade una política DROP al firewall iptables, por lo que primero tenemos que eliminarlos.

Primero debemos activar la redirección IP, para activarla debemos modificar los siguientes parámetros (o añadirlos al final, si no existen en el archivo) en el archivo /etc/sysctl.conf como se muestra a continuación:

net.ipv4.ip_forward=1

Y despues necesitamos ejecutar el siguiente comando:

echo "1" > /proc/sys/net/ipv4/ip_forward && sysctl net.ipv4.ip_forward=1

Configurando el Firewall (iptables)

En primer lugar, debemos hacer una copia de seguridad de todas las reglas configuradas en "iptables" antes de realizar cualquier modificación.

$ mkdir /etc/iptables/
$ iptables-save > /etc/iptables/rules-bak.v4

Ahora hacemos una copia del archivo, en la que añadiremos la configuración necesaria para reenviar la IP.

$ cp /etc/iptables/rules-bak.v4 /etc/iptables/rules.v4

Ahora abrimos el nuevo archivo con un editor de texto como vi o nano y buscamos las siguientes reglas en el archivo y las elimínamos:

-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited

Ahora guardaremos el archivo y aplicaremos las nuevas reglas ejecutando los siguientes comandos, y luego reiniciamos el servidor:

$ iptables -F
$ iptables-restore < /etc/iptables/rules.v4
$ service iptables save
$ service iptables reload

Redireccionando la Dirección IP

Ahora que nuestro servidor VPN está configurado, debemos redirigir todo el tráfico desde la dirección IP privada de nuestro servidor dentro de la red VPN (z.z.z.z) a la dirección IP pública (y.y.y.y) de nuestro servidor VPN. Este paso es fácil, sólo necesitamos añadir algunas reglas adicionales a iptables, estas reglas reenviarán todos los puertos a la IP local.

$ iptables -t nat -A PREROUTING -d y.y.y.y/32 -i eth0 -j DNAT --to-destination z.z.z.z
$ iptables -t nat -A PREROUTING -d y.y.y.y/32 -j DNAT --to-destination z.z.z.z
$ iptables -t nat -A POSTROUTING -s z.z.z.z/32 -o eth0 -j SNAT --to-source y.y.y.y
$ iptables -t nat -A POSTROUTING -s z.z.z.z/32 -j SNAT --to-source y.y.y.y
$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
$ iptables -A FORWARD -s y.y.y.y/32 -j ACCEPT
$ iptables -A FORWARD -d z.z.z.z/32 -j ACCEPT
$ service iptables save
$ service iptables reload

Y eso es todo! Ahora puedes acceder a tu increíble servidor desde la dirección y.y.y.y 😎


Autor: Abdy Franco

Publicado en Linux, Redes en oct 12, 2018

Compartir en:
Facebook Twitter Pinterest E-mail
Comentarios:

Deja un Comentario: