En este momento estás viendo Iptables, como configurar un servidor firewall

Iptables, como configurar un servidor firewall

Iptables, como configurar un servidor firewall

Iptables y nftables son componentes del proyecto Netfilter, una comunidad de desarrolladores de software. Son herramientas de administración del nucleo de Linux y disponible en prácticamente todas las distribuciones GNU/Linux y BSD, para filtrar, modificar y redirecionar paquetes basados en el Protocolo de Internet versión 4 «IPv4». Ya disponemos de una versión de iptables para IPv6, llamada ip6tables. Vamos a analizar las iptables en este artículo.

Esta herramienta está integrada en el propio sistema operativo, permitiendo implementar firewalls a nivel de kernel, mediante la ejecución de comandos que establecen una serie de reglas. Las posibilidades de iptables son prácticamente infinitas y un administrador que quiera sacarle el máximo provecho, puede realizar configuraciones extremadamente complejas.

Sumario

  • Funcionamiento de Iptables
    • Tablas
    • Destinos de reglas o cadenas de reglas
    • Políticas Principales
    • Especificación de las reglas
  • Que es y cómo funciona el NAT
  • Cómo se implementan las iptables
  • Ejemplos de reglas de filtrado
    • Escenario simple
    • Escenario complejo

Funcionamiento de Iptables

Cuando llega un paquete, el kernel lee la cabecera de estos paquetes y las analiza para determinar si el paquete va dirigido a la propia máquina o hacia una tercera. Con las reglas establecidas en las tablas, el cortafuegos, lo deja pasar o no, y puede modificar algunos campos de dichas cabeceras antes de enrutarlo de nuevo (NAT)

Iptables trabaja con tablas, que nos permiten sustituir campos como la IP_origen o la IP_destino, filtrar según algún campo, como por ejemplo el puerto o protocolo. Las reglas se agrupan en cadenas. Una cadena es un conjunto de reglas para paquetes IP, que determinan lo que se debe hacer con ellos. Veamos los tipos de tablas de que disponemos.

Tablas

Iptables tiene tres tipos de tablas incorporadas, cada una de las cuales contiene ciertas cadenas predefinidas. El administrador puede crear y eliminar cadenas definidas por usuarios dentro de cualquier tabla. Inicialmente, todas las cadenas están vacías y tienen una política de destino que permite que todos los paquetes pasen sin ser bloqueados o alterados.

  • NAT: permite modificar las direcciones origen y destino de los paquetes que pasan a través de ella. El primer paquete en cualquier conexión pasa a través de esta tabla; los veredictos determinan cómo van a reescribirse todos los paquetes de esa conexión.
    • SNAT: utilizada para modificar las direcciones origen
    • DNAT: utilizada para modificar las dirección y puertos destino
  • FILTER: permite aceptar o descartar paquetes en función de unas reglas de filtrado (dirección, puerto, protocolo, etc). Todos los paquetes pasan a través de la tabla de filtros.
  • MANGLE: no es muy utilizada, se emplean para modificaciones especiales de los paquetes, como el campo TTL, etc. Esta tabla es la responsable de ajustar las opciones de los paquetes, como por ejemplo la calidad de servicio.

Destinos de reglas o cadenas de reglas

Iptables, cuenta con las siguientes listas o cadenas de reglas que serán recorridas por los paquetes que tienen como origen la propia máquina o bien, la atraviesan

PREROUTING: todos los paquetes entrantes que atraviesen la interfaz física de la máquina. Solo puede tener reglas de tipo DNAT (destination-NAT)
INPUT: Los paquetes que llegan a la máquina y tienen como dirección destino la propia máquina. Sólo puede tener reglas de tipo FILTER
FORWARD: Los paquetes que llegan a la máquina y no tienen como dirección destino la propia máquina, después de pasar por la cadena PREROUTING, recorrerá la lista FORWARD. Solo pueden contener reglas de tipo FILTER
OUTPUT: Los paquetes generados por la propia máquina en cualquier proceso local. El paquete tiene como dirección origen la propia máquina. Solo puede tener reglas de tipo DNAT y FILTER
POSTROUTING: Los paquetes salientes pasan por esta cadena después de haberse tomado la decisión del enrrutamiento. Solo puede tener reglas de tipo SNAT (source-NAT)

Ruta que recorren los paquetes

