viernes, julio 06, 2007

Compartir internet con Iptables y NAT en 5 minutos

Se que existen muchos articulos sobre iptables y configuracion de NAT, pero este pequeño tutorial intentará ser muy concreto y practico a la hora de configurar un servidor que tiene dos tarjetas de red, una que esta conectada directamente a internet y tiene dirección IP publica fija, y la otra está pegada a la red local de la empresa.

En este ejemplo vamos aprovechar las capacidades de control de conexiones que tienen las iptables. Lo 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
Ahora veamos un ejemplo particular, suponemos que las direcciones de nuestra red privada son 192.168.0.0/24 (es decir la máscara es de 24 bits: 255.255.255.0).

Creamos un archivo que sera el script de las reglas iptables que vamos a configurar, en mi caso fue /etc/nat.sh. Una vez creado agregamos las siguientes lineas al archivo:

# Habilito el NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQUERADE
# Dejo pasar los paquetes ICMP
iptables -A INPUT -i eth1 -p ICMP -j ACCEPT
# Permito conexiones al puerto 80 (HTTP)
iptables -A INPUT -i eth1 -p TCP --dport 80 -m state --state NEW -j ACCEPT
# Permito conexiones al puerto 25 (SMTP)
iptables -A INPUT -i eth1 -p TCP --dport 25 -m state --state NEW -j ACCEPT
# Permito conexiones al puerto 10000 (Webmin)
iptables -A INPUT -i eth1 -p TCP --dport 10000 -m state --state NEW -j ACCEPT
# Permito conexiones al puerto 53 (DNS)
iptables -A INPUT -i eth1 -p TCP --dport 53 -m state --state NEW -j ACCEPT
# Permito conexiones al puerto 22 (SSH)
iptables -A INPUT -i eth1 -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 eth1 -m state --state NEW,INVALID -j DROP
# Rechazamos paquetes de forwarding de conexiones no establecidas
iptables -A FORWARD -i eth1 -m state --state NEW,INVALID -j DROP

Como podemos ver en la primera línea habilitamos el NAT para la red local, en la segunda linea habilitamos el tráfico ICMP para poder realizar pings, también permitimos el acceso a algunos servicios propios que tiene este servidor, como SMTP, HTTP, Webmin, SSH, pero ustedes habilitan los que realmente necesiten en sus maquinas.

Listo eso es todo loque necesitamos, en mi caso tenia 10 estaciones de trabajo y un servidor y ahora todos salen a internet por este servidor con esta configuracion.

Lo unico que queda es poner a ejecutar este script automaticamente cada vez que inicie la maquina. Para esto les recomiendo un vistazo a los scripts iptables-save [1] e iptables-restore[2], que podrian ser de buena ayuda para luego poner a ejecutarlos automaticamente.

Espero que les sirva en alguna oportunidad.

6 comentarios:

Unknown dijo...

wow, gracias
lo probare, pero gracias de todas formas, seguro que funciona
www.mundojn.tk

Átomo2000 dijo...

Funcionó de maravilla!
Muchas pero muchas gracias.

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

buenassssss ..... sabes tengo un problema estoy tratando de compartir internet a mi ps3 mediante iptables y nat en ubuntu,tengo una adaptador wifi(capta internet) conectado a mi pc(ubuntu), el pc conectado a mi ps3 mediante un cable de red cruzado, usando un script con iptables y nat logro conseguir enviar internet desde wlan0 (interfaz de red inalambrica) a mi eth0 (interfaz de area local), pero cuando paso a mi ps3 y le doy probar conexion a internet comprueba la ip hasta ahí bien pero al probar la conexion manda error y al revisar mi pc esta desconectada la red compartida solo esta conectada wlan0........ nose si sepas sobre esto de compartir internet a ps3 en ubuntu pero cualquier cosa se agradece....... a todo esto ocupo wicd como gestor de redes, OS BackTrack 5 r3 GENOME 64bit

Sebastian dijo...

Excelente!! que manual, tutorial o libro para aprender iptables

Sebastian dijo...

Excelente!! que manual, tutorial o libro para aprender iptables