Iptables

De doc.ubuntu-es
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(añado fuentes)
(erratas)
 
(No se muestran 9 ediciones intermedias realizadas por 5 usuarios)
Línea 2: Línea 2:
 
El kernel Linux incluye el subsistema '''Netfilter''', que es usado para manipular o decidir el destino del tráfico de red entre o a través de su red. Todas las soluciones firewall Linux modernas utilizan este sistema para el filtrado de paquetes.
 
El kernel Linux incluye el subsistema '''Netfilter''', que es usado para manipular o decidir el destino del tráfico de red entre o a través de su red. Todas las soluciones firewall Linux modernas utilizan este sistema para el filtrado de paquetes.
  
El sistema de filtrado de paquetes del núcleo resulta de poca ayuda a los administradores si no se tiene una interfaz de usuario para gestionarlo. Éste es el proposito de '''Iptables'''. Cuando un paquete llega a su servidor, éste es gestionado por el subsistema Netfilter para aceptarlo, manipularlo o rechazarlo basándose en las reglas suministradas a éste via iptables. Así, iptables es todo lo que necesita para manejar su cortafuegos si está familiarizado con él, pero existen muchos interfaces de usuario disponibles para simplificar esta tarea., por ejemplo [[Firestarter]]
+
El sistema de filtrado de paquetes del núcleo resulta de poca ayuda a los administradores si no se tiene una interfaz de usuario para gestionarlo. Éste es el propósito de '''Iptables'''. Cuando un paquete llega a su servidor, éste es gestionado por el subsistema Netfilter para aceptarlo, manipularlo o rechazarlo basándose en las reglas suministradas a éste vía iptables. Así, iptables es todo lo que necesita para manejar su cortafuegos si está familiarizado con él, pero existen muchos interfaces de usuario disponibles para simplificar esta tarea., por ejemplo [[Firestarter]]
 +
 
 +
Aclaramos que en versiones anteriores al kernal 2.4.* se llamaba ipchain, pero a partir de esta versión se cambió a Iptables, mucho más potente.
 +
 
 +
Iptables está basado en el uso de '''TABLAS'''  dentro de las tablas, '''CADENAS''', formadas por agrupación de '''REGLAS''', parámetros que relativizan las reglas y finalmente una '''ACCION''', que es la encargada de decir qué destino tiene el paquete.
 +
 
 +
Describimos los elementos y luego vemos un sencillo script básico.
 +
 
 +
===Las Tablas===
 +
 
 +
:'''FILTER''' ''(filtrado)''Permite generar las ''reglas de filtrado'' o sea, qué paquetes aceptar, cuales rechazar o cuales omitir.Es la tabla por defecto. Las cadenas serán: '''INPUT OUTPUT y FORWARD.'''
 +
 
 +
:'''NAT'''    ''(Network Address Translation)'' Desde esta tabla es posible el enmascaramiento de IP, se usa para redireccionar puertos o cambiar las :IPs de origen y  destino a través de interface de red. Las cadenas serán :'''PREROUTING y POSTROUTING
 +
'''
 +
:'''MANGLE''' ''(Modificado de paquetes)''Permite la modificación de paquetes como ToS (Type of Service), TTL (Time to live)o mark, marcar el paquete.
 +
 
 +
:'''RAW ''' Esta tabla se usa para configurar principalmente excepciones en el seguimiento de paquetes en combinación con la acción o target NOTRACK. Trabaja sobre la cadena PREROUTING Y OUTPUT y su única acción es Notrack. Puede evitar que iptables haga un seguimiento de los paquetes.
 +
:Describimos los elementos y luego vemos un sencillo script básico.
 +
 
 +
{|class="wikitable" border="0"  cellpadding="6" cellspacing="1" style="margin: 1em 1em 1em 1em; background:#faac58; border:1px solid #eee; font-size: 95%;"
 +
|+  '''CORRESPONDENCIA  de TABLAS, CADENAS  y FUNCION'''
 +
!TABLA !!FUNCION !! CADENA !!width="500"| FUNCION de la CADENA
 +
|-style="background:#f5e5d6"
 +
|rowspan=3 |'''FILTER'''
 +
|rowspan=3 |Filtrado de paquetes
 +
|<pre>INPUT</pre>
 +
|Filtrado de paquetes que llegan al firewall
 +
|-style="background:#f5e5d6"
 +
|<pre>OUTPUT</pre>
 +
|Filtrado de los paquetes de salida
 +
|-style="background:#f5e5d6"
 +
|<pre>FORWARD</pre>
 +
|Permite el paso de paquetes a otra dirección del firewall
 +
|-style="background:#e3e7f4"
 +
|rowspan=3 |'''NAT'''
 +
|rowspan=3 |Enrutamiento de<br>direcciones de red
 +
|<pre>PREROUTING</pre>
 +
|Chequea  la dirección de red antes de reenviarla.<br>Facilita la modificación de la información para facilitar el enrutado<br>Se usa también como DESTINATION NAT o DNAT
 +
|-style="background:#e3e7f4"
 +
|<pre>POSTROUTING</pre>
 +
|Tratamiento de la dirección IP después del enrutado.Esto hace<br> que no sea necesario la modificación del destino de la dirección IP<br> del paquete como en pre-routing.Se usa como SOURCE NAT o SNAT
 +
|-style="background:#e3e7f4"
 +
|<pre>OUTPUT</pre>
 +
|Interpretación de las direcciones de Red de los paquetes<br>que salen del firewall.Escasamente usado.
 +
|-style="background:#f5e5d6"
 +
|'''MANGLE'''
 +
|Modificación de las<br> cabeceras de TCP
 +
|<code>PREROUTING<br>POSTROUTING<br>INPUT<br>OUTPUT<br>FORWARD</code>
 +
|Permite la modificación del paquete como puede ser TOS<br> (type of Service), marcado de los mismos para <br>QOS o calidad de servicio
 +
|-style="background:#e3e7f4"
 +
|rowspan=2|'''RAW'''
 +
|rowspan=2 |Acción NOTRACK
 +
|<pre>PREROUTING</PRE>
 +
|rowspan=2|Esta tabla se usa para configurar principalmente excepciones<BR> en el seguimiento de paquetes en combinación<br> con la acción o target NOTRACK.
 +
|-style="background:#e3e7f4"
 +
|<pre>OUTPUT</pre>
 +
|}
 +
 
 +
 
 +
 
 +
 
 +