Según los paquetes sean de entrada, salida o reenvío, serán comprobados por las cadenas INPUT, si las tramas o paquetes están destinados a la propia máquina, OUTPUT, generados por ésta o FORWARD reenviados, o enrutados, por ésta hacia otra red.

Tratamiento de los paquetes

Políticas Principales

Cuando creamos una regla, ésta forzosamente ha de tener asociada un tipo de política. Es decir, hay que indicar el comportamiento que ha de tener.

ACCEPT: se aceptan todos los paquetes que concidan con las directivas definidas en la regla. Un paquete que se acepta en la cadena de INPUT se le permite ser recibido por el sistema (host), un paquete que se acepta en la cadena de OUTPUT se le permite abandonar el sistema y un paquete que se acepta en la cadena de FORWARD se le permite ser encaminado (routing) a través del sistema.
DROP: se descartan los paquetes que coincidan con las directivas definidas en la regla. No envía ningún tipo de aviso al origen de la conexión.
REJECT: se descartan los paquetes que cumplan las directivas, pero se devuelve un error de tipo de conexión no aceptada a la dirección de donde provienen los paquetes «icmp-port-unreachable»
SNAT: se cambia la dirección de origen de los paquetes. Opcionalmente se puede cambiar el puerto
DNAT: se cambia la dirección destino de los paquetes y/o el puerto destino
MASQUERADE: En vez de cambiar la regla de SNAT cada vez que la dirección IP cambia, se calcula la dirección IP de origen a la cual hacer NAT, fijándose en la dirección IP de la interfaz de salida cuando un paquete coincide con esta regla. Adicionalmente, recuerda que conexiones usan MASQUERADE y si la dirección de la interfaz cambia (por ejemplo, por reconectarse al ISP), todas las conexiones que hacen NAT a la dirección vieja se olvidan.

Especificación de las reglas

Las reglas las establecemos con comandos, aunque podemos utilizar una interfaz gráfica de Pfsense. Para ello tenemos opciones que determinan qué hacer con los paquetes que son comparados por la regla. Los más usados son

  • -A –append agregar especificación de regla.
  • -D –delete Borrar una regla de la cadena
  • -I –insert Insertar una regla en la cadena
  • -R –replace Reemplazar una regla de la cadena.
  • -p –protocol Establecemos el protocolo al que se le aplicará la regla
  • -s –source Origen del paquete. Puede ser nombre de red, hostname o IP
  • -d –destination Destino del paquete
  • -j –jump especifica el objetivo de la regla; es decir, qué hacer si el el paquete coincide con él.
  • -i –in-interface Filtramos por el nombre de una interfaz de entrada
  • -o –out-interface Filtramos por el nombre de una interfaz de salida
  • -m –match Especifica una coincidencia para usar

Puedes encontrar mucha más información en el manual de la herramienta, ejecutando

man iptables
Manual de iptables

Que es y cómo funciona el NAT

NAT «Network Address Translation» surgió como consecuencia del agotamiento de las direcciones IPv4. Con NAT se consigue que redes de ordenadores utilicen un rango de direcciones especiales (IPs privadas) y se conecten a Internet usando una única dirección IP (IP pública).

Funcionamiento de NAT

NAT tiene varios tipos de funcionamiento:

Estática

Una dirección IP privada se traduce siempre en una misma dirección IP pública. El equipo seria visible desde internet.

Dinámica

En este caso el router tiene varias IPs públicas asignadas. Los equipos de la red, para conectarse a la internet, utilizarán una IP u otra según se configure. Aporta seguridad ya que las direcciones IP públicas van cambiando.

Sobrecarga

La NAT con sobrecarga o PAT (Port Address Translation) es el utilizado en los hogares. Tenemos una sola IP pública y todos los equipos de nuestra LAN saldrán a internet con esa IP, con lo que evitamos contratar más de una dirección IP pública.

Solapamiento

Cuando una dirección IP privada de una red es una dirección IP pública en uso, el router se encarga de reemplazar dicha dirección IP por otra para evitar el conflicto de direcciones.

Protocolo NAT

NAT permite ahorro de direcciones IPv4, al poder repetirse esta en diferentes redes privadas, aporta seguridad al hacer invisibles las máquinas de la LAN al exterior y nos permite, modificando la tabla de reenvío del router, desviar el tráfico a otra máquina para hacer mantenimiento.

