Foros del Web » Administración de Sistemas » Unix / Linux »

Montando un firewall con netfilter/iptables

Estas en el tema de Montando un firewall con netfilter/iptables en el foro de Unix / Linux en Foros del Web. 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, ...
  #1 (permalink)  
Antiguo 23/03/2003, 08:25
 
Fecha de Ingreso: mayo-2001
Mensajes: 58
Antigüedad: 22 años, 11 meses
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
  #2 (permalink)  
Antiguo 23/03/2003, 12:36
Avatar de lical
Colaborador
 
Fecha de Ingreso: diciembre-2001
Ubicación: $PWD
Mensajes: 1.267
Antigüedad: 22 años, 4 meses
Puntos: 0
Cool que describas todo esto así de sencillo.

Sólo me gustaría añadir que si cargas el módulo correspondiente en el kernel puedes referirte a varios puertos con una sóla línea, lo cual puede ser a veces bastante útil.


Un saludo,
__________________
lical-> Usuario registrado de Linux #254225

ZonaSiete.ORG - GNU/Linux eminentemente práctico
  #3 (permalink)  
Antiguo 24/03/2003, 12:09
 
Fecha de Ingreso: mayo-2001
Mensajes: 58
Antigüedad: 22 años, 11 meses
Puntos: 0
continuación de Montando un firewall con netfilter/iptables

(prosigo por que al añadir algunas cosas me pasé de los 2000 caracteres)


Puede que éstos comandos os den error, ya que dependiendo de vuestra distribución /etc/init.d se puede convertir en /etc/rc.d/init.d, así que sólo tendréis que reemplazar lo uno por lo otro. Para más información sobre el uso de éstos comandos consultar rute: 21.4.6 Service initialization files.

Inicio automático al iniciar

Por último, supongo que querréis añadir iptables al arranque. La manera de hacer ésto varía también con cada distribución, por lo que con Gentoo se hace con rc-update, mientras que con Red Hat con chkconfig, y en Debian con update-rc.d:
Código:
(shell)# rc-update add iptables boot 	# Iptables iniciará con las últimas reglas guardadas, Gentoo Linux 
(shell)# chkconfig --level 5 iptables 	# Iptables iniciará con las últimas reglas guardadas, Red Hat 
(shell)# update-rc.d iptables defaults 10 	# Iptables iniciará con las últimas reglas guardadas, Debian
Espero que os halla sido de ayuda, si tenéis alguna duda o comentario, ¡no dudéis postearlo!

Agradecimientos a todos los que me han ayudado, sin vosotros no habría podido escribir este artículo .

Un saludo,
Edulix
__________________
"One World, One web, One program" - Microsoft Promo ad.
"Ein Volk, Ein Reich, Ein Fuhrer" - Adolf Hitler

Última edición por Edulix; 20/06/2003 a las 11:00
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:25.