Imprimir

IPtables y NetFilter, el firewall de Linux

Qué es...

  • Un firewall: es un programa que examina las cabeceras de los paquetes que llegan a las interfaces de red y que, aplicando unas reglas predefinidas los acepta, rechaza, ignora o modifica. Configurar el firewall consiste en definir esas reglas.

    El firewall es una de las piezas más importantes en la seguridad de nuestra máquina, por lo que debemos configurarlo con cuidado y controlar su actividad en todo momento.

  • Netfilter (netfilter.org): es un firewall que forma parte del kernel de Linux. Examina las cabeceras de cada paquete que llega a las interfaces de red y decide qué hacer con él:
    • por un lado, decide si modificar o no el paquete alterando su origen y/o destino, según las reglas NAT (Network Address Translation). Esto es lo que hacemos, por ejemplo, al redirigir puertos en el router.
    • por otro lado, decide si lo deja pasar, lo rechaza o lo ignora, según las reglas FILTER.
  • IPtables: es un frontal para Netfilter (reemplazó a IPchains). El comando iptables nos permite definir las reglas que aplica Netfilter y se utiliza generalmente en el script de inicio /etc/init.d/iptables, y dado que no es el comando más fácil de utilizar del mundo se suelen emplear frontales gráficos para generar el script /etc/init.d/iptables.

Equivalencias en Windows: ZoneAlarm.

Cómo maneja el kernel el tráfico de red

El kernel, por medio de Netfilter, controla todos los paquetes que llegan a las interfaces de red (eth0, ppp0...). Veamos qué hace con ellos.

Interfaz                                                       Interfaz
de red -> PREROUTING -> ENRUTADO -> FORWARD --> POSTROUTING -> de red
IN        DNAT             |        FILTER   ^  SNAT           OUT
                           |                 |
                           |                 |
                           v               OUTPUT
                         INPUT             FILTER
                         FILTER            DNAT
                           |                 ^
                           |                 |
                           -> Proceso Local --
  1. IN: llega un paquete a una interfaz de red desde el exterior.
  2. en PREROUTING se puede modificar el destino del paquete (reglas DNAT, Destination NAT).
  3. en ENRUTADO el kernel examina el destino del paquete. Si está destinado a la propia máquina, lo manda a INPUT. Si está destinado a otra máquina (si ha llegado a nuestra máquina para ser enrutado), lo envía a FORWARD.
  4. en INPUT se puede filtrar el paquete (reglas FILTER). Si pasa el filtro, el paquete entra en la máquina.
  5. en FORWARD se puede filtrar el paquete (reglas FILTER). Si pasa el filtro, el paquete pasa a POSTROUTING.
  6. en POSTROUTING se puede modificar el origen del paquete (reglas SNAT, Source NAT).
  7. OUT: sale un paquete por una interfaz de red al exterior.
  8. si un proceso de la propia máquina envía un paquete a la red, llega a OUTPUT, donde se puede filtrar (reglas FILTER) y modificar su destino (reglas DNAT, Destination NAT). Si pasa el filtro, el paquete pasa a POSTROUTING.

Sintaxis del comando iptables

El comando iptables nos permite definir las reglas que aplica Netfilter y su sintaxis es:

# iptables [tabla] [cadena] [condiciones] [qué_hacer]

Reglas FILTER

Veamos las principales opciones de iptables para reglas FILTER:

  • [tabla]
    • -t filter: tabla FILTER (es la opción por defecto).
  • [cadena]
    • -A INPUT|OUTPUT|FORWARD: añadir regla a una cadena.
    • -F: borra las reglas de todas las cadenas.
    • -X: borra todas las cadenas que no sean del sistema.
    • -Z: pone a cero todos los contadores.
    • -P INPUT|OUTPUT|FORWARD ACCEPT|DROP: política por defecto, regla que se aplica a los paquetes que no cumplen ninguna otra regla.
    • -L: lista las reglas. Con la opción -n (numérico) veremos direcciones IP y números de puerto en vez de nombres.
  • [condiciones] que debe cumplir el paquete para que se le aplique la regla.
    • -s IP[/mask][-IP]: IP de origen.
    • --sport port[-port]: puerto de origen.
    • -d IP[/mask][-IP]: IP destino.
    • --dport port[-port]: puerto destino.
    • -p tcp|udp|icmp|all: protocolo.
    • -i interfaz: interfaz de entrada. Aplicable a INPUT, FORWARD, PREROUTING y OUTPUT (DNAT).
    • -o interfaz: interfaz de salida. Aplicable a OUTPUT (FILTER), FORWARD y POSTROUTING.
    • -m state --state NEW|ESTABLISHED|RELATED|INVALID: estado de la conexión (en todos los paquetes se mira la conexión a la que está asociado).
    • -m multiport --dports port,port[,...]: para especificar varios puertos de destino.
    • -m limit [--limit num/s|m|h|d]: permite restringir el número de coincidencias que una regla puede generar por unidad de tiempo. Se utiliza habitualmente con LOG para evitar ataques DoS por disco ocupado o por tiempo consumido en generar y guardar logs.
    • -m mac --mac-source mac: cada interfaz de red (NIC) conectada a una red basada en IP necesita una MAC para identificarse a nivel de la Capa de Enlace. La MAC es un número de 48 bits (24 identifican al fabricante y 24 son el número de serie), por ejemplo en hexadecimal 3A-F5-CD-98-33-B1, exclusivo para cada NIC: no existen (o no deben existir) dos NIC con la misma MAC.
    • -f: fragmento.
  • [qué_hacer] con el paquete (objetivo).
    • -j ACCEPT: acepta el paquete.
    • -j DROP: ignora el paquete (lo descarta sin responder).
    • -j REJECT: rechaza el paquete (lo descarta respondiendo).
    • -j LOG [--log-level prioridad] [--log-prefix prejifo_log]: genera un log mediante syslogd con prioridad warning y origen kernel. Loguearemos sólo los paquetes que se salen de lo normal (intentos de conexión desde direcciones no autorizadas, paquetes ICMP no habituales, fragmentos, etc.).