Por contra plantea algún problema. El router necesita potencia de computación, ya que tiene que volver a calcular el «checksum» de cada paquete que modifica. Y no todos los protocolos y aplicaciones son compatibles con NAT.

Cómo se implementan las iptables

En primer lugar debemos saber que para permitir el enrutado de paquetes en el kernel de GNU/Linux hay que activarlo en el fichero «ip_forward», dándole un valor 1, ejecutando

echo 1 > /proc/sys/net/ipv4/ip_forward

Hay dos maneras de implementar un firewall, según la política por defecto a seguir

  • Política por defecto ACEPTAR: en principio todo lo que entra y sale por el firewall se acepta y solo se denegará lo que se diga explícitamente.
  • Política por defecto DENEGAR: todo esta denegado, y solo se permitirá pasar por el firewall aquellos paquetes que se permitan explícitamente. Esta configuración de firewall es la recomendada, pero no es recomendable implementarla si no dominas mínimamente el sistema.

Nota: Es determinante el orden en el que se definen las reglas del firewall. Normalmente, cuando hay que decidir que se hace con un paquete, se va leyendo secuencialmente cada regla del firewall hasta que se encuentra una que le afecta (match), y se hace lo que establezca esta regla (aceptar o denegar), después de eso NO SE MIRARÁN MÁS REGLAS para ese paquete. Se aplicará esta regla y no seguirá leyendo. Por eso es importante el orden de las reglas. Si ponemos reglas muy permisivas entre las primeras del firewall, puede que las siguientes no se apliquen y no sirvan de nada.

Cuando establecemos las reglas, estas se aplican a la sesión, no son persistentes y se perderán tras un reinicio. Para evitarlo podemos instalar el paquete «iptables-persistent» y guardar las reglas en /etc/iptables/rules.v4 o v6

aptitude install iptables-persistent

iptables-save > /etc/iptables/rules.v4
o
ip6tables-save > /etc/iptables/rules.v6

No obstante, lo más práctico es crear un script en el que dispondremos la secuencia de reglas que queremos aplicar en nuestro sistema. Vamos a ver una implementación sencilla aplicando la política «ACCEPT», por defecto y luego un escenario más complejo.

Escenario simple

Tenemos el siguiente escenario.

Escenario simple

Como vemos, tenemos una LAN, protegida por un cortafuegos situado entre el router y esta. La dirección de la LAN es 192.168.10.0/24. A continuación se aporta el código con sus explicaciones.

#!/bin/sh
# Script de configuración de las iptables del cortafuegos.
#
# Borramos todas las reglas que puedan existir
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

# Definimos la politica por defecto en ACEPTAR
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

# Aceptamos todas las comunicaciones por la interfaz lo (localhost)
iptables -A INPUT -i lo -j ACCEPT

# Aceptamos las comunicaciones que nos interesan y luego denegamos el resto.

# Ejemplo: Denegamos acceso al una segunda red 192.168.11.0/24
iptables -A FORWARD -s 192.168.11.0/24 -j DROP

# Para poder aceptar correo-e y conexiones ftp, abrimos los puertos 25, 110, 20 y 21.
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 25 -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 110 -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 20 -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 21 -j ACCEPT

# Para el servidor web [HTTP y HTTPS] aceptamos las solicitudes.
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 443 -j ACCEPT

# Si instalamos un servidor DNS no serán necesarias las siguientes lineas
# Dejamos comentadas las líneas (tcp y udp), por si algún día las necesitamos
#iptables -A FORWARD -s 192.168.10.0/24 -p tcp --dport 53 -j ACCEPT
#iptables -A FORWARD -s 192.168.10.0/24 -p udp --dport 53 -j ACCEPT

# Al PC que usamos habitualmente le damos acceso a todo (cliente VIP)
iptables -A FORWARD -s 192.168.10.11 -j ACCEPT

# Denegamos resto de comunicaciones (no funcionará nada más que lo que hemos definido arriba)
iptables -A FORWARD -s 192.168.10.0/24 -j DROP

# Hacemos NAT si IP origen 192.168.10.0/24 y salen por eth0
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

# Activamos el enrutamiento
echo 1 > /proc/sys/net/ipv4/ip_forward

# Comprobamos cómo quedan las reglas
iptables -L -n