A partir de aquí, dividiremos las opciones en algunos grupos
 +
 
 +
===Comandos de Iptables===
 +
 
 +
:Como hacíamos referencia más arriba, dentro de las ''tablas'' hay ''cadenas'' a su vez vez formadas por agrupaciones de ''reglas''. Es importante ver que cada tabla tiene cadenas por defecto, que no se pueden eliminar.
 +
:A las CADENAS por defecto podemos unir cadenas creadas por nosotros mismos para un mejor funcionamiento del filtrado o el enrutamiento.
 +
 
 +
:El comando IPTABLES tiene a su vez parámetros y comandos que permitirán definir el comportamiento de una o varias reglas. Esto es, agregar una regla, modificar una regla existente, eliminar el nombre de una cadena
 +
Describimos algunos de los comandos más comunes.
 +
 
 +
 
 +
 
 +
 
 +
 
 +
{|class="wikitable" border="0"  cellpadding="6" cellspacing="0" style="margin:1em 1em 1em 1em; background:#faac58; color:#000; font-size: 95%;"
 +
|+''' FUNCION  de  COMANDOS'''
 +
! COMANDO !! FUNCION
 +
|-style="background:#eee6d8"
 +
|align="center"|'''-A'''
 +
|Agregar nueva regla a la cadena especificada.
 +
|-style="background:#ebd4ab"
 +
|align="center" |'''-I'''
 +
|Insertar nueva regla  antes de la regla número_regla(rulenum)<br> en la cadena especificada de acuerdo a los parámetros sometida.
 +
|-style="background:#eee6d8"
 +
|align="center" |'''-R'''
 +
|Reemplazar la regla (rulenum) en la cadena especificada.
 +
|-style="background:#ebd4ab"
 +
|align="center" |'''-E'''
 +
|Modifica el nombre de la cadena.<br> [nombre-anterior-cadena por nombre-nueva-cadena]
 +
|-style="background:#eee6d8"
 +
|align="center" |'''-L'''
 +
|Listado de reglas de la cadena especificada. Si no se determina una<br> cadena en particular, listará todas las cadenas existentes.
 +
|-style="background:#ebd4ab"
 +
|align="center" |'''-N'''
 +
|Crear nueva cadena asociándola a un nombre.
 +
|-style="background:#eee6d8"
 +
|align="center" |'''-P'''
 +
|Modifica la acción por defecto de la cadena preseleccionada.
 +
|-style="background:#ebd4ab"
 +
|align="center" |'''-D'''
 +
|Eliminar la regla_número(rulenum) en la cadena seleccionada.
 +
|-style="background:#eee6d8"
 +
|align="center" |'''-Z'''
 +
|Pone los contadores de paquetes y bytes a cero en la cadena seleccionada.<br> De no poner seleccionar una cadena, pondrá a cero todos los  contadores de<br> todas las reglas en todas cadenas.
 +
|-style="background:#ebd4ab"
 +
|
 +
|align="right" |''(Lista completa en: man iptables)''
 +
 
 +
|}
 +
 
 +
 
 +
 
 +
 
 +
 
 +
===Parámetros===
 +
 
 +
:Todas las reglas en iptables tienen definida su condición por los parámetros, que constituyen su parte primordial.
 +
:Algunos de estos  parámetros son:
 +
 
 +
 
 +
{|class="wikitable" border="0"  cellpadding="6" cellspacing="0" style="margin:1em 1em 1em 1em; background:#faac58; color:#000; font-size: 95%;"
 +
|+'''PARAMETROS y su FUNCION'''
 +
!PARAMETRO !! FUNCION
 +
|-style="background:#e3e7f4"
 +
|align="center"|'''-i'''
 +
|Interfaz de entrada (eth0,eth1,eth2...)
 +
|-style="background:#f5e5d6"
 +
|align="center"|'''-o'''
 +
|Interfaz de salida  (eth0,eth1,eth2...)
 +
|-style="background:#e3e7f4"
 +
|align="center"|'''--sport'''
 +
|Puerto de origen
 +
|-style="background:#f5e5d6"
 +
|align="center"|''' --dport'''
 +
|Puerto destino
 +
|-style="background:#e3e7f4"
 +
|align="center"| -p
 +
|El protocolo del paquete a comprobar, tcp, udp, icmp ó all.<br> Por defecto es all
 +
|-style="background:#f5e5d6"
 +
|align="center"|''' -j'''
 +
|Esto especifica el objetivo de la cadena de reglas, o sea una acción
 +
|-style="background:#e3e7f4"
 +
|align="center"| '''--line-numbers'''
 +
|Cuando listamos las reglas, agrega el número que ocupa cada regla<br> dentro de la cadena
 +
|-style="background:#f5e5d6"
 +
|
 +
|align="right"|(''Ver lista completa en: man iptables'')
 +
|}
 +
<br>
 +
 
 +
===Acciones===
 +
Y finalmente, las''' ACCIONES''' que estarán siempre al final de cada regla que determinará que hacer con los paquetes afectados. Si no se especifica ninguna acción, se ejecutará la opción por defecto que cada cadena tiene asignada. Las acciones  serían:
 +
 
 +
 
 +
:'''ACCEPT'''---> Paquete aceptado.
 +
 
 +
:'''REJECT'''---> Paquete rechazado. Se envía notificación a través del protocolo ICMP.
 +
 
 +
:'''DROP'''---> Paquete rechazado. Sin notificación
 +
 
 +
:'''MASQUERADE'''--->Enmascaramiento de la dirección IP origen de forma dinámica.Esta acción es sólo válida en la tabla NAT en la cadena postrouting.
 +
 
 +
:'''DNAT'''---> Enmascaramiento de la dirección destino, muy conveniente para re-enrutado de paquetes.
 +
 
 +
:'''SNAT'''---> enmascaramiento de la IP origen de forma similar a masquerade, pero con IP fija.
 +
 
 +
 
 +
 
 +
:Ya tenemos los componentes esenciales para formar las reglas que determinarán la aceptación o denegación de entrada y salida de paquetes de nuestra máquina, tanto a través de Internet,como de nuestra propia red doméstica.
 +
 
 +
:Ahora veremos cómo se construyen las reglas y como hacer un script de shell en el que se van aplicando  aquellas reglas que necesitemos.
 +
 
 +
 
 +
