Documentos de Académico
Documentos de Profesional
Documentos de Cultura
iptables es el firewall que se utiliza en sistemas operativos basados en Linux. Aunque en los
últimos años tenemos instalado de forma predeterminada nftables, aún se puede utilizar la
sintaxis de iptables para configurar el cortafuegos en nuestro sistema operativo, como Debian,
Ubuntu e incluso el firewall del router si está basado en Linux. Conocer iptables es muy
importante para mantener protegida nuestra red local de intrusiones, esto se debe a que iptables
nos dará la posibilidad de permitir o denegar el tráfico que nosotros queramos. Hoy en
RedesZone os vamos a explicar cómo funciona iptables, y ejemplos de utilización avanzados.
Índice
Principales características de iptables
o Mejoras de rendimiento
o Calcular iptables
Funcionamiento y arquitectura
o Condiciones principales
Multiport
iprange
Connlimit
Conntrack
Limit
Recent
o NAT
Alternativas a iptables
o pfSense
o IPCop Firewall
o Shorewall
iptables es el cortafuegos incluido en sistemas Linux desde la versión 2.4, por lo tanto, está
incorporado de forma predeterminada en sistemas como Debian, Ubuntu, Linux Mint y
muchos otros, aunque actualmente de forma interna se utiliza nftables, porque iptables se
considera antiguo, aunque hoy en día todavía se utiliza iptables ampliamente en el mundo de
la administración de sistemas Linux y también en el mundo de la administración de redes.
Este cortafuegos dispone de varias tablas creadas de forma predeterminada, con el objetivo de
facilitar enormemente la posibilidad de añadir diferentes cadenas y reglas. Un detalle muy
importante, es que de forma predeterminada tenemos todo en «aceptar», es decir, todo el
tráfico se permite, no hay ninguna regla para denegar el tráfico, por lo tanto, en un primer
momento este firewall es permisivo, pero podemos cambiar la política predeterminada de
forma muy fácil y rápida.
Mejoras de rendimiento
Como puedes ver, Iptables son una solución muy buena para realizar configuraciones y
administración del firewall del sistema. Pero más allá de las configuraciones que podamos
llevar a cabo, Iptables es capaz de mejorar el rendimiento de nuestro sistema de una forma que
puede ser bastante significativa. Una de las formas en las cuales lo hace, es a través de la
configuración de la tasa de paquetes. Si estos cuentan con actividad limitada de ancho de
banda, se pueden establecer la cantidad de los mismos que se pueden enviar o recibir en un
tiempo determinado. Esto evita las sobrecargas del sistema, y asegura que el tráfico tenga una
distribución uniforme.
Otra de las formas en las cuales nos puede ayudar, es con las reglas de filtrado de paquetes. Si
conocemos el tráfico que es innecesario, se pueden establecer reglas para poder bloquearlo
antes de que llegue a entrar al sistema. Esto nos va a ayudar a reducir de forma considerable en
algunos casos, reducir la cantidad de tráfico que circula por la red, mejorando el rendimiento
de una forma generalizada. A esto le podemos sumar las reglas de enrutamiento, las cuales son
tremendamente útiles en gran cantidad de casos diferentes.
Cuando disponemos de redes muy complejas, con múltiples segmentos de red o rutas
diferentes, estas reglas de enrutamiento nos garantizan que los paquetes que circulan se envían
por la ruta más eficiente y directa posible. Esto reduce los tiempos de latencia y de nuevo,
mejora el rendimiento general de nuestra red. Por no hablar de todas las funciones avanzadas
para los controles de calidad QoS. Esta cuando tienen la configuración adecuada, puede
establecer prioridades para garantizar que se cumplen todos los requisitos de ancho de banda.
Por lo cual todas las aplicaciones de verán directamente beneficiadas en su rendimiento.
Uno de sus usos principales es analizar el tráfico para ver las características de los paquetes.
Para esto se implementa un cortafuegos que controla el tráfico.Por otro lado, también permiten
utilizar una tecnología tan importante como es la NAT, que se basa en la traducción de redes.
Se puede configurar un dispositivo para NAT con iptables, independientemente del Firewall.
Otra función interesante es la de marcar los paquetes. Esto se suele hacer con el uso de
iptables, para que esos paquetes pasen a otros programas, y estos en función de las etiquetas,
hacen una cosa u otra. Esto se realiza mediante mangle, que con el marcado, prepara los
paquetes para un procesamiento futuro.
Calcular iptables
El cálculo de iptables, implica que se deben definir las reglas en una tabla, y que sean
aplicadas a la entrada y salida del tráfico. Para ello se debe seguir un conjunto de cadenas
predefinidas, las cuales con INPUT, OUTPUT y FORWARD. Estas son las encargadas de
determinar el tráfico que se debe analizar. Pero para poder calcularlas, se deben conocer las
reglas de las mismas.
Criterios de procedencia: Se deben establecer las condiciones para que los paquetes
puedan aplicar las reglas. Esto incluye información como las direcciones IP de origen
y destino, así como los puertos, protocolos y otras características que puede tener un
paquete.
Acción: Se tiene que definir la acción que se va a tomar cuando se cumplan ciertos
criterios de coincidencia. Estas pueden ser ACCEPT, DROP y REJECT. Donde se
acepta el paquete, se rechaza o incluso se llega a descartar por completo.
Orden de las reglas: Debemos saber que las reglas se van a evaluar de forma
secuencial. Esto hace que el orden en el cual se establecen, sea sumamente importante,
ya que determinará la acción que se va a realizar primero. Lo más recomendable es
buscar un orden lógico, y que sea coherente con todas las demás reglas que se
establecen.
Pero eso no es todo, sino que para poder calcular las iptables, debemos tener en cuenta algunos
factores que son muy importantes.
Seguridad: Al fin y al cabo, las iptables se utilizan para proteger a los sistemas de
posibles amenazas externas. Por lo cual se debe pensar en la seguridad cuanto nos
encontramos manipulando este tipo de parámetros.
Funcionamiento y arquitectura
Este cortafuegos se basa en reglas que iremos introduciendo una tras otra, su funcionamiento
se basa en aplicar reglas que el propio firewall se encargue de ejecutar. Aunque en un primer
momento iptables pueda parecer sencillo de usar, si quieres hacerlo de forma avanzada, es más
complicado. A continuación, podéis ver un esquema resumido del funcionamiento de iptables.
Tabla nat: esta tabla se encarga de hacer el NAT, transformar la IP privada en pública
y al revés. Dentro de NAT tenemos tres cadenas: PREROUTING (altera los paquetes
antes de enrutarlos, aquí se hace el DNAT o reenvío de puertos), POSTROUTING
(altera los paquetes después de enrutarlos, aquí se hace el SNAT o MASQUERADE)
y OUTPUT (paquetes generados por el firewall que atravesará el NAT configurado).
Tabla mangle: esta tabla se encarga de hacer la alteración de los paquetes, es donde se
configura el QoS para la calidad del servicio, alterar cabeceras TCP etc. En esta tabla
tenemos las cinco cadenas: PREROUTING, INPUT, FORWARD, OUTPUT,
POSTROUTING.
Tabla raw: esta tabla no se suele usar porque los paquetes viajan sin estado de
conexión. Tenemos la cadena PREROUTING y OUTPUT.
Para hacer todo esto, utiliza algunas reglas de filtrado que nos indicarán que paquetes serán
aceptados y cuales rechazados o directamente, omitidos. Estas cadenas de datos la forman:
En la siguiente imagen podéis ver un pequeño resumen de las cadenas que tenemos en las
diferentes tablas:
El funcionamiento a la hora de añadir una regla es el siguiente:
Las reglas que incorporamos a las cadenas siempre tienen un objetivo (-j en la regla).
Las reglas se verifican en un orden secuencial, desde la primera regla hasta la última.
Es muy importante el orden, si bloqueamos todo primero y luego permitimos algo más
específico, bloquearemos todo el tráfico y la regla más específica no se comprobará.
Los objetivos que tienen las diferentes reglas son las siguientes:
ACCEPT: acepta el paquete y lo pasa al siguiente nivel, un servidor web, SSH, FTP
etc.
Como hemos mencionado y con respecto a las tablas mangle, iptables puede dar uso de la
NAT, que contará con sus propia tablas, mediante la que se indica las reglas para realizar el
enmascaramiento del paquete, redirigir puertos o cambiar alguna dirección de origen y
destino. Nos podemos encontrar:
sudo iptables -F
sudo iptables -X
Una vez que hayamos hecho esto, ya tendremos el firewall «reseteado» y con el permitir todo.
Ahora que ya sabemos cómo resetearlo, vamos a ver las diferentes órdenes.
Si quieres ver el contenido de las diferentes cadenas y reglas que tenemos en una determinada
tabla, a continuación, puedes ver cómo se verían:
-A, –append chain rule-specification Añadimos una nueva regla en una determinada
cadena
-C, –check chain rule-specification Comprobamos que existe una determinada regla en
una determinada cadena
-D, –delete chain rulenum Borramos la regla número X en una determinada cadena
-I, –insert chain [rulenum] rule-specification Insertamos una nueva cadena con un
número en una determinada tabla
-F, –flush [chain] Elimina todas las reglas de una determinada cadena.
-Z, –zero [chain [rulenum]] Pone los contadores de una determinada regla a 0.
-N, –new-chain chain Creamos una nueva cadena en una determinada tabla
-P, –policy chain target Aplicamos la política por defecto, se cumple cuando ninguna
regla de las cadenas se cumplen.
-v, –verbose Salida que se usa en conjunto con –L, sirve para mostrar más información
que lo que proporciona el comando –L.
-n, –numeric Las direcciones IP y los números de puertos aparecerán con números. Por
ejemplo si filtramos el puerto 80, con el –L típico aparecerá www, y no 80.
-x, –exact Muestra el valor exacto del contador de paquetes y bytes, en lugar de usar
K, M o G para los valores.
-s, –source address[/mask][,…] Dirección IP de origen del paquete. Podemos tener una
IP o una subred (indicando la máscara en formato CIDR). También podemos poner
nombres de host (dominios, webs etc), pero es una mala idea porque no es eficiente. Se
pueden especificar varias direcciones de origen, (192.168.1.1,192.168.1.2) pero creará
diferentes reglas para satisfacerlas.
-g, –goto chain. Sirve para reenviar el tráfico a otra cadena, pero a diferencia de jump,
no volverá a la cadena original por donde entró.
-i, –in-interface name. Nombre de la interfaz por donde un paquete se recibe. Solo vale
para las cadenas de entrada como INPUT, FORWARD y PREROUTING. Si ponemos
! Significa todas menos esa interfaz. Si ponemos un + al final del nombre, cualquier
interfaz con el inicio del nombre la cogerá para comprobarla. Imaginemos eth0, eth1 y
eth2. Si queremos poner las tres simplemente con poner eth+ es suficiente.
-o, –out-interface name. Nombre de la interfaz por donde un paquete sale. Solo vale
para las cadenas de salida como OUTPUT, FORWARD y POSTROUTING.
Condiciones solamente si usas TCP o UDP
Si utilizas el protocolo TCP o UDP, es posible que quieras filtrar por número de puerto origen
y/o destino, a continuación, tenéis los dos argumentos que puedes usar:
Existen muchas mas condiciones para una configuración avanzada del firewall, pero las
elementales ya las tenemos listadas.
Las políticas sirven para que cuando no se encuentra una regla dentro de la cadena, se ejecute
la política por defecto. La política por defecto de todas las cadenas es ACCEPT, pero hay dos
opciones: ACCEPT o DROP
Ejemplos:
Con esto nos quedaremos sin internet, por lo que a continuación debemos empezar a crear
reglas permisivas.
A continuación, podéis ver todas las políticas que tenemos en las diferentes tablas:
El parámetro -L muestra las reglas que tenemos configuradas. V permite recibir más
información sobre las conexiones y N nos devuelve las direcciones IP y sus correspondientes
puertos sin pasar por un servidor DNS.
iptables -L -n -v
Este es uno de los comandos más importantes para ver el estado del cortafuegos.
Es una extensión de iptables que nos da la posibilidad de agrupar reglas similares con
diferentes puertos TCP y UDP en una sola. Multiport permite poner varios puertos salteados, y
también varios puertos seguidos, el máximo es de 15 argumentos de puertos. Ejemplo:
Gracias a este módulo, tenemos la posibilidad de usar varios puertos en la misma regla.
iprange
iprange nos permite poner varias direcciones IP de origen o destino de una vez, sin necesidad
de poner decenas de reglas. También permite poner tanto IP de origen como de destino, la
sintaxis es la siguiente:
[!]–src-range ip-ip
[!]–dst-range ip-ip
Connlimit
–connlimit-mask prefix_length . Marcamos por rango de subred (es igual que un host
haga 2 conexiones, que dos host de la misma subred hagan 1 conexión cada uno).
Por ejemplo, imaginemos que queremos permitir dos conexiones SSH por cliente únicamente:
Conntrack
Este módulo sirve para realizar un tracking de las conexiones, sirve para gestionar la entrada y
salida de paquetes antes y después del establecimiento de la conexión. Dentro de este módulo
hay varias opciones, pero la más importante es -ctstate que nos permite aceptar o denegar
diferentes tipos de paquetes. Dentro de ctstate tenemos varios estados, destacan los siguientes:
ESTABLISHED: Conexiones establecidas, pasan primero por NEW ya que han tenido
respuesta
RELATED: Paquete que está relacionado a una conexión existente, pero que no es
parte de ella, como FTP pasivo.
Imaginemos que queremos acceder a cualquier sitio, sin embargo, no queremos que
absolutamente nadie acceda a nosotros.
El módulo limit nos permite limitar, tanto tráfico, como número de logs a escribir en el syslog
como intentos de conexión. Tiene dos argumentos principalmente:
–limit-burst N . Indica la ráfaga más larga que se puede producir antes de comprobar el
límite –limit.
La primera vez que se alcanza esta regla, se registran los primeros cinco paquetes.
Después, pasarán veinte minutos antes de que vuelva a registrarse un paquete con esta
regla (3 coincidencias entre 60 minutos igual a 20 minutos, ya que es MEDIA).
Además, cada veinte minutos que pasen sin que un paquete alcance la regla, la ráfaga
recuperará un paquete.
Si no sucede nada durante 100 minutos, la ráfaga quedará completamente recargada;
de vuelta entonces a la situación inicial.
Recent
El módulo recent sirve para limitar el número de conexiones por segundo a nivel de IP, esto es
ideal para protegernos de ataques al puerto SSH porque un atacante probará múltiples
contraseñas. Por ejemplo, si queremos proteger nuestro SSH, podríamos ejecutar la siguiente
regla:
iptables -A INPUT -p tcp –dport 22 -m conntrack –ctstate NEW -m recent –set –name
ssh –rsource
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –rcheck –seconds
60 –hitcount 4 –name ssh –rsource -j DROP
Esta regla permite solamente hacer cuatro intentos de conexión al cabo de 60 segundos, es una
ventana «deslizante».
NAT
Este firewall también se encarga de hacer NAT de nuestra conexión. Para hacer el NAT de
nuestra IP pública (o interfaz que tenga esta IP pública), debemos poner:
Para abrir puertos tenemos que añadir una regla en la cadena PREROUTING de la tabla NAT.
iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 22 -j DNAT –to-destination
192.168.1.1
La tabla PREROUTING también nos permite modificar los puertos al vuelo, de tal forma que
si recibimos paquetes en el puerto 2121, lo podemos transformar al 21.
Una vez que ya conocemos en detalle este cortafuegos, vamos a ver los ejemplos básicos de
utilización y también los más avanzados.
Bloquear toda la subred 192.168.2.0/24 para que no realicen ninguna comunicación a nuestro
servidor, excepto la dirección IP 192.168.2.20 que sí se permitiría:
Bloquear las direcciones IP 192.168.4.51 y 192.168.4.52 para que nosotros no podamos hacer
ninguna comunicación:
Bloquear la dirección IP 192.168.1.10 para realizar ping desde nuestro nuestro servidor:
Bloquear las direcciones IP 192.168.4.51 y 192.168.4.52 para que nosotros no podamos hacer
ping.
Tal y como podéis ver, el funcionamiento es bastante sencillo con las reglas basadas en IP con
origen y destino. También podríamos usar el módulo iprange para configurar un rango de IPs:
También podemos filtrar de forma más avanzada el protocolo ICMP. Imaginemos que
tenemos un usuario que quiere poder hacer ping a cualquier host, pero sin embargo, no quiere
que NADIE le pueda hacer ping a él. ¿Cómo lo podemos hacer con iptables si el propio PING
tiene comunicación bidireccional?
Bloquear el tráfico saliente por la interfaz eth0 (únicamente), por lo tanto permitir el acceso
eth1.
Permitir cualquier tipo de tráfico entrante y saliente por eth0, y denegar cualquier tráfico
entrante o saliente por eth1.
Si quieres empezar a ver cómo funciona el protocolo TCP y UDP, a continuación tenéis
algunos ejemplos:
Bloquear el acceso web a www.google.es y permitir todo lo demás (ping) por ejemplo.
Bloquear el acceso DNS a 8.8.8.8 y permitir todo lo demás (ping) por ejemplo.
Tenemos un servidor DNS en nuestro servidor. Queremos que solo los equipos de la subred
192.168.1.0/24 se puedan comunicar con él, y bloquear todos los demás accesos.
Bloquear el acceso a nuestro servidor web, del rango de IP 192.168.100.0/24, que proviene de
la interfaz eth0.
Bloquear el acceso a nuestro servidor ssh, del rango de IP 192.168.100.0/24, que proviene de
la interfaz eth1.
Denegar hasta la conexión número 5 en web que realice un cliente (no tiene mucho sentido
pero es un ejemplo).
Permitir únicamente 10 conexiones Telnet por cliente (hacerlo de otra manera al anterior).
Permitir únicamente 20 conexiones HTTP por cada cliente, en cuanto se supere mandamos un
TCP Reset.
O este forma:
Tal y como podéis ver, este firewall es realmente completo y podremos hacer una gran
cantidad de configuración muy avanzadas, para controlar en detalle todas las conexiones
entrantes y salientes.
También cabe recordar que los cambios que podamos realizar en la configuración de iptables,
son efímeros, por lo cual debemos guardarlos para que estos persistan tras posibles reinicios
que se puedan producir en el servidor.
Alternativas a iptables
El mercado de firewalls está lleno de opciones, las cuales varían mucho en características. Por
lo cual, si no te acaba de convencer, o necesitas algo que este no te ofrece, vamos a ver
algunas alternativas.
pfSense
Es una aplicación de firewall de código abierto y basada en el sistema operativo FreeBSD. Se
utiliza para crear reglas de firewall dedicadas, siendo muy fiable y ofreciendo diferentes
características que hacen de él uno de los más famosos y comerciales. Entre sus principales
características podemos destacar:
Se trata de una distribución de Linux, y está muy enfocado a sistemas domésticos y pequeñas
empresas u oficinas. Es muy sencillo de utilizar por lo cual es accesible, y se puede utilizar
como una VPN, por lo cual se pueden reducir costes en este sentido. Entre sus características
más destacadas podemos ver:
Se trata de una herramienta donde poder configurar un firewall o un Gateway para Linux. Es
una herramienta de alto nivel, por lo cual se necesitan ciertos conocimientos para poder
configurar filtros de red y establecer los requisitos del firewall. Este puede realizar lecturas de
archivos de configuración gracias a la ayuda de iptables. Entre sus principales características
se pueden destacar:
Permite configurar Netfliter para que coincida con los requisitos establecidos.
Este va a supervisar todo el tráfico de la red, y tiene permisos para realizar bloqueos cuando él
lo considere necesario. Que la gran mayoría de los equipos de hoy en día esté conectado a
internet, hace que esto sea vital. Un atacante puede realizar sondeos de equipos que cumplen
algunos requisitos concretos, y determinar de esta forma, si son atacables o no. Una vez es
detectada una posible víctima, pueden tratar de atacar los sistemas de diferentes formas. Si
llegados al punto de que esta toma el control de nuestro equipo, puede obligar a nuestro
equipo a hacer prácticamente lo que él quiera. Por lo general, es aprovecharse de la
información personal del usuario atacado, y así cometer algún tipo de fraude. Y esto puede
ocurrir sin que el usuario pueda detectarlo, sin darse cuenta.
Por ello necesitamos un firewall. Pero podemos estar tranquilos, porque hoy en día, casi todos
los sistemas operativos traen esta herramienta de seguridad incorporada. En el caso de
Windows, no solo tendremos el Firewall, si no que este incorpora un antivirus llamado
Windows Defender. Si le damos al ordenador un uso normal, lo más probable es que esto sea
suficiente. Pero la cosa puede cambiar rápidamente si es un entorno empresarial. En estos
casos, es más recomendable utilizar firewalls más profesionales, o incluso plantearse instalar
uno por hardware.