iptables (Español)
Artículos relacionados
Iptables es un poderoso firewall integrado en el kernel de Linux y que forma parte del proyecto netfilter. Iptables puede ser configurado directamente, como también por medio de un frontend[broken link: invalid section] o una GUI[broken link: invalid section]. iptables es usado por IPv4, en tanto que ip6tables es usado para IPv6.
nftables está programada para ser liberada con el kernel de Linux 3.13, y vendrá a sustituir definitivamente iptables como la principal utilidad de cortafuegos de Linux. Por ahora, un howto está disponible aquí.
Instalación
Todos los kernels de serie de Arch Linux son compatibles con iptables. Solo necesita instalar las herramientas en el espacio de usuario, que son proporcionadas por el paquete iptables presente en los repositorios oficiales.
Conceptos básicos
Tablas
iptables cuenta con cinco tablas, que son zonas en las que una cadena de reglas se puede aplicar:
-
raw
filtra los paquetes antes que cualquier otra tabla. Se utiliza principalmente para configurar exenciones de seguimiento de conexiones en combinación con el targetNOTRACK
. -
filter
es la tabla por defecto (si no se pasa la opción-t
). -
nat
se utiliza para la yraducción de dirección de red (por ejemplo, el redirección de puertos). Debido a las limitaciones en iptables, el filtrado no se debe hacer aquí. -
mangle
se utiliza para la alteración de los paquetes de red especializados (véase Mangles packet). -
security
se utiliza para reglas de conexión de red Mandatory Access Control.
Cadenas
Las tablas contienen cadenas, que son listas de reglas que ordenan los paquete de red. Por defecto, la tabla filter
contiene tres cadenas integradas: INPUT
, OUTPUT
y FORWARD
.
- Todo el tráfico entrante, dirigido a la máquina, se hace pasar a través de la cadena
INPUT
. - Todo el tráfico saliente, generado localmente, pasa a través de la cadena
OUTPUT
- Todo el tráfico enrutado, que no se ha suministrado localmente, pasa a través de la cadena
FORWARD
.
Véase man 8 iptables
para obtener una descripción de las cadenas integradas en otras tablas.
El usuario puede definir las reglas de las cadenas para hacerlas más eficientes.
Las cadenas compiladas tienen un target predefinido, que se utiliza si no hay reglas definidas. Ni las cadenas compiladas ni las definidas por el usuario pueden ser un target predefinido.
Reglas
El filtrado de los paquetes de red se basa en rules -reglas-, que se especifican por diversos matches -«coincidencias»- (condiciones que el paquete debe satisfacer para que la regla se puede aplicar), y un target -«objetivo» (acción a tomar cuando el paquete coincide con la condición plenamente). Si bien las condiciones individuales suelen ser muy simples, la especificación de la regla completa puede ser muy compleja.
Los targets se especifican mediante la opción -j
o --jump
. Los targets pueden ser tanto las cadenas definidas por el usuario, como uno de los targets integrados especiales, o una extensión de target. Los targets integrados son ACCEPT
, DROP
, QUEUE
y RETURN
; las extensiones de target son, por ejemplo, REJECT
y LOG
. Si el target es un target integrado, el destino del paquete es decidido inmediatamente y el procesamiento del paquete red en la tabla actual se detiene. Si el target es una cadena definida por el usuario y el paquete supera con éxito esta segunda cadena, se moverá a la siguiente regla de la cadena inicial. Las extensiones de target pueden ser tanto terminating (como los targets integrados) como non-terminating (como las cadenas especificadas por el usuario), Véase man 8 iptables-extensions
para obtener más detalles
Módulos
Hay muchos módulos que pueden ser utilizados para reforzar iptables, como connlimit, conntrack, limit y recent. Estos módulos añaden funcionalidad extra al permitir reglas de filtrado avanzadas.
Configuración
Desde la linea de órdenes
Mostrar las reglas vigentes
Puede comprobar el ruleset1 en uso y el número de paquetes de red que ha satisfecho cada regla usando la orden:
# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0K packets, 0 bytes) pkts bytes target prot opt in out source destination
Si la salida se parece a lo anterior, significa que no hay reglas establecidas. Nada está bloqueado.
Para mostrar los números de línea cuando se listan reglas, añada --line-numbers
a esa entrada. Esto es útil cuando se eliminan y añaden reglas individuales.
1 Los «rulesets» son una agrupación de conjuntos de reglas que funcionan a modo de «subrutina» de cualquier lenguaje de programación.
Modificar las reglas
Las reglas pueden ser añadidas o bien como un apéndice a las reglas o a las cadenas, o insertarlas en una específica posición en la cadena. Exploraremos ambos métodos.
Primero de nada, nuestro equipo no es un router (salvo que, por supuesto, lo sea). Cambiaremos la política, por defecto, en la cadena FORWARD
, de ACCEPT
a DROP
.
# iptables -P FORWARD DROP
El servicio LAN de sincronización de Dropbox tiene la característica de transmitir paquetes de red cada 30 segundos a todos los equipos que estén en su área inalámbrica. Si estamos en una zona LAN con clientes de Dropbox y no usamos esta característica, entonces podríamos quererla para rechazar los paquetes.
# iptables -A INPUT -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
Ahora, supongamos que decidimos utilizar Dropbox e instalarlo en nuestro ordenador. También queremos la sincronización LAN, pero solo con una IP en particular en nuestra red. Así que debemos utilizar -R
para sustituir nuestra antigua regla. Donde 10.0.0.85
es nuestra otra IP:
# iptables -R INPUT 1 -p tcp --dport 17500 ! -s 10.0.0.85 -j REJECT --reject-with icmp-port-unreachable
# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT tcp -- * * !10.0.0.85 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
Hemos reemplazado nuestra regla original con otra que nos permite usar 10.0.0.85
para acceder al puerto 17500
de nuestro equipo. Pero ahora nos damos cuenta de que este no es escalable. Si un usuario amigable de Dropbox está intentando acceder al puerto 17500
de nuestro dispositivo, se debe permitir acceder de inmediato, sin comprobación frente a cualquier regla de firewall que esté detrás.
Así que escribimos una nueva regla para permitir que nuestro usuario de confianza acceda inmediatamente. Utilizaremos -I
para insertar la nueva regla antes de la antigua:
# iptables -I INPUT 1 -p tcp --dport 17500 -s 10.0.0.85 -j ACCEPT -m comment --comment "Friendly Dropbox"
# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 10.0.0.85 0.0.0.0/0 tcp dpt:17500 /* Friendly Dropbox */ 2 0 0 REJECT tcp -- * * !10.0.0.85 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
Y reemplazar nuestra segunda regla con otra que rechace todo lo demás que entre al puerto 17500
:
# iptables -R INPUT 2 -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
La lista de nuestra regla final ahora se vería así:
# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 10.0.0.85 0.0.0.0/0 tcp dpt:17500 /* Friendly Dropbox */ 2 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
Restablecer las reglas
Puede vaciar y restablecer la configuración, por defecto, de iptables utilizando las siguientes órdenes:
# iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # iptables -t mangle -F # iptables -t mangle -X # iptables -t raw -F # iptables -t raw -X # iptables -t security -F # iptables -t security -X # iptables -P INPUT ACCEPT # iptables -P FORWARD ACCEPT # iptables -P OUTPUT ACCEPT
La orden -F
sin argumentos vuelca todas las cadenas en su tabla actual. Del mismo modo, -X
elimina todos las cadenas vacías no predeterminadas en una tabla.
Las cadenas individuales pueden ser eliminados o borrados con -F
y -X
seguidas de un argumento [chain]
.
Archivo de configuración
Las reglas iptables son, por defecto, almacenadas en /etc/iptables/iptables.rules
. Este archivo es leído por iptables.service
:
# systemctl enable iptables.service # systemctl start iptables.service
Las reglas iptables para ipv6 son, por defecto, almacenadas en el archivo /etc/iptables/ip6tables.rules
, el cual es leido por ip6tables.service
. Puede iniciarlo de la misma manera que el anterior.
Después de añadir las reglas a través de línea de órdenes, el archivo de configuración no se cambia automáticamente, tiene que guardarlo de forma manual:
# iptables-save > /etc/iptables/iptables.rules
Si modifica el archivo de configuración de forma manual, tiene que volver a cargarlo:
# systemctl reload iptables
Guías
Registro
El target LOG
se puede utilizar para registrar los paquetes de red que satisfacen una regla. A diferencia de otros targets, como ACCEPT
o DROP
, el paquete de red continuará moviéndose a través de la cadena después de alcanzar un target LOG
. Esto significa que, para activar el registro de todos los paquetes de red perdidos, se tendría que agregar una regla LOG
duplicada antes de cada regla DROP. Como esto reduce la eficiencia y hace que las cosas sean menos simples, se puede crear, en su lugar, una cadena logdrop
.
Cree la cadena con:
# iptables -N logdrop
Después, defínala:
## /etc/iptables/iptables.rules *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] ... other user defined chains .. ## logdrop chain :logdrop - [0:0] -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG -A logdrop -j DROP ... reglas ... ## log AND drop packets that hit this rule: -A INPUT -m state --state INVALID -j logdrop ... más reglas ...
Limitar el tamaño del registro
El módulo limit se debe usar para prevenir que el registro de iptables se haga demasiado grande o haga que el disco duro se escriba innecesariamente. Sin limitación, un atacante podría llenar el disco (o al menos la partición /var
) causando la saturación del registro de iptables.
-m limit
se utiliza para llamar al módulo limit. Puede usar --limit
para utilizar una tasa promedio y --limit-burst
para establecer una tasa de ráfaga («limit burst») inicial. Por ejemplo:
-A LOGDROP -m limit --limit 5/m --limit-burst 10 -j LOG
Esto agrega una regla a la cadena logdrop
que registra todos los paquetes de red que pasan a través de ella. Los primeros 10 paquetes serán registrados, y de ahí en adelante quedarán registrados únicamente 5 paquetes por minuto. El «limit burst» es restaurado a uno cada vez que la «tasa límite» no se supera.
syslog-ng
Asumiendo que usa syslog-ng, puede controlar donde será guardada la salida del registro de iptables de este modo:
filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };
a
filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
Esto evitará la salida del registro de iptables en el archivo /var/log/everything.log
.
Si quiere que el registro de iptables se vuelque en un archivo distinto de /var/log/iptables.log
, basta con cambiar el valor de destino de d_iptables
(siempre en el archivo syslog-ng.conf
)
destination d_iptables { file("/var/log/iptables.log"); };
ulogd
ulogd es un demonio especializado en el registro de los paquetes de red ejecutado en el espacio de usuario para netfilter que puede sustituir el target LOG
predeterminado. El paquete ulogd está disponible en el repositorio [community]
.
Véase también
- Port knocking
- Sitio web oficial de iptables
- Tutorial de iptables 1.2.2 por Oskar Andreasson
- iptables Debian Wiki de Debian