:::::''MUY IMPORTANTE. Cuidado con el orden en el cual disponemos las reglas.''
 +
:::::'''IPTABLES LEE DE MANERA SECUENCIAL LAS CADENAS DE REGLAS'''.
 +
:::::''Es decir, comienza por la primera y verifica que se cumpla la condición y<br> la ejecuta sin verificar las siguientes.''
 +
:::::''Por consiguiente, si la primera regla en la tabla filter de la cadena<br> input es rechazar cualquier paquete,las siguientes reglas no serán verificadas,''
 +
:::::'' y se rechazará cualquier paquete.''
 +
<br>
 +
 
 +
===Modelo de Cadena de Reglas===
 +
 
 +
 
 +
La estructura o el esqueleto de una regla básicamente sería:
 +
 
 +
 
 +
::<pre>iptables --> -t -->tabla -->tipo_operación -->cadena -->regla_con_parámetros -->Acción</pre>
 +
 
 +
 
 +
Explicamos por pasos agregando debajo valores reales:
 +
 
 +
{|class="wikitable" style="background:#eee6d8;" align=center cellpadding="4" cellspacing="0"
 +
!iptables !!-t--> !! tabla--> !! tipo_operación--> !! cadena--> !! regla_con_parámetros--> !! ACCION
 +
|-style="background:#ebd4ab" align="center"
 +
|iptables ||-t || filter ||-A || INPUT || -p tcp -dport 23 || -j DROP ||
 +
|}
 +
 
 +
 
 +
Ahora quitando espacios:
 +
 
 +
<pre>iptables -t filter -A INPUT -p tcp -dport 23 -j DROP</pre>
 +
 
 +
¿Qué nos dice esta cadena de reglas?
 +
 
 +
Que en la tabla '''filter''', la cadena '''input''' filtra los paquetes con protocolo '''tcp''' que entran por
 +
el '''puerto 23''' (puerto asignado a telnet) y éstos son rechazados '''(DROP)''' sin ninguna notificación.
 +
 
 +
Algunas consideraciones. De acuerdo con lo hemos comentado antes, podríamos escribir lo mismo de otra forma,por ej. quitando  '''"-t filter"''', ya que es la tabla por defecto, además podemos cambiar el número de puerto por'''"telnet"''' que en realidad es su puerto asignado. Queda:
 +
 
 +
<pre>iptables -A INPUT -p tcp -dport telnet -j DROP</pre>
 +
 
 +
Si por el contrario, quisiéramos aceptar estos paquetes:
 +
 
 +
<pre>iptables -A INPUT -p tcp -dport telnet -j ACCEPT</pre>
 +
 
 +
O aceptamos tráfico http:
 +
 
 +
<pre>iptables -A INPUT -p tcp -dport http -j ACCEPT</pre>
 +
 
 +
donde también podemos especificar el interfaz de entrada (-i etho)
 +
 
 +
<pre>iptables -A INPUT -i eth0 -p tcp -dport http -j ACCEPT</pre>
 +
 +
también:
 +
<pre>iptables -A INPUT -p tcp -dport 80 -j ACCEPT</pre>
 +
 
 +
Aplicando los conceptos anteriores:
  
== Comandos básicos ==
 
Escribiendo
 
  
 
  sudo iptables -L
 
  sudo iptables -L
se listan las actuales reglas en iptables. Si acabas de instalar un servidor, aun no tendrás normas, así que deberías ver:
+
se listan las actuales reglas en iptables. Si acabas de instalar un servidor, aún no tendrás normas, así que deberías ver:
  
 
  Chain INPUT (policy ACCEPT)
 
  Chain INPUT (policy ACCEPT)
Línea 20: Línea 245:
  
  
== Opciones básicas de Iptables ==
 
  
Aquí se muestra una explicación de algunas de las opciones básicas que verás en éste artículo. No te preocupes si no entiendes todo ahora, pero recuerda vovler y mirar ésta lista si encuentras nuevas opciones después
 
  
* '''<tt>-A</tt>''' - Append this rule to a rule chain. Valid chains for what we're doing are INPUT, FORWARD and OUTPUT, but we mostly deal with INPUT in this tutorial, which aecta solo al tráfico entrante.
 
* '''<tt>-L</tt>''' - Lista las reglas de filtrado actuales.
 
* '''<tt>-m state</tt>''' - Permite a las reglas de filtrado coincidir basándose en el estado de conexión. Permite el uso de la opción <tt>--state</tt>.
 
* '''<tt>--state</tt>''' - Define la lista de estados de una regla con los que coincidir. Los estados válidos son:
 
** '''<tt>NEW</tt>''' - La conexión no ha sido vista aún.
 
** '''<tt>RELATED</tt>''' - La conexión es nueva, pero está relacionada con otra conexión ya permitida.
 
** '''<tt>ESTABLISHED</tt>''' - La conexión ya ha sido establecida.
 
** '''<tt>INVALID</tt>''' - El tráfico no puede ser identificado por alguna razón.
 
* '''<tt>-m limit</tt>''' - Requiere que la regla coincida solo un número limitado de veces. Permite el uso de la opción <tt>--limit</tt>. Muy útil para limitar las reglas de logging.
 
** '''<tt>--limit</tt>''' - el máximo de concordancia, dada como un número seguido de "/second", "/minute", "/hour", o "/day" dependiendo de cuan a menudo quieras que la regla coincida. Si esta opción no se  utiliza y se usa <tt>-m limit</tt>, por defecto será "3/hour".
 
* '''<tt>-p</tt>''' - El protocolo de conexión usado.
 
* '''<tt>--dport</tt>''' - El puerto(s) de destino requerido para esta regla. Se puede dar un puerto único o un rango, como inicio:fin que se ajustarán a todos los puertos desde el principio hasta el final, inclusive.
 
* '''<tt>-j</tt>''' - Ir al objetivo especificado. Por defecto, iptables permite cuatro objetivos o targets:
 
** '''<tt>ACCEPT</tt>''' - Aceptar el paquete y parar el procesamiento de las reglas de esta cadena.
 
** '''<tt>REJECT</tt>''' - Rechazar el paquete y notificar al remitente que lo hicimos, y dejará de procesar reglas en esta cadena.
 
** '''<tt>DROP</tt>''' - Omitir el paquete, y dejar de procesamiento de las reglas de esta cadena.
 
