Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/03/2003, 08:25
Edulix
 
Fecha de Ingreso: mayo-2001
Mensajes: 58
Antigüedad: 23 años
Puntos: 0
Montando un firewall con netfilter/iptables

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
Código:
(shell)# man iptables
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..)

Última edición por Edulix; 20/06/2003 a las 11:03