Son bien conocidas en el mundo de la administración de sistemas, las capacidades que tiene iptables para el filtrado de paquetes pero, eso es tan solo una parte de lo que se puede hacer con el mismo. En el post de hoy les mostraré cómo hacer reenvío de puertos con iptables mediante el uso de técnicas de NAT. Más menos convertiremos la pc o el servidor seleccionado en una especie de “router”. Esto es útil si ha configurado una red privada, pero todavía se quiere permitir la circulación de determinados paquetes entre la red interna  y la externa a través de la puerta de enlace designada.

iptables-linux

Algunos conceptos

NAT o network address translation, es un término general para referise a la manipulación de paquetes con el fin de redirigirlos a una dirección alternativa. Por lo general, esto se utiliza para permitirle al tráfico trascender los límites de la red. Un host que implementa NAT típicamente tiene acceso a dos o más redes, y está configurado para enrutar el tráfico entre ellos.

Reenvío de puertos (Port forwarding) es el proceso de envío de solicitudes de un puerto específico a otro host, red o puerto. Como este proceso modifica el destino del paquete durante el vuelo, se considera un tipo de operación NAT.

Datos necesarios

Para que sea más fácil de seguir adelante, vamos a estar usando direcciones e interfaces ficticias lo largo de este tutorial. Ustedes deben sustituir los valores que se ven a continuacón por los suyos propios.

Servidor web en DMZ——————–[Firewall]————————– Administrador en LAN
10.10.10.10                  10.10.10.11(eth0)/10.20.20.20(eth1)                           10.20.20.21

Supongamos que tenemos a cargo la administración vía SSH de un servidor de aplicaciones web (10.10.10.10) que está ubicado en la DMZ. Tenemos un servidor Linux con dos tarjetas de red haciendo de firewall entre la DMZ y la LAN y que nosotros por supuesto, estamos en la LAN (10.20.20.21). Por motivos de seguridad el servidor web solo tiene abierto el puerto 80 para publicar las aplicaciones web a todos pero el acceso por SSH está permitido solo desde el firewall(10.10.10.11). A todo esto se suma que al nosotros estar en la LAN no tenemos acceso por SSH directo. Por lo que debemos darnos acceso en el Firewall sin cambiar las reglas de acceso vigentes en el servidor de aplicaciones web.

Configuración del Firewall para reenviar el puerto 22

Ahora, entendida la situación, podemos trabajar en la implementación del reenvío de puertos en el Firewall.

IPTables

Habilitamos el reenvío de paquetes en el Kernel

Editamos el fichero /etc/sysctl.conf y establecemos con valor 1, la directiva net.ipv4.ip_forward:

net.ipv4.ip_forward=1

Acto seguido ejecutamos el siguiente comando:

sysctl -p /etc/sysctl.conf

Aplicamos las reglas de reenvío

# Bloqueamos el reenvío por defecto.
iptables -P FORWARD DROP

# Aceptamos paquetes de reenvíos permitidos.
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

# Aceptamos los paquetes que se reenvían con destino a 10.10.10.10 por el
# puerto 22. Opcionalmente podemos especificar la interfaz por la que
# aceptaremos estos paquetes, en este caso agregando -i eth1.
iptables -A FORWARD -d 10.10.10.10/32 -p tcp -m tcp --dport 22 -m state \
--state NEW -j ACCEPT

Aplicamos las reglas NAT

# Redireccionamos lo que venga por el puerto 222 del Firewall
# hacia el puerto 22 del servidor de aplicaciones web.
# Opcionalmente podemo especificar la interfaz por la que
# aceptaremos estos paquetes, en este caso agregando -i eth1.
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 222 -j DNAT \
--to-destination 10.10.10.10:22

# Enmascaramos el ip origen del paquete para que al llegar a 10.10.10.10 crea
# que fue enviado por 10.10.10.11.
# Opcionalmente podemos especificar la interfaz por la que
# saldrán estos paquetes, en este caso agregando -o eth0.
iptables -t nat -A POSTROUTING -s 10.20.20.21/32 -d 10.10.10.10/32 -p tcp \
-m tcp --dport 22 -j MASQUERADE

En este momento ya podemos probar la conexión SSH desde nuestra PC (10.20.20.21) al 10.10.10.10 PERO, para probarla debemos recordar que no podemos acceder directamente por lo que probaremos ejecutando:

ssh 10.20.20.20 -p 222 # El ip del Firewall de cara a la LAN.

Si todo ha ido bien, una vez logueados estaremos dentro del servidor de aplicaciones web.

Persistencia de la reglas

Ahora lo que nos queda es asegurar la persistencia de estas reglas que hemos aplicado para se mantengan activas si reiniciamos el server que está haciendo de firewall.

Si estamos usando Debian o algún derivado nos instalamos iptables-persistent. Este paquete nos crea los archivos /etc/iptables/rules.v4 y /etc/iptables/rules.v6 donde se salvan estas reglas para IPv4 e IPv6 respectivamente.

apt-get install iptables-persistent

En Centos nos instalamos el paquete iptables-services, que nos crea los ficheros /etc/sysconfig/iptables y /etc/sysconfig/ip6tables.

yum install iptables-services

Una vez instalado, procedemos a salvar las reglas que hemos aplicado a lo largo de este tutorial.

iptables-save > /etc/iptables/rules.v4 # Debian y familia
iptables-save > /etc/sysconfig/iptables # CentOS

Si no utilizamos IPv6 conviene denegar todo acceso posible.

ip6tables -F
ip6tables -Z
ip6tables -X
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ip6tables-save > /etc/iptables/rules.v6 # Debian y familia
ip6tables-save > /etc/sysconfig/ip6tables # CentOS

La ventaja principal de lo que acabamos de hacer es que nos permite escribir las reglas en esos ficheros, cargarlas y si reiniciamos el sistema las cargará automáticamente.

Si deseamos crear, modificar o eliminar alguna de las reglas. Podemos hacerlo directamente en los ficheros y reiniciar el servicio.

service netfilter-persistent restart # Debian y familia
service iptables restart # CentOS

Y con esto, ya tenemos todo listo. Espero que les haya parecido interesante. Como siempre les pido, comenten sus impresiones y… Hasta la próxima!