** '''<tt>LOG</tt>''' - Acceder el paquete, y seguir procesando más reglas en esta cadena. Permite el uso de la opción <tt>-- log-prefix</tt> y <tt>-- log-level</tt>.
 
* '''<tt>--log-prefix</tt>''' - Cuando accedamos, poner este texto antes del mensaje de log. Utiliza comillas dobles en todo el texto a utilizar.
 
* '''<tt>--log-level</tt>''' - Acceda utilizando el nivel especificado syslog.7 es una buena elección a menos que necesites específicamente algo más. .
 
* '''<tt>-i</tt>''' - Solo coincidir si el paquete viene del interfaz espeficicado.
 
* '''<tt>-I</tt>''' - Inserta una regla. Toma dos opciones, la cadena donde insertar la regla y el número de regla que debería ser.
 
** '''<tt>-I INPUT 5</tt>''' insertará la regla en la cadena INPUT y hará de ella la quinta regla en la lista.
 
* '''<tt>-v</tt>''' - Muestra más información en la salida. Útil por si tienes reglas que parecen similares sin usar <tt>-v</tt>.
 
  
 +
== Permitir sesiones establecidas ==
 +
 +
Podemos también permitir sesiones establecidas para recibir el tráfico:
 +
 +
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 +
 +
 +
== Permitir tráfico entrante de puertos específicos ==
 +
 +
 +
Se podría empezar por el bloqueo de tráfico, pero deberías estar trabajando a través de SSH, por lo que necesitas permitir SSH antes de bloquear todo lo demás.
 +
 +
Para permitir el tráfico SSH por el puerto por defecto (22), puedes decirle a iptables que permita la entrada a todo el tráfico TCP entrante por ese puerto.
 +
 +
sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
 +
 +
Refiéndonos a la lista anterior, puedes ver que esto le dice a iptables:
 +
 +
* Añadir esta regla a la cadena input (-A INPUT), de manera que nos fijamos en el tráfico
 +
* Comprueba si el tráfico es TCP (-p tcp).
 +
* Si lo es, comprueba que la entrada va al puerto SSH (--dport ssh).
 +
* Si es así, acepta la entrada (-j ACCEPT).
 +
 +
Vamos comprobar las reglas: (solo se muestra la primera línea, tu verás más)
 +
 +
sudo iptables -L
 +
 +
Chain INPUT (policy ACCEPT)
 +
target    prot opt source              destination
 +
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
 +
 +
Ahora, vamos a permitir todo el tráfico entrante
 +
 +
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 +
 +
Comprobando nuestras reglas, tenemos:
 +
 +
  sudo iptables -L
 +
 +
Chain INPUT (policy ACCEPT)
 +
target    prot opt source              destination
 +
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:www
 +
 +
Tenemos permitido específicamente el tráfico tcp en los puertos ssh y web, pero como no tenemos bloqueado nada, todo el tráfico puede aun entrar.
 +
 +
 +
== Bloquear tráfico ==
 +
 +
Una vez que se toma la decisión de aceptar un paquete, ninguna regla más le afecta. Como las reglas que permiten el tráfico web y ssh vienen de antes, ya que nuestra regla de bloquear el tráfico viene después, podemos aún aceptar el tráfico que queramos. Todo lo que necesitamos hacer es poner la regla para bloquear todo el tráfico.
 +
 +
sudo iptables -A INPUT -j DROP
 +
listamos las reglas:
 +
sudo iptables -L
 +
Y obtenemos
 +
Chain INPUT (policy ACCEPT)
 +
target    prot opt source              destination
 +
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:www
 +
DROP      all  --  anywhere            anywhere
 +
 +
Como no hemos especificado un interfaz o protocolo, cualquier tráfico de cualquier puerto en cualquier interfaz está bloqueado, excepto para web y ssh.
 +
 +
== Editar iptables ==
 +
 +
El único problema con nuestra configuración de lejos es que incluso el puerto loopback está bloqueado.
 +
 +
 +
Podríamos haber escrito la regla solo para eth0 especificando -i eth0, pero, pero también podríamos añadir una regla para el loopback. Si se agrega esta regla, esta llegará muy tarde - después de que todo el tráfico sea bloqueado. Necesitamos insertar la regla antes de ésto. Dado que se trata de una gran cantidad de tráfico, la insertaremos como primera regla para que sea procesada en primer lugar
 +
 +
sudo iptables -I INPUT 1 -i lo -j ACCEPT
 +
Listamos las reglas:
 +
sudo iptables -L
 +
Y obtenemos
 +
Chain INPUT (policy ACCEPT)
 +
target    prot opt source              destination
 +
ACCEPT    all  --  anywhere            anywhere
 +
ACCEPT    all  --  anywhere            anywhere            state RELATED,ESTABLISHED
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:ssh
 +
ACCEPT    tcp  --  anywhere            anywhere            tcp dpt:www
 +
DROP      all  --  anywhere            anywhere
 +
 +
La primera y última línea parecen lo mismo, así que listaremos iptables con más detalle con la opción -v.
 +
 +
  sudo iptables -L -v
 +
Y obtenemos
 +
Chain INPUT (policy ALLOW 0 packets, 0 bytes)
 +
pkts bytes target    prot opt in    out    source      destination       
 +
    0    0 ACCEPT    all  --  lo    any    anywhere    anywhere
 +
    0    0 ACCEPT    all  --  any    any    anywhere    anywhere          state
 +
    RELATED,ESTABLISHED
 +
    0    0 ACCEPT    tcp  --  any    any    anywhere    anywhere          tcp dpt:ssh
 +
    0    0 ACCEPT    tcp  --  any    any    anywhere    anywhere          tcp dpt:www
 +
    0    0 DROP      all  --  any    any    anywhere    anywhere
 +
 +
Ahora puedes ver más información. Esta regla es de hecho muy importante, dado que muchos programas utilizan la interfaz loopback para comunicarse con otras. Si no permites la comunicación, podrías romper esos programas.
  
 
== Enmascaramiento IP ==
 
== Enmascaramiento IP ==
Línea 53: Línea 352:
 
