Iptables es una herramienta que nos permite definir políticas de filtrado de tráfico de red. Desde la perspectiva de un servidor, iptables nos permite controlar el tráfico desde y hacia los servicios instalados en este.

En un ambiente de desarrollo generalmente no nos preocupamos de los servicios y puertos disponibles, ya que usualmente quienes accesan a este ambiente son miembros de nuestro equipo de trabajo, es decir gente de confianza. En un ambiente de producción no podemos permitir este comportamiento y es necesario definir cuales de estos servicios son necesarios para todo el público y restringir el acceso a aquellos otros no son de uso público. Esto aplica tanto para tráfico entrante y saliente.

Netfilter incorpora el concepto de tablas de filtros de las cuales existen tres:

  • FILTER ó tabla de filtros. Tabla responsable del filtrado de paquetes, es decir de bloquear o permitir que un paquete continúe su camino.
  • NAT ó tabla de traducción de direcciones de red. Esta tabla es la responsable de configurar las reglas de reescritura de direcciones o de puertos de los paquetes. Se refiere a la traducción de las direcciones de origen o destino y puertos de los paquetes.
  • MANGLE ó tabla de destrucción. Esta tabla es la responsable de ajustar las opciones de los paquetes, como por ejemplo la calidad de servicio (QOS) o tipo de servicio (TOS). Usualmente utilizada para priorizar servicios en el tráfico de red.

En esta ocasión vamos a estudiar la tabla FILTER, en la cual existen tres cadenas predefinidas que son:

  • INPUT. Todo aquel tráfico que viene desde fuera hacia nuestro servidor.
  • OUTPUT. Todo tráfico originado desde nuestro servidor hacia fuera.
  • FORWARD. Todo trafico que viaja en nuestro servidor y posteriormente es redireccionado, similar al concepto de un router.

Sintaxis

Para definir las reglas nos auxiliamos del comando iptables. Un ejemplo de una regla puede ser:

iptables -I INPUT 1 -i eth0 -p tcp --dport 22 -j ACCEPT

Ahora vamos a descomponer esta regla con sus diferentes opciones o parámetros

  • -I INPUT 1. Hace referencia de la cadena a la cual vamos a añadir la regla. El número 1 define la posición donde debe incorporarse la regla. Las cadenas pueden ser: INPUT, OUTPUT y FORWARD dependiendo del origen y destino de la solicitud.
  • -i eth0. Define la interfaz de red que se desea filtrar. Al no definirla, la regla aplica para todo el tráfico en general.
  • -p tcp. Es el protocolo del paquete. Este puede tambien ser udp ó icmp (ping).
  • --dport 22. Puerto destino, en este caso es el puerto 22 cuyo servicio es SSH.
  • -j ACCEPT. Aquí configuramos la acción que se va a ejecutar. Las más utilizadas son: ACCEPT ó aceptar, REJECT ó denegar, DROP ó borrar e ignorar y LOG ó registrar en los logs del sistema mediante syslogd. La diferencia entre REJECT y DROP es que en el REJECT hay una respuesta como por ejemplo: "CONNECTION REFUSED", en cambio con el DROP simplemente se corta la conexión sin respuesta alguna (bueno para evitar ataques DoS).

Existen otras opciones que también son importantes de conocer:

  • -s u origen (source). Define la dirección IP de origen.
  • -d ó destino (destination). Dirección IP de destino.
  • --sport ó puerto de origen. Puerto del cual se origina el paquete.
  • -m ó extensión (match). Sirve para definir un comportamiento específico en base a una extensión o librería de netfilter. Entre los más conocidos tenemos: state, icmp (solamente si se utiliza el protocolo icmp --p icmp), addrtype (tipo de dirección IP), limit (límite de conexiones en un lapso de tiempo), time (por rangos de tiempo especícifos) entre otras.
  • -F ó Limpiar (flush). Limpia las reglas.
  • -L ó Lista. Lista las reglas definidas en el sistema.

Las últimas dos opciones no necesitan un parámetro extra y no se usan en combinación con otra opción.

Sintaxis

Creando un script básico de Iptables

Para crear nuestro script vamos a utilizar el editor de textos nano, si no conoces de este editor o quieres aprender más de el, te recomiendo el siguiente nanotutorial: Tutorial del Editor de Texto Nano.

nano iptables-up.sh

Ahora vamos a agregar los siguientes puntos a nuestro nuevo script.

Limpiando todas las reglas

# Delete existing rules
iptables -F

Mantener las conexiones ya establecidas

# Allow connections that are already connected to your server
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Habilitando tráfico hacia servicios ó puertos específicos

# Allow connections to SSH
iptables -I INPUT 1 -p tcp --dport 22 -m state --state NEW -j ACCEPT
# Allowing connections to HTTP/HTTPS
iptables -I INPUT 1 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 443 -m state --state NEW -j ACCEPT

Permitir tráfico ICMP

# Allow icmp input but limit it to 10/sec
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

Permitir tráfico desde la interfáz lo ó localhost

# Allow all incoming traffic from local
iptables -A INPUT -i lo -j ACCEPT

Ignorar todo tráfico no definido

# Changing the default policy for INPUT chain
iptables -P INPUT DROP

Al finalizar debemos guardar el archivo. El contenido del script debe lucir así:

Creando un script básico de Iptables

Ejecutar nuestro script de Iptables

Para ejecutar nuestro script, necesitamos cambiarnos al usuario root.

sudo su

Luego cambiar los permisos del script, para que este pueda ser ejecutado.

chmod +x iptables-script.sh

Para ejecutarlo escribiremos el siguiente comando:

sh iptables-script.sh

Guardar nuestra configuración con el comando iptables-save

Una vez hemos ejecutado el script, podemos exportar la configuración del firewall hacia un formato que iptables reconoce. Para esto utilizamos el siguiente comando:

iptables-save > /etc/iptables.rules

El formato del contenido del archivo es el siguiente:

# Generated by iptables-save v1.4.14 on Sun May 18 18:57:04 2014
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [36:3696]
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m limit --limit 10/sec -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
COMMIT
# Completed on Sun May 18 18:57:04 2014

Guardar nuestra configuración con el comando iptables-save

Restaurar la configuración de iptables desde un archivo generado con iptables-save

Para restaurar una configuración utilizamos el comando iptables-restore.

iptables-restore < /etc/iptables.rules

#!/bin/sh
## SCRIPT de IPTABLES – ejemplo del manual de iptables
echo -n Aplicando Reglas de Firewall…

## FLUSH de reglas
# Vider les tables actuelles
iptables -t filter -F

# Vider les règles personnelles
iptables -t filter -X

# Interdire toute connexion entrante et sortante
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

# SSH In
iptables -t filter -A INPUT -p tcp --dport 9888 -j ACCEPT

# SSH Out
iptables -t filter -A OUTPUT -p tcp --dport 9888 -j ACCEPT

# DNS In/Out
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

# A nuestra IP le dejamos todo
iptables -A INPUT -s 192.162.69.71 -j ACCEPT
iptables -A OUTPUT -d 192.162.69.71 -j ACCEPT

# WEB 80
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT

# WEB SSL 443
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT

# Mail SMTP:25
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

# Mail SMTP:587
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT

# Mail POP3:110
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT

# Mail IMAP:143
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT

# Mail IMAPS:143
iptables -t filter -A INPUT -p tcp --dport 993 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 993 -j ACCEPT

# Mail POP3S:995
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT