Difference between revisions of "Iptables (Español)"

From ArchWiki
Jump to: navigation, search
(Véase también)
(flagged broken section links)
(Tag: wiki-scripts)
 
(10 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 
{{DISPLAYTITLE:iptables (Español)}}
 
{{DISPLAYTITLE:iptables (Español)}}
 
[[Category:Firewalls (Español)]]
 
[[Category:Firewalls (Español)]]
 +
[[de:Iptables]]
 +
[[el:Iptables]]
 
[[en:Iptables]]
 
[[en:Iptables]]
 +
[[fr:Iptables]]
 
[[it:Iptables]]
 
[[it:Iptables]]
 +
[[ja:Iptables]]
 
[[ru:Iptables]]
 
[[ru:Iptables]]
 
[[sr:Iptables]]
 
[[sr:Iptables]]
 
[[zh-CN:Iptables]]
 
[[zh-CN:Iptables]]
{{Article summary start|Sumario}}
+
{{Related articles start (Español)}}
{{Article summary text|Información relativa a la instalación y configuración de iptables.}}
+
{{Related|Firewalls (Español)}}
{{Article summary heading|Relacionado}}
+
{{Related|Simple stateful firewall}}
{{Article summary wiki|Firewalls (Español)}}
+
{{Related|Sysctl#TCP/IP stack hardening}}
{{Article summary wiki|Sysctl#TCP/IP stack hardening}}
+
{{Related|Sshguard}}
{{Article summary end}}
+
{{Related|Fail2ban}}
 +
{{Related articles end}}
  
Iptables es un poderoso [[Firewalls (Español)|firewall]] compilado en el kernel de Linux y que forma parte del proyecto [[Wikipedia:es:Netfilter|netfilter]]. Iptables puede ser configurado directamente, como también por medio de un  [[Firewalls_(Español)#Front-ends_para_iptables|frontend]] o una [[Firewalls_(Español)#GUI_para_iptables|GUI]]. iptables es usado por [[Wikipedia:es:IPv4|IPv4]], en tanto que ip6tables es usado para [[Wikipedia:es:IPv6|IPv6]].
+
Iptables es un poderoso [[Firewalls (Español)|firewall]] integrado en el kernel de Linux y que forma parte del proyecto [[Wikipedia:es:Netfilter|netfilter]]. Iptables puede ser configurado directamente, como también por medio de un  [[Firewalls_(Español)#Front-ends_para_iptables|frontend]]{{Broken section link}} o una [[Firewalls_(Español)#GUI_para_iptables|GUI]]{{Broken section link}}. iptables es usado por [[Wikipedia:es:IPv4|IPv4]], en tanto que ip6tables es usado para [[Wikipedia:es:IPv6|IPv6]].
 +
 
 +
[http://netfilter.org/projects/nftables/ nftables] está programada para [http://www.phoronix.com/scan.php?page=news_item&px=MTQ5MDU 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 [https://home.regit.org/netfilter-en/nftables-quick-howto/ aquí].
  
 
== Instalación ==
 
== Instalación ==
Todos los kernels de serie de Arch Linux son compatibles con iptables. Solo necesita [[pacman (Español)|instalar]] las herramientas en el [[wikipedia:es:Espacio_de_usuario|espacio de usuario]], que son proporcionadas por el paquete {{Pkg|iptables}} presente en los [[Official Repositories (Español)|repositorios oficiales]].
 
  
Para instalar el servicio que cargue los datos de las reglas desde {{ic|iptables.rules}} al arrancar:
+
Todos los kernels de serie de Arch Linux son compatibles con iptables. Solo necesita [[pacman (Español)|instalar]] las herramientas en el [[wikipedia:es:Espacio_de_usuario|espacio de usuario]], que son proporcionadas por el paquete {{Pkg|iptables}} presente en los [[Official repositories (Español)|repositorios oficiales]].
  
{{hc|# nano /etc/conf.d/iptables|
+
== Conceptos básicos ==
IPTABLES_CONF=/etc/iptables/iptables.rules}}
+
=== Tablas ===
  
# systemctl enable iptables.service
+
iptables cuenta con cinco ''tablas'', que son zonas en las que una cadena de reglas se puede aplicar:
  
== Conceptos básicos ==
+
# {{ic|raw}} filtra los paquetes antes que cualquier otra tabla. Se utiliza principalmente para configurar exenciones de seguimiento de conexiones en combinación con el target {{ic|NOTRACK}}.
 +
# {{ic|filter}} es la tabla por defecto (si no se pasa la opción {{ic|-t}}).
 +
# {{ic|nat}} se utiliza para la [[Wikipedia:es:Network address translation|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í.
 +
# {{ic|mangle}} se utiliza para la alteración de los paquetes de red especializados (véase [[Wikipedia:Mangled packet|Mangles packet]]).
 +
# {{ic|security}} se utiliza para reglas de conexión de red [[Security#Mandatory access control|Mandatory Access Control]].
  
=== tablas ===
+
=== Cadenas ===
  
iptables cuenta con cuatro tablas: raw, filter, nat y mangle.
+
Las tablas contienen ''cadenas'', que son listas de reglas que ordenan los [[wikipedia:es:Paquete_de_red|paquete de red]]. Por defecto, la tabla {{ic|filter}} contiene tres cadenas integradas: {{ic|INPUT}}, {{ic|OUTPUT}} y {{ic|FORWARD}}.  
  
=== cadenas ===
+
# Todo el tráfico entrante, dirigido a la máquina, se hace pasar a través de la cadena {{ic|INPUT}}.
Las cadenas son usadas para especificar ''rulesets''<sup>1</sup>. Un [[wikipedia:es:Paquete_de_red|paquete de red]] comienza su recorrido en una cadena y va avanzando progresivamente hasta alcanzar una regla con la que se corresponde. Existen tres cadenas predefinidas: {{ic|INPUT}}, {{ic|OUTPUT}} y {{ic|FORWARD}}. Todo el tráfico saliente, generado localmente, pasa a través de la cadena {{ic|OUTPUT}}; todo el tráfico entrante, dirigido a la máquina, se hace pasar a través de la cadena {{ic|INPUT}}; y todo el tráfico enrutado, que no se ha suministrado localmente, pasa a través de la cadena {{ic|FORWARD}}. Las tres cadenas predefinidas tienen objetivos (''«targets»'') predeterminados que se utilizan para el caso de que algún paquete no se corresponda con ninguna regla. El usuario puede definir las reglas de las cadenas para hacerlas más eficientes.
+
# Todo el tráfico saliente, generado localmente, pasa a través de la cadena {{ic|OUTPUT}}
 +
# Todo el tráfico enrutado, que no se ha suministrado localmente, pasa a través de la cadena {{ic|FORWARD}}.  
  
<sup>1</sup>. <small>Los «rulesets» son una agrupación de conjuntos de reglas que funcionan a modo de «subrutina» de cualquier lenguaje de programación.</small>
+
Véase {{ic|man 8 iptables}} para obtener una descripción de las cadenas integradas en otras tablas.
  
=== objetivos ===
+
El usuario puede definir las reglas de las cadenas para hacerlas más eficientes.
  
Un «objetivo» (''target'') es el resultado que se produce cuando un paquete de red se corresponde o satisface una regla. Los objetivos se especifican mediante el uso de «jump» (-j) (''«salto»''). Los objetivos más comunes son ACCEPT, DROP, REJECT y LOG.
+
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.
  
===  módulos ===
+
=== 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 {{ic|-j}} o {{ic|--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 {{ic|ACCEPT}}, {{ic|DROP}}, {{ic|QUEUE}} y {{ic|RETURN}}; las extensiones de target son, por ejemplo, {{ic|REJECT}} y {{ic|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 {{ic|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.
 
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 ==
 
==  Configuración ==
=== Desde la linea de comandos ===
+
=== Desde la linea de órdenes ===
 +
====Mostrar las reglas vigentes====
  
Puede comprobar el ''ruleset'' en uso y el número de paquetes de red que han satisfecho cada regla usando la orden::
+
Puede comprobar el ''ruleset''<sup>'''1'''</sup> en uso y el número de paquetes de red que ha satisfecho cada regla usando la orden:
  
 
{{hc|# iptables -nvL|Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 
{{hc|# iptables -nvL|Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
Line 58: Line 76:
 
  pkts bytes target    prot opt in    out    source              destination}}
 
  pkts bytes target    prot opt in    out    source              destination}}
  
Si la salida se parece a lo anterior, significa que no hay reglas establecidas.
+
Si la salida se parece a lo anterior, significa que no hay reglas establecidas. Nada está bloqueado.
  
Puede vaciar y restablecer la configuración de iptables por defecto, utilizando las siguientes órdenes:
+
Para mostrar los números de línea cuando se listan reglas, añada {{ic|--line-numbers}} a esa entrada. Esto es útil cuando se eliminan y añaden reglas individuales.
  
 +
<sup>'''1'''</sup> <small>Los «rulesets» son una agrupación de conjuntos de reglas que funcionan a modo de «subrutina» de cualquier lenguaje de programación.</small>
 +
 +
==== 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 [[Router|sea]]). Cambiaremos la política, por defecto, en la cadena {{ic|FORWARD}}, de {{ic|ACCEPT}} a {{ic|DROP}}.
 +
 +
{{bc|
 +
# iptables -P FORWARD DROP
 +
}}
 +
 +
{{Advertencia|El resto de esta sección está destinada a enseñar la sintaxis y los conceptos que se esconden detrás de las reglas de iptables. No tiene la pretensión de enseñar cómo proteger los servidores. Para mejorar la seguridad de su sistema, consulte [[Simple stateful firewall]] para una configuración de iptables mínimamente segura y [[Security]] para proteger Arch Linux en general.}}
 +
 +
El servicio LAN de sincronización de [[Wikipedia:es:Dropbox|Dropbox]] tiene la característica de [https://isc.sans.edu/port.html?port=17500 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.
 +
 +
{{bc|
 +
# iptables -A INPUT -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
 +
}}
 +
 +
{{hc|
 +
# 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       
 +
 +
}}
 +
{{Nota|Utilizamos {{ic|REJECT}} en lugar de {{ic|DROP}} aquí, porque [https://tools.ietf.org/html/rfc1122#page-69 RFC 1122 3.3.8] requiere que los hosts devuelvan los errores ICMP siempre que sea posible, en vez de dejar caer los paquetes de red. En realidad, lo mejor es {{ic|REJECT}} para los paquetes de red del hosts que sepan acerca de la existencia de su servidor, y {{ic|DROP}} para los paquetes de red del hosts que no sepan siquiera que existe el servidor.}}
 +
 +
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 {{ic|-R}} para sustituir nuestra antigua regla. Donde {{ic|10.0.0.85}} es nuestra otra IP:
 +
 +
{{bc|
 +
# iptables -R INPUT 1 -p tcp --dport 17500 ! -s 10.0.0.85 -j REJECT --reject-with icmp-port-unreachable
 +
}}
 +
 +
{{hc|
 +
# 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 {{ic|10.0.0.85}} para acceder al puerto {{ic|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 {{ic|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 {{ic|-I}} para insertar la nueva regla antes de la antigua:
 +
 +
{{bc|
 +
# iptables -I INPUT 1 -p tcp --dport 17500 -s 10.0.0.85 -j ACCEPT -m comment --comment "Friendly Dropbox"
 +
}}
 +
 +
{{hc|
 +
# 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 {{ic|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í:
 +
 +
{{hc|
 +
# 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 INPUT ACCEPT
 
  # iptables -P FORWARD ACCEPT
 
  # iptables -P FORWARD ACCEPT
 
  # iptables -P OUTPUT ACCEPT
 
  # iptables -P OUTPUT ACCEPT
# iptables -F
+
 
# iptables -X
+
La orden {{ic|-F}} sin argumentos vuelca todas las cadenas en su tabla actual. Del mismo modo, {{ic|-X}} elimina todos las cadenas vacías no predeterminadas en una tabla.
 +
Las cadenas individuales pueden ser eliminados o borrados con {{ic|-F}} y {{ic|-X}} seguidas de un argumento {{ic|[chain]}}.
  
 
=== Archivo de configuración ===
 
=== Archivo de configuración ===
  
En el archivo {{ic|/etc/conf.d/iptables}} se establece la ubicación de los archivos de configuración de iptables. El ''ruleset'' se carga cuando el demonio se ha iniciado.
+
Las reglas iptables son, por defecto, almacenadas en {{ic|/etc/iptables/iptables.rules}}. Este archivo es leído por {{ic|iptables.service}}:
  
{{hc|/etc/conf.d/iptables|2=# Configuración de las reglas iptables
+
# systemctl enable iptables.service
IPTABLES_CONF=/etc/iptables/iptables.rules
+
# systemctl start iptables.service
IP6TABLES_CONF=/etc/iptables/ip6tables.rules
+
  
# Activar redireccionamiento IP (tanto IPv4 como IPv6)
+
Las reglas iptables para ipv6 son, por defecto, almacenadas en el archivo {{ic|/etc/iptables/ip6tables.rules}}, el cual es leido por {{ic|ip6tables.service}}. Puede iniciarlo de la misma manera que el anterior.
# NOTA: Esta no es la forma recomendada para hacer esto, y es proporcionado solamente para
+
# dar compatibilidad a versiones antiguas. En su lugar, utilice /etc/sysctl.conf y ajuste el redireccionamiento
+
# opciones:
+
# * net.ipv4.ip_forward=1
+
# * net.ipv6.conf.default.forwarding=1
+
# * net.ipv6.conf.all.forwarding=1
+
#IPTABLES_FORWARD=0}}
+
  
Después añada las reglas a través de línea de órdemes:
+
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:
  
{{bc|# iptables-save > /etc/iptables/iptables.rules}}
+
# iptables-save > /etc/iptables/iptables.rules
  
Por último:  
+
Si modifica el archivo de configuración de forma manual, tiene que volver a cargarlo:
  
{{bc|# systemctl reload iptables}}
+
# systemctl reload iptables
  
 
=== Guías ===
 
=== Guías ===
Line 100: Line 225:
 
== Registro ==
 
== Registro ==
  
El objetivo LOG se puede utilizar para registrar los paquetes que satisfacen una regla. A diferencia de otros objetivos, como ACCEPT o DROP, el paquete continuará moviéndose a través de la cadena después de alcanzar un objetivo LOG. Esto significa que, para habilitar el registro de todos los paquetes 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 {{ic|logdrop}}.
+
El target {{ic|LOG}} se puede utilizar para registrar los paquetes de red que satisfacen una regla. A diferencia de otros targets, como {{ic|ACCEPT}} o {{ic|DROP}}, el paquete de red continuará moviéndose a través de la cadena después de alcanzar un target {{ic|LOG}}. Esto significa que, para activar el registro de todos los paquetes de red perdidos, se tendría que agregar una regla {{ic|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 {{ic|logdrop}}.
  
 
Cree la cadena con:
 
Cree la cadena con:
Line 106: Line 231:
 
  # iptables -N logdrop
 
  # iptables -N logdrop
  
Después, defínalo:
+
Después, defínala:
  
 
  ## /etc/iptables/iptables.rules
 
  ## /etc/iptables/iptables.rules
Line 131: Line 256:
  
 
=== Limitar el tamaño del registro ===
 
=== 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 {{ic|/var}}) causando la saturación del registro de iptables.
 
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 {{ic|/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:
+
{{ic|-m limit}} se utiliza para llamar al módulo limit. Puede usar {{ic|--limit}} para utilizar una tasa promedio y {{ic|--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
 
  -A LOGDROP -m limit --limit 5/m --limit-burst 10 -j LOG
  
Esto agrega una regla a la cadena LOGDROP que registrar todos los paquetes que pasan a través de ella. Los primeros 10 paquetes serán registrados, y de ahí en adelante únicamente 5 paquetes por minuto quedarán registrados. El «limit burst» es restaurado cada vez que la «tasa límite» no se supera.
+
Esto agrega una regla a la cadena {{ic|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 ===
 
=== syslog-ng ===
  
Aumiendo que usa [[syslog-ng]], puede controlar donde será guardada la salida del registro de iptables de este modo:
+
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); };
 
  filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };
 
a
 
a
 
  filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
 
  filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
  
Esto concluirá la salida del registro de iptables en el archivo {{ic|/var/log/everything.log}}.
+
Esto evitará la salida del registro de iptables en el archivo {{ic|/var/log/everything.log}}.
  
Si quiere que el registro de iptables se produzca en un archivo distinto de {{ic|/var/log/iptables.log}}, basta con cambiar el valor de destino de d_iptables aquí (siempre en el archivo {{ic|syslog-ng.conf}})
+
Si quiere que el registro de iptables se vuelque en un archivo distinto de {{ic|/var/log/iptables.log}}, basta con cambiar el valor de destino de {{ic|d_iptables}} (siempre en el archivo {{ic|syslog-ng.conf}})
 
  destination d_iptables { file("/var/log/iptables.log"); };
 
  destination d_iptables { file("/var/log/iptables.log"); };
  
 
=== ulogd ===
 
=== ulogd ===
  
[http://www.netfilter.org/projects/ulogd/index.html 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 {{Pkg|ulogd}} está disponible en el repositorio {{ic|[community]}}.
+
[http://www.netfilter.org/projects/ulogd/index.html 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 {{ic|LOG}} predeterminado.  El paquete {{Pkg|ulogd}} está disponible en el repositorio {{ic|[community]}}.
  
 
== Véase también ==
 
== Véase también ==
 
+
[[wikipedia:es:iptables]]
{{wikipedia (Español)|iptables}}
+
* [[Port knocking]]
* [[Simple Stateful Firewall]]
+
 
* [http://www.netfilter.org/projects/iptables/index.html Sitio web oficial de iptables]
 
* [http://www.netfilter.org/projects/iptables/index.html Sitio web oficial de iptables]
 
* [http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html Tutorial de iptables 1.2.2] por Oskar Andreasson
 
* [http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html Tutorial de iptables 1.2.2] por Oskar Andreasson
 
* [http://wiki.debian.org/iptables iptables Debian] Wiki de Debian
 
* [http://wiki.debian.org/iptables iptables Debian] Wiki de Debian

Latest revision as of 16:57, 6 August 2016

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:

  1. raw filtra los paquetes antes que cualquier otra tabla. Se utiliza principalmente para configurar exenciones de seguimiento de conexiones en combinación con el target NOTRACK.
  2. filter es la tabla por defecto (si no se pasa la opción -t).
  3. 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í.
  4. mangle se utiliza para la alteración de los paquetes de red especializados (véase Mangles packet).
  5. 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.

  1. Todo el tráfico entrante, dirigido a la máquina, se hace pasar a través de la cadena INPUT.
  2. Todo el tráfico saliente, generado localmente, pasa a través de la cadena OUTPUT
  3. 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
Advertencia: El resto de esta sección está destinada a enseñar la sintaxis y los conceptos que se esconden detrás de las reglas de iptables. No tiene la pretensión de enseñar cómo proteger los servidores. Para mejorar la seguridad de su sistema, consulte Simple stateful firewall para una configuración de iptables mínimamente segura y Security para proteger Arch Linux en general.

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         

Nota: Utilizamos REJECT en lugar de DROP aquí, porque RFC 1122 3.3.8 requiere que los hosts devuelvan los errores ICMP siempre que sea posible, en vez de dejar caer los paquetes de red. En realidad, lo mejor es REJECT para los paquetes de red del hosts que sepan acerca de la existencia de su servidor, y DROP para los paquetes de red del hosts que no sepan siquiera que existe el servidor.

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

wikipedia:es:iptables