Reglas NAT

Veamos algunas opciones de iptables que cambian para reglas NAT:

  • [tabla]
    • -t nat: tabla NAT.
  • [cadena]
    • -A PREROUTING|POSTROUTING|OUTPUT: añadir regla a una cadena.
  • [qué_hacer] con el paquete (objetivo).
    • -j SNAT --to IP[-IP][:port][-port]: modificar el origen del paquete.
    • -j MASQUERADE: caso particular de SNAT. Pone como origen del paquete la IP de la interfaz de salida.
    • -j DNAT --to IP[-IP][:port][-port]: modificar el destino del paquete.
    • -j REDIRECT --to port[-port]: caso particular de DNAT. Pone como destino del paquete la IP de la interfaz de entrada.

Controlar el firewall

Es muy conveniente controlar en todo momento la configuración y actividad de nuestro firewall. Para ello disponemos de varias herramientas.

Ver la configuración de Netfilter

Podemos ver la configuración de la tabla FILTER con la opción -L (la configuración por defecto es ACCEPT):

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Con la opción -n veremos direcciones IP y números de puerto en vez de nombres:

# iptables -nL

Con la opción -v veremos todos los detalles:

# iptables -nvL

Para ver la configuración de la tabla NAT usaremos la opción -t nat:

# iptables -t nat -L

Comprobar que el firewall funciona

Para saber qué puertos tenemos abiertos y asegurarnos de que el firewall funciona correctamente, haremos un escaneado de puertos con nmap. Primero haremos un escaneo de puertos TCP de tipo SYN ejecutando (como root):

# nmap -sS <ip_del_servidor> -p 1-65535

y luego un escaneo de puertos UDP:

# nmap -sU <ip_del_servidor>

Compararemos los resultados antes y después de activar el firewall: una vez activado el firewall sólo se deben ver los puertos que hemos especificado con iptables.

Analizar los logs de Netfilter

Para analizar los logs de Netfilter disponemos de varias herramientas.

  • WFlogs (wallfire.org/wflogs/, paquete wflogs): herramienta que analiza los logs de Netfilter y muestra los resultados como texto, HTML o en tiempo real.

    WFlogs

  • fwLogWatch (fwlogwatch.inside-security.de, paquete fwlogwatch): programa que analiza los registros de Netfilter generando informes como texto, HTML o en tiempo real. Además, permite responder a ataques ejecutando scripts o modificando las reglas del firewall. Dispone de una interfaz web para administración remota.

    fwLogWatch

Cómo trabajar con IPtables: /etc/init.d/iptables

Para configurar Netfilter crearemos un script de inicio que contenga las reglas de IPtables, lo ubicaremos en /etc/init.d/iptables, le daremos permisos de ejecución y crearemos el enlace /etc/rc2.d/S92iptables.

Veamos un /etc/init.d/iptables sencillo de ejemplo, para una política por defecto de DENEGAR. Es la configuración más segura para un firewall: por defecto todo está denegado y sólo se permitirá pasar por el firewall aquello que se permita explícitamente.

#!/bin/sh
# Configuracion de netfilter con iptables
#
case "$1" in
 
