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

From ArchWiki
Jump to: navigation, search
m (changed link to Wikipedia added file template)
(Archivo de configuración)
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Security (Español)]][[Category:Networking (Español)]]
+
{{DISPLAYTITLE:iptables}}
{{i18n|Iptables}}
+
[[Category:Security (Español)]]
{{expansion}}
+
[[Category:Networking (Español)]]
  
{{Article summary start}}
+
[[en:Iptables]]
{{Article summary text|Información relativa a la instalación y configuración de Iptables.}}
+
[[it:Iptables]]
{{Article summary heading|Relacionados}}
+
[[ru:Iptables]]
{{Article summary wiki|Firewalls}}
+
[[sr:Iptables]]
 +
[[zh-CN:Iptables]]
 +
{{Article summary start|Sumario}}
 +
{{Article summary text|Información relativa a la instalación y configuración de iptables.}}
 +
{{Article summary heading|Relacionado}}
 +
{{Article summary wiki|Firewalls (Español)}}
 
{{Article summary wiki|Sysctl#TCP/IP stack hardening}}
 
{{Article summary wiki|Sysctl#TCP/IP stack hardening}}
 
{{Article summary end}}
 
{{Article summary end}}
  
iptables es un poderoso [[firewall]] compilado dentro del kernel, y es parte de el proyecto [[Wikipedia:es:Netfilter|netfilter]]. Este puede ser configurado directamente, como también por medio de uno de sus [[Firewalls#iptables_front-ends|frontends]] o [[Firewall#iptables_GUIs|GUIs]]. iptables es usado para [[Wikipedia:es:IPv4|IPv4]] y ip6tables es usado para [[Wikipedia:es:IPv6|IPv6]].
+
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]].
  
 
== Instalación ==
 
== Instalación ==
  
{{Nota| Su kernel debe estar compilado con soporte para iptables. El núcleo de Arch Linux viene compilado con este soporte.}}
+
{{Nota|El propio kernel debe estar compilado con apoyo para iptables. Todos los kernels de serie de Arch Linux son compatibles con iptables.}}
  
Primero, instalar las herramientas de usuario:
+
Primero, [[pacman (Español)|instale]] 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]].
  
  # pacman -S iptables
+
A continuación, active e inicie el servicio {{ic|iptables}} para systemd:
 +
  # systemctl enable iptables
 +
# systemctl start iptables
  
Después, agregar iptables a los demonios in {{Filename|/etc/rc.conf}} para cargar las configuraciones cargadas:
+
Si desea compatibilidad con IPv6, active e inicie el servicio {{ic|ip6tables}} para systemd:
 
+
# systemctl enable ip6tables
{{File|name=/etc/rc.conf|content=.....
+
# systemctl start ip6tables
DAEMONS=(... '''iptables''' network ...)}}
+
  
 
== Conceptos básicos ==
 
== Conceptos básicos ==
Line 29: Line 35:
 
=== tablas ===
 
=== tablas ===
  
iptables contiene cuatro tablas predefinidas: raw, filter, nat and mangle.
+
iptables cuenta con cuatro tablas: raw, filter, nat y mangle.
  
 
=== cadenas ===
 
=== cadenas ===
 +
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.
  
Las cadenas se usan para especificar un conjunto de reglas. Las cadenas se agrupan en las tablas. Un paquete que inicia su recorrido pasa primero por una cadena y ese paquete es examinado por cada una de las reglas de la cadena. Existen por defecto tres cadenas predefinidas: INPUT, OUTPUT and FORWARD. Si la regla cumple con el datagrama, el recorrido se detiene y el destino de la regla dicta lo que se debe hacer con el paquete. Si el paquete alcanza el fin de una cadena predefinida sin haberse correspondido con ninguna regla de la cadena, la política de destino de la cadena dicta qué hacer con el paquete.  El usuario puede modificar las reglas de la cadena para hacerlas más eficiente, como también puede construirlas.
+
<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>
  
=== política ===
+
=== objetivos ===
  
Una "política" es el resultado cuando un paquete llega a una regla. Las políticas se especifican con "jump" (-j). Las políticas más comunes son ACCEPT, DROP, REJECT and LOG.
+
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.
  
=== módulos ===
+
=== módulos ===
  
Hay módulos que permiten ampliar los alcances de iptables, algunos de estos son: connlimit, conntrack, limit y recent. Hay módulos con funcionalidades extra que permiten un manejo complejo de las reglas.
+
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 ===
  
=== En linea de comando ===
+
Puede comprobar el ''ruleset'' en uso y el número de paquetes de red que han satisfecho cada regla usando la orden::
  
Se pueden enumerar las reglas y sus acciones con el comando:
+
{{hc|# iptables -nvL|Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 
+
pkts bytes target    prot opt in    out    source              destination   
# 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)
+
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
  pkts bytes target    prot opt in    out    source              destination
+
  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 obtenida es similar a la anterior, quiere decir que no hay reglas definidas y que todo el tráfico pasa sin ser alterado.
+
Si la salida se parece a lo anterior, significa que no hay reglas establecidas.
  
Se puede borrar y volver reestablecer la configuración por defecto con los siguientes comandos:
+
Puede vaciar y restablecer la configuración de iptables por defecto, utilizando las siguientes órdenes:
  
 
  # iptables -P INPUT ACCEPT
 
  # iptables -P INPUT ACCEPT
Line 71: Line 76:
 
=== Archivo de configuración ===
 
=== Archivo de configuración ===
  
El archivo de configuración de iptables se encuentra en {{Filename|/etc/conf.d/iptables}}, allí se pueden configurar las reglas cuando inicie el demonio.
+
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.
 
+
IPTABLES=/usr/sbin/iptables
+
IP6TABLES=/usr/sbin/ip6tables
+
  
 +
{{hc|/etc/conf.d/iptables|2=# Configuración de las reglas iptables
 
IPTABLES_CONF=/etc/iptables/iptables.rules
 
IPTABLES_CONF=/etc/iptables/iptables.rules
 
IP6TABLES_CONF=/etc/iptables/ip6tables.rules
 
IP6TABLES_CONF=/etc/iptables/ip6tables.rules
IPTABLES_FORWARD=0  # enable IP forwarding?
 
  
Para guardar el conjunto de reglas actual se usa el comando:
+
# Activar redireccionamiento IP (tanto IPv4 como IPv6)
 +
# 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}}
 +
 
 +
Para guardar el ruleset actual: {{ic|# rc.d save iptables}}
 +
 
 +
Para los usuarios de systemd, después de añadir las reglas a través de la línea de órdenes: {{ic| # iptables-save > /etc/iptables/iptables.rules}}
 +
 
 +
Por último: {{ic|# systemctl restart iptables}}
 +
 
 +
Y para asegurarse de que todo ha salido bien: {{ic| $ systemctl status iptables}}
 +
 
 +
=== Guardar los contadores ===
 +
{{Nota|Esto no funcionará si está utilizando [[systemd (Español)|systemd]]. Tendrá que editar los archivos de servicio de systemd.}}
 +
También puede, opcionalmente, guardar los contadores de los paquetes de red y de los byte. Para lograr esto, edite {{ic|/etc/rc.d/iptables}}
 +
 
 +
En la sección '''save)''', cambie la línea:
 +
/usr/sbin/iptables-save > $IPTABLES_CONF
 +
por:
 +
/usr/sbin/iptables-save -c > $IPTABLES_CONF
 +
En la sección '''stop)''' añada lo siguiente para guardar antes de deterner el demonio:
 +
stop)
 +
      $0 save
 +
      sleep 2
 +
En la sección '''start)''', cambie la línea:
 +
/usr/sbin/iptables-restore < $IPTABLES_CONF
 +
por
 +
/usr/sbin/iptables-restore -c < $IPTABLES_CONF
 +
y guarde el archivo.
 +
 
 +
=== Guías ===
 +
 
 +
*[[Simple stateful firewall]]
 +
*[[Router]]
 +
 
 +
== 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 LOGDROP.
 +
 
 +
## /etc/iptables/iptables.rules
 +
 +
*filter
 +
:INPUT DROP [0:0]
 +
:FORWARD DROP [0:0]
 +
:OUTPUT ACCEPT [0:0]
 +
 +
... otras cadenas definidas por el usuario ..
 +
 +
## 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 {{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:
 +
 
 +
-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.
 +
 
 +
=== syslog-ng ===
  
  # /etc/rc.d/iptables save
+
Aumiendo 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); };
 +
to
 +
filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
  
Para cargar el conjunto de reglas guardado se usa el comando:
+
Esto concluirá la salida del registro de iptables en el archivo {{ic|/var/log/everything.log}}.
  
# /etc/rc.d/iptables restart
+
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}})
 +
destination d_iptables { file("/var/log/iptables.log"); };
  
 +
=== ulogd ===
  
=== Lecturas adicionales ===
+
[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]}}.
  
* [[Wikipedia:es:Iptables|Articulo de la Wikipedia sobre Iptables]]
+
== Véase también ==
  
* [http://www.netfilter.org/projects/iptables/index.html Iptables Homepage (Inglés)]
+
{{wikipedia (Español)|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://wiki.debian.org/iptables iptables Debian] Wiki de Debian

Revision as of 16:04, 6 February 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary end

Iptables es un poderoso firewall compilado 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 o una GUI. iptables es usado por IPv4, en tanto que ip6tables es usado para IPv6.

Instalación

Nota: El propio kernel debe estar compilado con apoyo para iptables. Todos los kernels de serie de Arch Linux son compatibles con iptables.

Primero, instale las herramientas en el espacio de usuario, que son proporcionadas por el paquete iptables presente en los repositorios oficiales.

A continuación, active e inicie el servicio iptables para systemd:

# systemctl enable iptables
# systemctl start iptables

Si desea compatibilidad con IPv6, active e inicie el servicio ip6tables para systemd:

# systemctl enable ip6tables
# systemctl start ip6tables

Conceptos básicos

tablas

iptables cuenta con cuatro tablas: raw, filter, nat y mangle.

cadenas

Las cadenas son usadas para especificar rulesets1. Un 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: INPUT, OUTPUT y FORWARD. Todo el tráfico saliente, generado localmente, pasa a través de la cadena OUTPUT; todo el tráfico entrante, dirigido a la máquina, se hace pasar a través de la cadena INPUT; y todo el tráfico enrutado, que no se ha suministrado localmente, pasa a través de la cadena 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.

1. Los «rulesets» son una agrupación de conjuntos de reglas que funcionan a modo de «subrutina» de cualquier lenguaje de programación.

objetivos

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.

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 comandos

Puede comprobar el ruleset en uso y el número de paquetes de red que han 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.

Puede vaciar y restablecer la configuración de iptables por defecto, utilizando las siguientes órdenes:

# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -F
# iptables -X

Archivo de configuración

En el archivo /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.

/etc/conf.d/iptables
# Configuración de las reglas iptables
IPTABLES_CONF=/etc/iptables/iptables.rules
IP6TABLES_CONF=/etc/iptables/ip6tables.rules

# Activar redireccionamiento IP (tanto IPv4 como IPv6)
# 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

Para guardar el ruleset actual: # rc.d save iptables

Para los usuarios de systemd, después de añadir las reglas a través de la línea de órdenes: # iptables-save > /etc/iptables/iptables.rules

Por último: # systemctl restart iptables

Y para asegurarse de que todo ha salido bien: $ systemctl status iptables

Guardar los contadores

Nota: Esto no funcionará si está utilizando systemd. Tendrá que editar los archivos de servicio de systemd.

También puede, opcionalmente, guardar los contadores de los paquetes de red y de los byte. Para lograr esto, edite /etc/rc.d/iptables

En la sección save), cambie la línea:

/usr/sbin/iptables-save > $IPTABLES_CONF

por:

/usr/sbin/iptables-save -c > $IPTABLES_CONF

En la sección stop) añada lo siguiente para guardar antes de deterner el demonio:

stop)
     $0 save
     sleep 2

En la sección start), cambie la línea:

/usr/sbin/iptables-restore < $IPTABLES_CONF

por

/usr/sbin/iptables-restore -c < $IPTABLES_CONF

y guarde el archivo.

Guías

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 LOGDROP.

## /etc/iptables/iptables.rules

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

... otras cadenas definidas por el usuario ..

## 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 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.

syslog-ng

Aumiendo 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); };

to

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 /var/log/everything.log.

Si quiere que el registro de iptables se produzca en un archivo distinto de /var/log/iptables.log, basta con cambiar el valor de destino de d_iptables aquí (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

Template:Wikipedia (Español)