En nuestros ejemplos vamos aprovechar las capacidades de control de conexiones que tienen las iptables. Primero, hay que tener en cuenta que el forwarding debe estar habilitado:
echo 1 > /proc/sys/net/ipv4/ip_forward
Y también recordar que para cambiar las reglas, primero hay que “borrar” las anteriores, por ejemplo:
iptables -F iptables -t nat -F
En todos los ejemplos se utilizarán direcciones para la red privada dentro del rango 192.168.0.0/24 (es decir la máscara es de 24 bits: 255.255.255.0)
Sólo se quiere hacer masquerading de una IP asignada dinámicamente, lo que es un caso común para un Linux que obtiene direcciones dinámicas de su proveedor de Internet. En el ejemplo se hará con la interfaz ppp0, que es la que se usa para ADSL, pero puede ser sustituida por caulquier interfaz del sistema (eth0, ppp0…).
Además de hacer el NAT, vamos a permitir el tráfico ICMP (de los pings…) ya que está recomendado que así funcione. Las últimas 3 reglas, que no son obligatorias pero sí recomendables, lo que hacen es descartar cualquier paquete que no sea de uina conexión previamente establecida.
# Habilitar el NAT iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQUERADE # Dejar pasar los paquetes ICMP iptables -A INPUT -i ppp0 -p ICMP -j ACCEPT # Aceptar paquetes de conexiones ya establecidas iptables -A INPUT -p TCP -m state --state RELATED -j ACCEPT # Rechazar paquetes de conexiones nuevas desde internet iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP # Rechazar paquetes de forwarding de conexiones no establecidas iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP Pero también se desea permitir conexiones entrantes SSH al puerto 8 y HTTP al puerto 80 y 443
Para lograr esto, antes de las últimas reglas “DROP” hay que poner unas que permitan las conexiones nuevas a esos puertos. Las reglas nos quedan de la siguiente forma:
# Habilitar el NAT iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0/0 \ -j MASQUERADE # Dejar pasar los paquetes ICMP iptables -A INPUT -i ppp0 -p ICMP -j ACCEPT # Permitir conexiones al puerto 80 (HTTP) y 443 (HTTPS) iptables -A INPUT -i ppp0 -p TCP --dport 80 -m state --state NEW -j ACCEPT iptables -A INPUT -i ppp0 -p TCP --dport 443 -m state --state NEW -j ACCEPT # Permitir conexiones al puerto 8 (SSH) iptables -A INPUT -i ppp0 -p TCP --dport 8 -m state --state NEW -j ACCEPT # Aceptar paquetes de conexiones ya establecidas iptables -A INPUT -p TCP -m state --state RELATED -j ACCEPT # Rechazar paquetes de conexiones nuevas iptables -A INPUT -i ppp0 -m state --state NEW,INVALID -j DROP # Rechazar paquetes de forwarding de conexiones no establecidas iptables -A FORWARD -i ppp0 -m state --state NEW,INVALID -j DROP
Para “abrir” otros puertos, sólo se debe agregar las nuevas reglas.
IP fija
Es muy fácil, en vez de usar masquerading, vamos a usar una solución mejor: source NAT. Sólo hay que cambiar la regla del nat (la primera en los ejemplos anteriores). Si la interfaz que tiene la IP fija es la eth0, y la IP fija es la 111.111.111.111, nos quedaría:
# Habilito el SNAT iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 111.111.111.111 # Dejo pasar los paquetes ICMP iptables -A INPUT -i eth0 -p ICMP -j ACCEPT # Permito conexiones al puerto 80 (HTTP) iptables -A INPUT -i eth0 -p TCP --dport 80 -m state --state NEW -j ACCEPT # Permito conexiones al puerto 22 (SSH) iptables -A INPUT -i eth0 -p TCP --dport 22 -m state --state NEW -j ACCEPT # Acepto paquetes de conexiones ya establecidas iptables -A INPUT -p TCP -m state --state RELATED -j ACCEPT # Rechazamos paquetes de conexiones nuevas iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP # Rechazamos paquetes de forwarding de conexiones no establecidas iptables -A FORWARD -i eth0 -m state --state NEW,INVALID -j DROP
Vale, pero ahora quiero redireccionar las conexiones a un puerto hacia un ordenador interno de mi LAN
Esto se llama destination NAT es bastante sencillo, sólo hay que poner una regla adicional. Por ejemplo, si queremos redireccionar las conexiones al puerto 80 hacia el puerto 80 de un ordenador en la red interna (192.168.0.111).
Asumiendo que pepito.com apunta a nuestro equipo de borde.
# http://www.pepito.com:1180 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1180 -j DNAT --to 192.168.0.111:80 # http://www.pepito.com:1280 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1280 -j DNAT --to 192.168.0.112:80
Otro ejemplo sencillo y muy útil, redireccionar el puerto 2022 del ordenador haciendo de NAT o firewall hacia el puerto 22 (ssh) de un ordenador de la red interna.
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2022 -j DNAT --to 192.168.0.111:22