El propósito del Enmascaramiento IP (IP Masquerading) es permitir que máquinas con direcciones IP privadas no enrutables de una red accedan a Internet a través de la máquina que realiza el enmascaramiento. Se debe manipular el tráfico que va de su red privada con destino a Internet, para que las respuestas puedan encaminarse adecuadamente a la máquina que hizo la petición. Para ello, el núcleo debe modificar la dirección IP fuente de cada paquete de forma que las respuestas se encaminen hacia ella, en lugar de encaminarla hacia la dirección IP privada que hizo la petición, lo que resulta imposible en Internet. Linux usa Seguimiento de Conexión (Connection Tracking, conntrack) para llevar la cuenta de qué conexiones pertenencen a qué máquinas, y reencaminar adecuadamente cada paquete de retorno. El tráfico que sale de su red privada es, por consiguiente, «enmascarada» dando la sensación de que se ha originado en la máquina Ubuntu que hace de pasarela. Este proceso se denomina Compartición de Conexiones de Internet (Internet Connection Sharing) en la documentación de Microsoft.
 
El propósito del Enmascaramiento IP (IP Masquerading) es permitir que máquinas con direcciones IP privadas no enrutables de una red accedan a Internet a través de la máquina que realiza el enmascaramiento. Se debe manipular el tráfico que va de su red privada con destino a Internet, para que las respuestas puedan encaminarse adecuadamente a la máquina que hizo la petición. Para ello, el núcleo debe modificar la dirección IP fuente de cada paquete de forma que las respuestas se encaminen hacia ella, en lugar de encaminarla hacia la dirección IP privada que hizo la petición, lo que resulta imposible en Internet. Linux usa Seguimiento de Conexión (Connection Tracking, conntrack) para llevar la cuenta de qué conexiones pertenencen a qué máquinas, y reencaminar adecuadamente cada paquete de retorno. El tráfico que sale de su red privada es, por consiguiente, «enmascarada» dando la sensación de que se ha originado en la máquina Ubuntu que hace de pasarela. Este proceso se denomina Compartición de Conexiones de Internet (Internet Connection Sharing) en la documentación de Microsoft.
  
Esto se puede conseguir con una sóla regla de iptables, que puede variar ligeramente en función de la configuración de su red:
+
Esto se puede conseguir con una sola regla de iptables, que puede variar ligeramente en función de la configuración de su red:
  
 
  sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
 
  sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE
Línea 74: Línea 373:
 
== Herramientas ==
 
== Herramientas ==
  
Hay muchas herramientas disponibles que pueden ayudarle a construir un completo firewall sin necesidad de conocer iptables en profundidad. Para los que se inclinan por una solución gráfica, [[Firestarter]] es muy popular y fácil de usar, y fwbuilder es muy potente y tiene un aspecto familiar para aquellos administradores que hayan usado herramientas comerciales de firewall como Checkpoint FireWall-1. Si prefiere una utilidad de línea de órdenes con archivos de configuración en texto plano, Shorewall es una solución muy potente para ayudarle a configurar un firewall avanzado para cualquier red. Si su red es relativamente simple, o no dispone de red, ipkungfu le proporcionará un firewall funcional con desde el principio sin necesidad de configuración, y le permitirá crear fácilmente un firewall más avanzado editando archivos de configuración sencillos y bien documentados. Otra herramienta interesante es fireflier, diseñado para ser una aplicación firewall de escritorio. Está formada por un servidor (fireflier-server) y una selección de clientes GUI (GTK o QT), y se comporta de manera muy similar a muchas aplicaciones interactivas de firewall para Windows.
+
Hay muchas herramientas disponibles que pueden ayudarle a construir un completo firewall sin necesidad de conocer iptables en profundidad. Para los que se inclinan por una solución gráfica, '''[[Firestarter]]''' es muy popular y fácil de usar, y '''fwbuilder''' es muy potente y tiene un aspecto familiar para aquellos administradores que hayan usado herramientas comerciales de firewall como Checkpoint FireWall-1. Si prefiere una utilidad de línea de órdenes con archivos de configuración en texto plano, '''Shorewall''' es una solución muy potente para ayudarle a configurar un firewall avanzado para cualquier red. Si su red es relativamente simple, o no dispone de red, '''ipkungfu''' le proporcionará un firewall funcional desde el principio sin necesidad de configuración, y le permitirá crear fácilmente un firewall más avanzado editando archivos de configuración sencillos y bien documentados. Otra herramienta interesante es '''fireflier''', diseñado para ser una aplicación firewall de escritorio. Está formada por un servidor (fireflier-server) y una selección de clientes GUI (GTK o QT), y se comporta de manera muy similar a muchas aplicaciones interactivas de firewall para Windows.
  
 
== Logs ==
 
== Logs ==
Línea 87: Línea 386:
  
 
El registro anterior también aparecerá en <tt>/var/log/messages</tt>, <tt>/var/log/syslog</tt> y <tt>/var/log/kern.log</tt>. Este comportamiento se puede cambiar editando apropiadamente el archivo <tt>/etc/syslog.conf</tt>, o instalando y configurando <tt>ulogd</tt> y utilizando el objetivo ULOG en lugar del LOG. El demonio ulogd es un servidor en espacio de usuario, que escucha las instrucciones de registro que provienen del núcleo y que sean específicamente para firewalls, y puede registrar cualquier archivo que desee, o incluso a una base de datos [[PostgreSQL]] o [[MySQL]]. Se puede simplificar la interpretación del significado de los registros del firewall usando una herramienta de análisis de registros como fwanalog, fwlogwatch o lire.
 
El registro anterior también aparecerá en <tt>/var/log/messages</tt>, <tt>/var/log/syslog</tt> y <tt>/var/log/kern.log</tt>. Este comportamiento se puede cambiar editando apropiadamente el archivo <tt>/etc/syslog.conf</tt>, o instalando y configurando <tt>ulogd</tt> y utilizando el objetivo ULOG en lugar del LOG. El demonio ulogd es un servidor en espacio de usuario, que escucha las instrucciones de registro que provienen del núcleo y que sean específicamente para firewalls, y puede registrar cualquier archivo que desee, o incluso a una base de datos [[PostgreSQL]] o [[MySQL]]. Se puede simplificar la interpretación del significado de los registros del firewall usando una herramienta de análisis de registros como fwanalog, fwlogwatch o lire.
 +
 +
== Guardar los cambios realizados a iptables ==
 +
 +
Si reiniciara el sistema luego de haber aplicado estas reglas los cambios se perderían. Más que volver a escribir esto cada vez que reinicias, lo lógico es guardar la configuración y hacer que se aplique automáticamente. Para guardar la configuración puedes usar <tt>iptables-save</tt> y <tt>iptables-restore</tt>.
 +
  
 
