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:
Con esto arrancamos el configurador del núcleo más conocido, menuconfig. (shell)# su # Necesitamos permisos de administrador (shell)# cd /usr/src/linux && make 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:
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: (shell)# make dep && make clean bzImage modules modules_install [...Mucha información...]
Código:
Conociendo iptables(shell)# cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.x (shell)# vim /boot/grub/grub.conf (shell)# reboot
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
Código:
Configurando propiamente el firewall(shell)# man iptables
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:
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á: #!/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
Código:
Arrancando, parando, y guardando la configuración del firewall (shell)# vim iptables.sh (shell)# chmod +x iptables.sh (shell)# ./iptables.sh
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..)