start)
  echo "Aplicando reglas del firewall..."
 
  # Borrar la configuracion actual
  iptables -F
  iptables -X
  iptables -Z
 
  # Definir la politica por defecto
  iptables -P INPUT DROP
  iptables -P FORWARD DROP
  iptables -P OUTPUT ACCEPT
 
  # Permitir acceso a las conexiones ya establecidas
  iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
 
  # Permitir acceso desde la propia maquina
  iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
 
  # Permitir acceso al puerto 80 TCP (http)
  iptables -A INPUT -m state --state NEW -i eth0 -p tcp --dport 80 -j ACCEPT
 
  # Permitir acceso al puerto 53 UDP (dns)
  iptables -A INPUT -m state --state NEW -i eth0 -p udp --dport 53 -j ACCEPT
 
  # Permitir acceso a los puertos 20 y 21 TCP (ftp)
  iptables -A INPUT -m state --state NEW -i eth0 -p tcp --dport 20:21 -j ACCEPT
 
  # Permitir acceso a 3306 TCP (mysql) desde IP 231.45.134.23
  iptables -A INPUT -s 231.45.134.23 -p tcp --dport 3306 -j ACCEPT
 
  # Para compartir la conexión ppp0 a Internet desde la red local
  iptables −t nat −A POSTROUTING −s 192.168.10.0/24 −o ppp0 −j MASQUERADE
  # y activamos el bit de forwarding
  echo 1 > /proc/sys/net/ipv4/ip_forward
 
  # Loguear todo el FORWARD (maximo 1 paquete/segundo)
  iptables -A FORWARD -m limit --limit 1/s -j LOG --log-prefix "Forward: "
 
  # Terminado
  echo "OK. Reglas del firewall aplicadas."
  ;;
 
stop)
  echo "Borrando reglas del firewall..."
 
  # Borrar la configuración actual
  iptables -F
  iptables -X
  iptables -Z
 
  # Configuración por defecto
  iptables -P INPUT ACCEPT
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD ACCEPT
 
  # Terminado
  echo "OK. Restaurada configuracion del firewall por defecto."
  ;;
 
status)
  iptables -nL
  iptables -t nat -nL
  ;;
 
*)
  echo "Uso: $0 { start | stop | status }"
  exit 1
  ;;
 
esac
exit 0

Importante

El orden en el que se establecen las reglas del firewall es determinante, ya que para decidir qué hacer con un paquete, Netfilter lo va comparando con cada regla hasta que encuentra una que le afecta, y aplica esta regla. Después de eso no mirará más reglas para ese paquete, aplicando la política por defecto si no encuentra ninguna coincidencia. El peligro es que si ponemos reglas muy permisivas al principio del script puede que las siguientes no se apliquen y no sirva de nada el filtrado.

El script de Arno para IPtables

Un script muy completo y seguro para IPtables es el Arno's IPtables Firewall Script (rocky.eld.leidenuniv.nl, paquete arno-iptables-firewall).

El script es /etc/init.d/arno-iptables-firewall y su archivo de configuración es /etc/arno-iptables-firewall/firewall.conf. Durante la instalación nos preguntará la interfaz de red por la que salimos a Internet (eth0) y qué puertos queremos abrir, ya que por defecto bloquea todo el tráfico entrante.

Podemos reconfigurarlo con el comando:

# dpkg-reconfigure arno-iptables-firewall

Podemos ver la configuración de Netfilter con el comando:

# /etc/init.d/arno-iptables-firewall status

Frontales para IPtables en el entorno gráfico

IPtables es una interfaz para Netfilter de bajo nivel, por lo que es común usar frontales gráficos para construir las reglas IPtables.

Nota

Si tenemos un servidor sin entorno gráfico y queremos aprovechar las prestaciones de los frontales gráficos para IPtables, lo que haremos será crear la configuración en otro ordenador y luego copiar el script resultante en el servidor.

  • Kmyfirewall (kmyfirewall.sourceforge.net, paquete kmyfirewall): frontal gráfico para IPtables de KDE. Genera un script que contiene las reglas de IPtables (/etc/kmyfirewall/kmyfirewall.sh) y un script de inicio (/etc/init.d/kmyfirewall).

    Kmyfirewall

  • fwBuilder (Firewall Builder, fwbuilder.org, paquete fwbuilder): frontal gráfico orientado a objetos que permite generar reglas para IPtables.

    fwBuilder

  • FireStarter (fs-security.com, paquete firestarter): frontal gráfico para IPtables que permite generar reglas de firewall, activarlas y monitorizar el tráfico que está siendo filtrado por Netfilter. Una vez lanzado queda como un applet en la barra de tareas. La configuración que ha creado la guarda en el script /etc/firestarter/firewall.

    FireStarter

  • Guarddog (simonzone.com/software/guarddog/, paquete guarddog): frontal gráfico para IPtables para KDE.

    Guarddog

4 Comentarios en “IPtables y NetFilter, el firewall de Linux”

Deja un comentario