[[Categoría:Servidores]][[Categoría:Seguridad]]
 
[[Categoría:Servidores]][[Categoría:Seguridad]]

Última revisión de 21:07 6 mayo 2012

Important.png Uno o más colaboradores están trabajando actualmente en extender esta página. Es posible que, a causa de ello, haya lagunas de contenido, deficiencias de formato o texto en otros idiomas. Por favor, antes de realizar correcciones mayores o reescrituras, contacta con ellos en su página de usuario o en la página de discusión del artículo para poder coordinar la redacción.

El kernel Linux incluye el subsistema Netfilter, que es usado para manipular o decidir el destino del tráfico de red entre o a través de su red. Todas las soluciones firewall Linux modernas utilizan este sistema para el filtrado de paquetes.

El sistema de filtrado de paquetes del núcleo resulta de poca ayuda a los administradores si no se tiene una interfaz de usuario para gestionarlo. Éste es el propósito de Iptables. Cuando un paquete llega a su servidor, éste es gestionado por el subsistema Netfilter para aceptarlo, manipularlo o rechazarlo basándose en las reglas suministradas a éste vía iptables. Así, iptables es todo lo que necesita para manejar su cortafuegos si está familiarizado con él, pero existen muchos interfaces de usuario disponibles para simplificar esta tarea., por ejemplo Firestarter

Aclaramos que en versiones anteriores al kernal 2.4.* se llamaba ipchain, pero a partir de esta versión se cambió a Iptables, mucho más potente.

Iptables está basado en el uso de TABLAS dentro de las tablas, CADENAS, formadas por agrupación de REGLAS, parámetros que relativizan las reglas y finalmente una ACCION, que es la encargada de decir qué destino tiene el paquete.

Describimos los elementos y luego vemos un sencillo script básico.

Contenido

[editar] Las Tablas

FILTER (filtrado)Permite generar las reglas de filtrado o sea, qué paquetes aceptar, cuales rechazar o cuales omitir.Es la tabla por defecto. Las cadenas serán: INPUT OUTPUT y FORWARD.
NAT (Network Address Translation) Desde esta tabla es posible el enmascaramiento de IP, se usa para redireccionar puertos o cambiar las :IPs de origen y destino a través de interface de red. Las cadenas serán :PREROUTING y POSTROUTING

MANGLE (Modificado de paquetes)Permite la modificación de paquetes como ToS (Type of Service), TTL (Time to live)o mark, marcar el paquete.
RAW Esta tabla se usa para configurar principalmente excepciones en el seguimiento de paquetes en combinación con la acción o target NOTRACK. Trabaja sobre la cadena PREROUTING Y OUTPUT y su única acción es Notrack. Puede evitar que iptables haga un seguimiento de los paquetes.
Describimos los elementos y luego vemos un sencillo script básico.
CORRESPONDENCIA de TABLAS, CADENAS y FUNCION
TABLA FUNCION CADENA FUNCION de la CADENA
FILTER Filtrado de paquetes
INPUT
Filtrado de paquetes que llegan al firewall
OUTPUT
Filtrado de los paquetes de salida
FORWARD
Permite el paso de paquetes a otra dirección del firewall
NAT Enrutamiento de
direcciones de red
PREROUTING
Chequea la dirección de red antes de reenviarla.
Facilita la modificación de la información para facilitar el enrutado
Se usa también como DESTINATION NAT o DNAT
POSTROUTING
Tratamiento de la dirección IP después del enrutado.Esto hace
que no sea necesario la modificación del destino de la dirección IP
del paquete como en pre-routing.Se usa como SOURCE NAT o SNAT
OUTPUT
Interpretación de las direcciones de Red de los paquetes
que salen del firewall.Escasamente usado.
MANGLE Modificación de las
cabeceras de TCP
PREROUTING
POSTROUTING
INPUT
OUTPUT
FORWARD
Permite la modificación del paquete como puede ser TOS
(type of Service), marcado de los mismos para
QOS o calidad de servicio
RAW Acción NOTRACK
PREROUTING
Esta tabla se usa para configurar principalmente excepciones
en el seguimiento de paquetes en combinación
con la acción o target NOTRACK.
OUTPUT



A partir de aquí, dividiremos las opciones en algunos grupos

[editar] Comandos de Iptables

Como hacíamos referencia más arriba, dentro de las tablas hay cadenas a su vez vez formadas por agrupaciones de reglas. Es importante ver que cada tabla tiene cadenas por defecto, que no se pueden eliminar.
A las CADENAS por defecto podemos unir cadenas creadas por nosotros mismos para un mejor funcionamiento del filtrado o el enrutamiento.
El comando IPTABLES tiene a su vez parámetros y comandos que permitirán definir el comportamiento de una o varias reglas. Esto es, agregar una regla, modificar una regla existente, eliminar el nombre de una cadena

Describimos algunos de los comandos más comunes.



FUNCION de COMANDOS
COMANDO FUNCION
-A Agregar nueva regla a la cadena especificada.
-I Insertar nueva regla antes de la regla número_regla(rulenum)
en la cadena especificada de acuerdo a los parámetros sometida.
-R Reemplazar la regla (rulenum) en la cadena especificada.
-E Modifica el nombre de la cadena.
[nombre-anterior-cadena por nombre-nueva-cadena]
-L Listado de reglas de la cadena especificada. Si no se determina una
cadena en particular, listará todas las cadenas existentes.
-N Crear nueva cadena asociándola a un nombre.
-P Modifica la acción por defecto de la cadena preseleccionada.
-D Eliminar la regla_número(rulenum) en la cadena seleccionada.
-Z Pone los contadores de paquetes y bytes a cero en la cadena seleccionada.
De no poner seleccionar una cadena, pondrá a cero todos los contadores de
todas las reglas en todas cadenas.
(Lista completa en: man iptables)



[editar] Parámetros

Todas las reglas en iptables tienen definida su condición por los parámetros, que constituyen su parte primordial.
Algunos de estos parámetros son:


PARAMETROS y su FUNCION
PARAMETRO FUNCION
-i Interfaz de entrada (eth0,eth1,eth2...)
-o Interfaz de salida (eth0,eth1,eth2...)
--sport Puerto de origen
--dport Puerto destino
-p El protocolo del paquete a comprobar, tcp, udp, icmp ó all.
Por defecto es all
-j Esto especifica el objetivo de la cadena de reglas, o sea una acción
--line-numbers Cuando listamos las reglas, agrega el número que ocupa cada regla
dentro de la cadena
(Ver lista completa en: man iptables)


