Nota:
Cuando halla que escribir algo en la shell de linux, ésto será indicado con '(shell)#'. Por otra parte, tal y como en los bash-scripts, el símbolo '#' indica el inicio de un comentario.
Introducción
La seguridad es un tema muy importante para muchos, y debería de serlo para tantos otros. Por eso voy a plasmar mis humildes conocimientos sobre iptables, para poder ayudar a otros que quieran montar un firewall con iptables.
Iptables/netfilter es el sistema de filtrado de paquetes de red que trae consigo el kernel 2.4.x de Linux, y es mucho más potente que su antecesor (de los kernels 2.2.x), ipchains.
Requerimientos: - Versión de Linux con kernel de la serie 2.4.x o superior.
- Conocimientos mínimos sobre el SO.
- Ganas de aprender y un poco de tiempo.
Compilando el kernel con soporte de netfilter
Doy por supuesto que conocemos y hemos realizado ya otras veces el proceso de compilación del kernel de Linux. Si no lo conoces o no entiendes el proceso que aquí desarrollo, échale un vistazo a
este sencillo tutorial (
www.zonasiete.org).
Código:
(shell)# su # Necesitamos permisos de administrador
(shell)# cd /usr/src/linux && make menuconfig
Con esto arrancamos el configurador del núcleo más conocido, menuconfig.
Hemos de compilar iptables como módulo, o incluirlo dentro del núcleo, con la opción " Network Configuration > Network Paket filtering (replaces Ipchains)". Entonces más abajo, en esa misma rama del kernel - Network configuration - aparecerá la opción "IP Netfilter Configuration -->"; entra dentro. Compila como módulo todo lo que te parezca; si no sabes que elegir, pon todos como módulo. De esta manera no cargamos el núcleo del kernel con módulos que no utilizaremos, pero podremos usarlos cuando sea necesario.
Compilamos todo el kernel:
Código:
(shell)# make dep && make clean bzImage modules modules_install
[...Mucha información...]
Copiamos la imagen del kernel a /boot y modificamos el archivo de configuración de nuestro gestor de arranque, y reiniciamos si no ha habido ningún problema:
Código:
(shell)# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.x
(shell)# vim /boot/grub/grub.conf
(shell)# reboot
Conociendo iptables
Iptables se basa en reglas que son aplicadas a cadenas para regular el paso de los paquetes que pasan por la red, tanto entrantes como salientes. Es decir, filtra los paquetes, haciendo de firewall. Existen una serie de cadenas principales, INPUT, la de entrada; OUTPUT, la de salida, y FORWARD, la de redirección.
La explicación del funcionamiento de iptables es algo demasiado complejo y extenso, para este simple documento. Con éstos dos enlaces alcanzaréis la sabiduría:
http://www.netfilter.org/documentati...g-HOWTO-7.html Configurando propiamente el firewall
Vamos a proceder a añadir las reglas al firewall. El siguiente bash-script añadirá las reglas pertinentes al firewall cuando sea ejecutado.Lo he comentado para que os sea de mayor provecho: (¡Gracias a Ferdy y Alfón!)
¡Importante!:: Estas reglas que os presento son las que he ido recopilando. Seguramente necesitaréis ajustarlas, lo cual es altamente recomendado. Si realmente no necesitáis alguna de los puertos abiertos por estas reglas, ¡no los abráis!. Si necesitáis abrir algún otro puerto y creéis que es importante sólo comentadlo y lo añadiré si es conveniente :D.
Código:
#!/bin/bash
# Borramos todas las reglas, y luego todas las cadenas adicionales a INPUT, OUTPUT y FORWARD
iptables -F
iptables -X
#Creamos una nueva cadena llamada 'cadena'
iptables -N cadena
# No aceptar paquetes nuevos desconocidos ni paquetes mal formados
iptables -A cadena -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A cadena -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A cadena -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# No aceptamos que nos hagan ping, así no sabrán si nuestra máquina está conectada. Puede que no te interese tener está opción activada.
iptables -A FORWARD -i eth0 -p icmp
-icmp-type 8 -j DROP
# Anti-spoofing (falseo de ip origen)
iptables -A INPUT -i $IFACE -s $IPADDR -j DROP
iptables -A INPUT -i $IFACE -s $CLASS_A -j DROP
iptables -A INPUT -i $IFACE -s $CLASS_B -j DROP
iptables -A INPUT -i $IFACE -s $CLASS_C -j DROP
iptables -A INPUT -i $IFACE -s $CLASS_D_MULTICAST -j DROP
iptables -A INPUT -i $IFACE -s $CLASS_E_RESERVED_NET -j DROP
iptables -A INPUT -i $IFACE -d $LOOPBACK -j DROP
iptables -A INPUT -i $IFACE -d $BROADCAST -j DROP
# Anti-flooding o inundación de tramas SYN.
iptables -N syn-flood
iptables -A INPUT -i $IFACE -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
########################################
# Abrimos los puertos que necesitemos
########################################
# Para más info:
# cat /etc/services | grep <servicio>
# P.e.: cat /etc/services | grep www
#######################################
# Abrimos puerto para que KDE inicie y no diga "Initializing system services".
# Otros programas (Gaim p.e.) también necesitan la apertura de éste puerto para
# su correcto funcionamiento
iptables -A cadena -p tcp -s 127.0.0.1 -j ACCEPT
# Abrimos puertos para el HTTP/HTTPS
iptables -A cadena -p tcp --dport 80 -j ACCEPT
iptables -A cadena -p udp --dport 80 -j ACCEPT
iptables -A cadena -p tcp --dport 443 -j ACCEPT
iptables -A cadena -p udp --dport 443 -j ACCEPT
# Abrimos puertos para mensajería instantánea (Jabber y MSN)
iptables -A cadena -p tcp --dport 5222:5223 -j ACCEPT
iptables -A cadena -p tcp --dport 1863 -j ACCEPT
iptables -A cadena -p tcp --dport 5190 -j ACCEPT
# Abrimos para IMAP/IMAPS
iptables -A cadena -p tcp --dport 143 -j ACCEPT
iptables -A cadena -p udp --dport 143 -j ACCEPT
iptables -A cadena -p tcp --dport 993 -j ACCEPT
iptables -A cadena -p udp --dport 993 -j ACCEPT
# Abrimos para CVS
iptables -A cadena -p tcp --dport 2401 -j ACCEPT
iptables -A cadena -p udp --dport 2401 -j ACCEPT
# Abrimos para SSH y SFTP
iptables -A cadena -p tcp --dport 22 -j ACCEPT
iptables -A cadena -p udp --dport 22 -j ACCEPT
iptables -A cadena -p tcp --dport 115 -j ACCEPT
iptables -A cadena -p udp --dport 115 -j ACCEPT
# Abrimos para FTP y FTP-DATA
iptables -A cadena -p tcp --dport 21 -j ACCEPT
iptables -A cadena -p udp --dport 21 -j ACCEPT
iptables -A cadena -p tcp --dport 20 -j ACCEPT
iptables -A cadena -p udp --dport 20 -j ACCEPT
# Abrimos para SMTP
iptables -A cadena -p tcp --dport 25 -j ACCEPT
iptables -A cadena -p udp --dport 25 -j ACCEPT
# Abrimos para DNS (como cliente)
iptables -A RELATED,ESTABLISHED -p tcp --dport 53 -j ACCEPT
iptables -A RELATED,ESTABLISHED -p udp --dport 53 -j ACCEPT
# Abrimos para IRC
iptables -A cadena -p tcp --dport 6666 -j ACCEPT
iptables -A cadena -p udp --dport 6666 -j ACCEPT
iptables -A cadena -p tcp --dport 6667 -j ACCEPT
iptables -A cadena -p udp --dport 6667 -j ACCEPT
# Abrimos para las NEWS
iptables -A cadena -p tcp --dport 119 -j ACCEPT
iptables -A cadena -p tcp --dport 563 -j ACCEPT
iptables -A cadena -p udp --dport 563 -j ACCEPT
# Activamos IPP y SMB para la impresión
iptables -A cadena -p tcp --dport 631 -j ACCEPT
iptables -A cadena -p udp --dport 631 -j ACCEPT
iptables -A cadena -p tcp --dport 139 -j ACCEPT
iptables -A cadena -p udp --dport 139 -j ACCEPT
# Activamos el ICMP para entre otras cosas, responder al comando (shell)# ping
iptables -A cadena -p icmp --icmp-type 0 -j ACCEPT
iptables -A cadena -p icmp --icmp-type 8 -j ACCEPT
# Valores predeterminados de las cadenas
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -P INPUT DROP
# Añadimos las reglas de la cadena "cadena" a INPUT
iptables -A INPUT -j cadena
# Activamos el logueo de lo que pasa por INPUT
iptables -A INPUT -j LOG
Sugiero que copies todo esto a un archivo tal como iptables.sh, y luego lo ejecutéis, dándole permisos de ejecución primero, claro está:
Código:
(shell)# vim iptables.sh
(shell)# chmod +x iptables.sh
(shell)# ./iptables.sh
Arrancando, parando, y guardando la configuración del firewall
Podéis probar la configuración de iptables arrancándolo, y parándolo si tenéis algún problema. Cambíais lo que sea necesario en el iptables.sh, y lo volvéis a ejecutar hasta que todo quede a vuestro gusto. Luego, guardáis la reglas de iptables:
[code]
(shell)# /etc/init.d/iptables start # Arrancará iptables
(shell)# /etc/init.d/iptables stop # Parará iptables
(shell)# /etc/init.d/iptables save # Guardará las reglas de iptables
[code]
(
continúa..)