Lo ideal es configurárlo para que siempre que se ejecute en el reinicio del equipo, con Cron o Initd. Puedes ver como en «Programar tareas con at y cron»

Escenario complejo

En este caso tenemos, dentro de la DMZ, protegida por el cortafuegos, Un proxi inverso, un DNS y varios servidores web, ftp y bases de datos. Puedes ver la implementación de esta en varios artículos en el enlace a «Paperless».

Definimos unas variables para asignarlas a IP pública, a la DMZ y LAN. También las interfaces, incluyendo la interfaz para la VPN. En este escenario, adoptaremos la política por defecto de denegar todo.

Escenario complejo

Vemos el código con sus explicaciones.

#!/bin/bash

## Definicion variables

ip_publica="10.3.4.217"
dmz_net="172.20.117.0/24"
lan_net="192.168.117.0/24"
dmz_iface="eth1"
lan_iface="eth2"
wan_iface="eth0"
vpn_iface="tun0"

## Borrar iptables anteriores

iptables -F
iptables -t nat -F

##### Tabla filter #####

## POLITICAS ##
### Definimos la politica por defecto en "DENEGAR" todo.

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

## INPUT ##
### Aceptamos comunicaciones TCP a los puertos 22 y 2222, aquellas que ya esten establecidas y VPN.

iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 2222 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i $vpn_iface -j ACCEPT

## FORWARD ##
### Establecemos las reglas para atravesar el cortafuegos en función de interfaces, protocolos y puertos, incluido el DNS. 
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s $lan_net -i $lan_iface -o $wan_iface -j ACCEPT
iptables -A FORWARD -s $dmz_net -i $dmz_iface -o $wan_iface -j ACCEPT
iptables -A FORWARD -i $vpn_iface -j ACCEPT
iptables -A FORWARD -o $vpn_iface -j ACCEPT
iptables -A FORWARD -i $wan_iface -o $dmz_iface -p udp -m udp --dport 53 -d 172.20.117.53 -j ACCEPT
iptables -A FORWARD -i $wan_iface -o $dmz_iface -p tcp -m tcp --dport 80 -d 172.20.117.53 -j ACCEPT
iptables -A FORWARD -i $wan_iface -o $dmz_iface -p tcp -m tcp --dport 443 -d 172.20.117.53 -j ACCEPT

##OUTPUT##
### Establecemos las reglas para atravesar el cortafuegos de salida
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 1195 -j ACCEPT
iptables -A OUTPUT -o $vpn_iface -j ACCEPT

##El puerto 1195 se utiliza para el servidor de almacenamiento en alta disponibilidad ZFS. (Contenedores) 

#################### TABLA NAT #######################

## POSTROUTING ##

iptables -t nat -A POSTROUTING -o $wan_iface -j MASQUERADE

## PREROUTING ##

iptables -t nat -A PREROUTING -i $wan_iface  -p udp  --dport 53 -j DNAT --to-destination 172.20.117.53
iptables -t nat -A PREROUTING -i $wan_iface  -p tcp  --dport 80 -j DNAT --to-destination 172.20.117.53
iptables -t nat -A PREROUTING -i $wan_iface  -p tcp  --dport 443 -j DNAT --to-destination 172.20.117.53
iptables -t nat -A PREROUTING -i $wan_iface  -p tcp  --dport 22 -j DNAT --to-destination 172.20.117.80

#iptables -t nat -A POSTROUTING -o $wan_iface -i $dmz_iface  -j SNAT --to-source $ip_publica
#iptables -t nat -A POSTROUTING -o $wan_iface -i $lan_iface  -j SNAT --to-source $ip_publica

#iptables -t nat -A POSTROUTING -o $wan_iface -p tcp --sport 80 -j SNAT --to-source $ip_publica
#iptables -t nat -A POSTROUTING -o $wan_iface -p tcp --sport 443 -j SNAT --to-source $ip_publica
#iptables -t nat -A POSTROUTING -o $wan_iface -p tcp --sport 22 -j SNAT --to-source $ip_publica

Si tienes algún comentario que hacer sobre este artículo, al pie del post tienes un formulario para hacerlo.

Si quieres contactar conmigo por cualquier otro asunto relacionado con el sitio, en la página de contacto, tienes un formulario más adecuado.

Y para suscribirte y recibir las novedades publicadas, tienes un enlace en el pie de la página o desde aquí mismo.

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.