[editar] Acciones

Y finalmente, las ACCIONES que estarán siempre al final de cada regla que determinará que hacer con los paquetes afectados. Si no se especifica ninguna acción, se ejecutará la opción por defecto que cada cadena tiene asignada. Las acciones serían:


ACCEPT---> Paquete aceptado.
REJECT---> Paquete rechazado. Se envía notificación a través del protocolo ICMP.
DROP---> Paquete rechazado. Sin notificación
MASQUERADE--->Enmascaramiento de la dirección IP origen de forma dinámica.Esta acción es sólo válida en la tabla NAT en la cadena postrouting.
DNAT---> Enmascaramiento de la dirección destino, muy conveniente para re-enrutado de paquetes.
SNAT---> enmascaramiento de la IP origen de forma similar a masquerade, pero con IP fija.


Ya tenemos los componentes esenciales para formar las reglas que determinarán la aceptación o denegación de entrada y salida de paquetes de nuestra máquina, tanto a través de Internet,como de nuestra propia red doméstica.
Ahora veremos cómo se construyen las reglas y como hacer un script de shell en el que se van aplicando aquellas reglas que necesitemos.


MUY IMPORTANTE. Cuidado con el orden en el cual disponemos las reglas.
IPTABLES LEE DE MANERA SECUENCIAL LAS CADENAS DE REGLAS.
Es decir, comienza por la primera y verifica que se cumpla la condición y
la ejecuta sin verificar las siguientes.
Por consiguiente, si la primera regla en la tabla filter de la cadena
input es rechazar cualquier paquete,las siguientes reglas no serán verificadas,
y se rechazará cualquier paquete.


[editar] Modelo de Cadena de Reglas

La estructura o el esqueleto de una regla básicamente sería:


iptables --> -t -->tabla -->tipo_operación -->cadena -->regla_con_parámetros -->Acción


Explicamos por pasos agregando debajo valores reales:

iptables -t--> tabla--> tipo_operación--> cadena--> regla_con_parámetros--> ACCION
iptables -t filter -A INPUT -p tcp -dport 23 -j DROP


Ahora quitando espacios:

iptables -t filter -A INPUT -p tcp -dport 23 -j DROP

¿Qué nos dice esta cadena de reglas?

Que en la tabla filter, la cadena input filtra los paquetes con protocolo tcp que entran por el puerto 23 (puerto asignado a telnet) y éstos son rechazados (DROP) sin ninguna notificación.

Algunas consideraciones. De acuerdo con lo hemos comentado antes, podríamos escribir lo mismo de otra forma,por ej. quitando "-t filter", ya que es la tabla por defecto, además podemos cambiar el número de puerto por"telnet" que en realidad es su puerto asignado. Queda:

iptables -A INPUT -p tcp -dport telnet -j DROP

Si por el contrario, quisiéramos aceptar estos paquetes:

iptables -A INPUT -p tcp -dport telnet -j ACCEPT

O aceptamos tráfico http:

iptables -A INPUT -p tcp -dport http -j ACCEPT

donde también podemos especificar el interfaz de entrada (-i etho)

iptables -A INPUT -i eth0 -p tcp -dport http -j ACCEPT

también:

iptables -A INPUT -p tcp -dport 80 -j ACCEPT

Aplicando los conceptos anteriores:


sudo iptables -L

se listan las actuales reglas en iptables. Si acabas de instalar un servidor, aún no tendrás normas, así que deberías ver:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination



[editar] Permitir sesiones establecidas

Podemos también permitir sesiones establecidas para recibir el tráfico:

sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


[editar] Permitir tráfico entrante de puertos específicos

Se podría empezar por el bloqueo de tráfico, pero deberías estar trabajando a través de SSH, por lo que necesitas permitir SSH antes de bloquear todo lo demás.

Para permitir el tráfico SSH por el puerto por defecto (22), puedes decirle a iptables que permita la entrada a todo el tráfico TCP entrante por ese puerto.

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT

Refiéndonos a la lista anterior, puedes ver que esto le dice a iptables:

  • Añadir esta regla a la cadena input (-A INPUT), de manera que nos fijamos en el tráfico
  • Comprueba si el tráfico es TCP (-p tcp).
  • Si lo es, comprueba que la entrada va al puerto SSH (--dport ssh).
  • Si es así, acepta la entrada (-j ACCEPT).

Vamos comprobar las reglas: (solo se muestra la primera línea, tu verás más)

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh

Ahora, vamos a permitir todo el tráfico entrante

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Comprobando nuestras reglas, tenemos:

 sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www

Tenemos permitido específicamente el tráfico tcp en los puertos ssh y web, pero como no tenemos bloqueado nada, todo el tráfico puede aun entrar.


[editar] Bloquear tráfico

Una vez que se toma la decisión de aceptar un paquete, ninguna regla más le afecta. Como las reglas que permiten el tráfico web y ssh vienen de antes, ya que nuestra regla de bloquear el tráfico viene después, podemos aún aceptar el tráfico que queramos. Todo lo que necesitamos hacer es poner la regla para bloquear todo el tráfico.

sudo iptables -A INPUT -j DROP

listamos las reglas:

sudo iptables -L

Y obtenemos

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere

Como no hemos especificado un interfaz o protocolo, cualquier tráfico de cualquier puerto en cualquier interfaz está bloqueado, excepto para web y ssh.

[editar] Editar iptables

El único problema con nuestra configuración de lejos es que incluso el puerto loopback está bloqueado.


Podríamos haber escrito la regla solo para eth0 especificando -i eth0, pero, pero también podríamos añadir una regla para el loopback. Si se agrega esta regla, esta llegará muy tarde - después de que todo el tráfico sea bloqueado. Necesitamos insertar la regla antes de ésto. Dado que se trata de una gran cantidad de tráfico, la insertaremos como primera regla para que sea procesada en primer lugar

sudo iptables -I INPUT 1 -i lo -j ACCEPT

Listamos las reglas:

sudo iptables -L

Y obtenemos

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
DROP       all  --  anywhere             anywhere

La primera y última línea parecen lo mismo, así que listaremos iptables con más detalle con la opción -v.

 sudo iptables -L -v

Y obtenemos

