Introducción a Iptables 2014-05-18

Tutorial de introducción a Iptables donde podrás aprender la sintaxis y su implementación. Sin duda algo importante para asegurar el tráfico de red hacia nuestro servidor.

En este nanotutorial vamos a aprender acerca de un software firewall preinstalado en cualquier distribución Gnu/Linux a traves de Netfilter.

Introducción a Iptables

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

Acerca del autor

Hugo Gilmar Erazo Full Stack Web Developer

Soy un desarrollador web con más de 10 años de experiencia. Me considero fanático de GNU/Linux, lo cual me ha permitido complementar mis conocimientos en el desarrollo web con la administración de servidores.

Aunque manejo todo lo relacionado al Front-End, me inclino más por el desarrollo Back-End. También desarrollo aplicaciones móviles híbridas. Me gusta lo que hago.

Compartir este artículo