Chain INPUT (policy ALLOW 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source       destination         
   0     0 ACCEPT     all  --  lo     any     anywhere     anywhere
   0     0 ACCEPT     all  --  any    any     anywhere     anywhere          state 
   RELATED,ESTABLISHED
   0     0 ACCEPT     tcp  --  any    any     anywhere     anywhere          tcp dpt:ssh
   0     0 ACCEPT     tcp  --  any    any     anywhere     anywhere          tcp dpt:www
   0     0 DROP       all  --  any    any     anywhere     anywhere

Ahora puedes ver más información. Esta regla es de hecho muy importante, dado que muchos programas utilizan la interfaz loopback para comunicarse con otras. Si no permites la comunicación, podrías romper esos programas.

[editar] Enmascaramiento IP

El propósito del Enmascaramiento IP (IP Masquerading) es permitir que máquinas con direcciones IP privadas no enrutables de una red accedan a Internet a través de la máquina que realiza el enmascaramiento. Se debe manipular el tráfico que va de su red privada con destino a Internet, para que las respuestas puedan encaminarse adecuadamente a la máquina que hizo la petición. Para ello, el núcleo debe modificar la dirección IP fuente de cada paquete de forma que las respuestas se encaminen hacia ella, en lugar de encaminarla hacia la dirección IP privada que hizo la petición, lo que resulta imposible en Internet. Linux usa Seguimiento de Conexión (Connection Tracking, conntrack) para llevar la cuenta de qué conexiones pertenencen a qué máquinas, y reencaminar adecuadamente cada paquete de retorno. El tráfico que sale de su red privada es, por consiguiente, «enmascarada» dando la sensación de que se ha originado en la máquina Ubuntu que hace de pasarela. Este proceso se denomina Compartición de Conexiones de Internet (Internet Connection Sharing) en la documentación de Microsoft.

Esto se puede conseguir con una sola regla de iptables, que puede variar ligeramente en función de la configuración de su red:

sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE

La orden anterior supone que su espacio de direcciones privadas es 192.168.0.0/16 y que el dispositivo que conecta con Internet es ppp0. La sintaxis se descompone de la siguiente forma:

  • -t nat -- la regla es para ir a la tabla nat
  • -A POSTROUTING -- la regla es para añadir (-A) a la cadena POSTROUTING
  • -s 192.168.0.0/16 -- la regla se aplica al tráfico originado desde la dirección específica
  • -o ppp0 -- la regla se aplica al tráfico programado para ser enrutado a través del dispositivo de red especificado
  • -j MASQUERADE -- el tráfico que se ajuste a esta regla «saltará» («jump», -j) al destino MASQUERADE para ser manipulado como se describió anteriormente

Cada cadena en la tabla de filtrado (la tabla predeterminada, y donde ocurren la mayoría de los filtrados de paquetes) tiene una política predeterminada de ACCEPT, pero si está creando un firewall además de un dispositivo de pasarela, debería establecer las políticas a DROP o REJECT, en cuyo caso necesitará habilitar su tráfico enmascarado a través de la cadena FORWARD para que la regla anterior funcione:

sudo iptables -A FORWARD -s 192.168.0.0/16 -o ppp0 -j ACCEPT
sudo iptables -A FORWARD -d 192.168.0.0/16 -m state --state ESTABLISHED,RELATED -i ppp0 -j ACCEPT

Las órdenes anteriores permitirán todas las conexiones que vayan de su red local a Internet, así como el retorno a la máquina que las inició de todo el tráfico relacionado con esas conexiones.

[editar] Herramientas

Hay muchas herramientas disponibles que pueden ayudarle a construir un completo firewall sin necesidad de conocer iptables en profundidad. Para los que se inclinan por una solución gráfica, Firestarter es muy popular y fácil de usar, y fwbuilder es muy potente y tiene un aspecto familiar para aquellos administradores que hayan usado herramientas comerciales de firewall como Checkpoint FireWall-1. Si prefiere una utilidad de línea de órdenes con archivos de configuración en texto plano, Shorewall es una solución muy potente para ayudarle a configurar un firewall avanzado para cualquier red. Si su red es relativamente simple, o no dispone de red, ipkungfu le proporcionará un firewall funcional desde el principio sin necesidad de configuración, y le permitirá crear fácilmente un firewall más avanzado editando archivos de configuración sencillos y bien documentados. Otra herramienta interesante es fireflier, diseñado para ser una aplicación firewall de escritorio. Está formada por un servidor (fireflier-server) y una selección de clientes GUI (GTK o QT), y se comporta de manera muy similar a muchas aplicaciones interactivas de firewall para Windows.

[editar] Logs

Los registros del firewall son esenciales para reconocer ataques, corregir problemas en las reglas de su firewall, y observar actividades inusuales en su red. Debe incluir reglas de registro en su firewall para poder activarlos, y las reglas de registro deben aparecer antes de cualquier otra regla final aplicable (una regla con un objetivo que decide el destino del paquete, como ACCEPT, DROP o REJECT). Por ejemplo,

sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j LOG --log-prefix "NEW_HTTP_CONN: "

Una petición al puerto 80 desde la máquina local, por tanto, podría generar un registro en dmesg con el siguiente aspecto:

[4304885.870000] NEW_HTTP_CONN: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=58288 DF PROTO=TCP SPT=53981 DPT=80 WINDOW=32767 RES=0x00 SYN URGP=0

El registro anterior también aparecerá en /var/log/messages, /var/log/syslog y /var/log/kern.log. Este comportamiento se puede cambiar editando apropiadamente el archivo /etc/syslog.conf, o instalando y configurando ulogd y utilizando el objetivo ULOG en lugar del LOG. El demonio ulogd es un servidor en espacio de usuario, que escucha las instrucciones de registro que provienen del núcleo y que sean específicamente para firewalls, y puede registrar cualquier archivo que desee, o incluso a una base de datos PostgreSQL o MySQL. Se puede simplificar la interpretación del significado de los registros del firewall usando una herramienta de análisis de registros como fwanalog, fwlogwatch o lire.

[editar] Guardar los cambios realizados a iptables

Si reiniciara el sistema luego de haber aplicado estas reglas los cambios se perderían. Más que volver a escribir esto cada vez que reinicias, lo lógico es guardar la configuración y hacer que se aplique automáticamente. Para guardar la configuración puedes usar iptables-save y iptables-restore.

[editar] Fuentes

Herramientas personales