Linux - Instalación de un firewall

Septiembre 2017



Consideraciones previas


No intentes hacer lo que explico aquí si tienes tareas que se están ejecutando. Algunos de los comando dados aquí pueden bloquear ciertas aplicaciones en tu PC y quizás no puedas volver a atrás. Igualmente, si ya tienes instalado un firewall en tu PC, los scripts descritos más adelante podrían desconfigurar las reglas del firewall ya definidas.
Si tienes una red local en casa, algunos de los scripts pueden bloquear las conexiones.
El script descrito en este artículo se aplica a un solo PC, no formando parte de una red local

Existen varias maneras de configurar un cortafuegos bajo Linux.

II - Iptables


Iptables es una herramienta de cortafuegos que está, casi siempre, disponible en el núcleo Linux (para los núcleos 2.4 y 2.6).
Su administración se efectúa en línea de comandos y como usuario root.

II.1 - Introducción


En primer lugar será necesario comprender el concepto de tablas y cadenas en iptables.
Veamos primeramente una descripción de cada tabla:
  • La tabla NAT (no es la que nos concierne) sirve para el enrutamiento (masquerading), podríamos decir que permite definir el desvío de ciertas conexiones, indicarles que ruta tomar, cambiar su destino o procedencia. Por ejemplo, sirve para compartir una conexión a Internet.
  • La tabla MANGLE. Es raramente empleada ya que tiene que ver con funciones avanzadas del firewall. En general, podemos decir que esta tabla tiene que ver con la modificación de paquetes. Permite "marcar" los paquetes o modificar su encabezado con el fin de un enrutamiento avanzado entre varias interfaces, de una gestión de ancho de bandas y/o de servicios (estilo ToS, QoS o iproute).
  • La tabla FILTER (la que nos interesa) permite definir lo que puede pasar y lo que no puede pasar.


Cada vez que utilicemos un script iptables en este articulo, llamaremos a esta tabla de la siguiente manera:

iptables -t filter


Añadiendo -t, filter será la tabla utilizada por defecto si no indicamos nadas cuando llamamos a iptables.
Por lo tanto podemos escribir simplemente "iptables", pero al menos esto nos puede hacer aprender buenos hábitos y evitarnos confusiones cuando utilicemos las otras tablas en el futuro.

Ahora veamos las cadenas. Hay tres:

La cadena INPUT. Es el centro de las conexiones entrantes a nuestra máquina, las procedentes del exterior.

La cadena OUTPUT. Es el centro de las conexiones salientes y generadas en nuestra máquina. Cuando nos conectamos a un sitio Web, la conexión comienza por una petición saliendo de nuestra máquina hacia el sitio Web.

La cadena FORWARD, para las conexiones que serán enrutadas, es decir las conexiones que hemos solicitado que sean desviadas.

Cuando llamamos a una de estas cadenas, lo hacemos de este modo:

iptables -t <tabla> -Action <cadena>


La tabla, es filter, la acción puede ser A , -I , -P o -D (más otras más especificas que no hablaremos aquí), esto lo veremos más adelante. Con respecto a la cadena, tenemos la posibilidad de elegir entre una de las tres que mencionamos anteriormente.

Ejemplo:

iptables -t filter -A INPUT (regla por definir)

II.2 - P de Policy: Política


Para comenzar, definimos una política general para las tres cadenas de la tabla filter (la tabla que filtra los paquetes).
La política, es la regla superior, la regla por defecto para una conexión que concierne tal cadena.
=> Si el firewall no encuentra ninguna regla para esta conexión, entonces se somete a la política de esta cadena.

Para configurar una política, utilizamos esta sintaxis:

iptables -t <tabla> -P <cadena> <politica>


(Nota : la configuración que sigue sólo te interesará si te conectas a Internet a través de una interfaz ppp0. Infórmate bien acerca de tu propia configuración. Puedes consultar tus interfaces y su configuración con el comando /sbin/ifconfig.)

Para crear un firewall básico que bloquee únicamente las conexiones entrantes, en primer lugar construimos las políticas de las tres cadenas de la tabla filter:

iptables -t filter -P INPUT DROP  
iptables -t filter -P FORWARD ACCEPT  
iptables -t filter -P OUTPUT ACCEPT


Las dos políticas que debemos conocer son "ACCEPT" y "DROP".
ACCEPT: acepto las conexiones; DROP: rechazo las conexiones.

Aquí, las conexiones salientes no serán filtradas. Por lo tanto, ésta no es una configuración muy segura pero al menos bloquea las conexiones entrantes. Al menos es mejor que nada.

II.3 - A de Append: Añadir


Luego, dejaremos a las aplicaciones que utilizan el bucle local ejecutarse sin que sean bloqueadas. Ya que ciertas aplicaciones utilizan las conexiones TCP en la bucle local (127.0.0.1) para ejecutarse. Por consiguiente, añadimos una regla para la cadena INPUT para indicarle que las conexiones procedentes de la dirección de bucle local y entrando hacia la interfaz local sean aceptadas:

iptables -t filter -A INPUT -s 127.0.0.1 -i lo -j ACCEPT


Aquí, utilizamos -A para indicar a iptables que vamos a añadir una nueva regla.
Vamos a descomponer esta línea para hacer una breve explicación:

"-A INPUT" quiere decir que vamos a añadir una regla en la cadena input. -s 127.0.0.1 quiere decir que esta nueva regla tiene que ver con las conexiones procedentes de la bucle local. -i lo para indicar que la regla se aplica a las conexiones entrando (-i interfaz entrante) a la interfaz local designada por "lo". (en las demás interfaces a parte de lo, tenemos también eth0 para la interfaz ethernet, ppp0 para la interfaz de un MODEM (Internet) etc... eth0 y ppp0 pueden también ser eth1 o ppp1 dependiendo del número de interfaces ethernet o ppp que poseamos). Y finalmente j ACCEPT para indicar que la regla es la de aceptar estas conexiones.

Con lo que tenemos hasta aquí, corremos el riego de no poder navegar en Internet ya que al intentar acceder a un sitio Web, si éste responde, nuestro firewall lo bloqueará. Por ello, debemos utilizar un modulo llamado "state" que contiene varias opciones, especialmente las que nos interesan: ESTABLISHED y RELATED.
ESTABLISHED quiere decir que la conexión analizada por el firewall ha sido vista por éste anteriormente en el otro sentido.

Por ejemplo, enviamos una petición a http://es.ccm.net/ para acceder a la página de Inicio. El firewall ha visto pasar una petición saliendo de nuestra máquina hacia Kioskea. Kioskea nos envía una respuesta. Aquí, el firewall constatará que somos nosotros quienes hemos comenzado esta conexión, entonces considerará esta conexión como "ESTABLISHED". "RELATED" concierne a nuevas conexiones pero que han sido inicializadas par una conexión ya existente y establecida. Sólo este tipo de conexiones serán autorizadas, esto nos da:

iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


Estos nuevos elementos significan:
-m state=> Cargamos el modulo estate.--state ESTABLISHED,RELATED=> de este modulo state, se especifican los estados ESTABLISHED y RELATED, por lo tanto solo las conexiones de este tipo serán concernidas por la regla.

Resumiremos los comandos para escribir nuestro firewall:

iptables -t filter -P INPUT DROP  
iptables -t filter -P FORWARD ACCEPT  
iptables -t filter -P OUTPUT ACCEPT  

iptables -t filter -A INPUT -s 127.0.0.1 -i lo -j ACCEPT  
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

II.4 - I de Insert : Insertar


Esta acción es parecida a la acción A (Append) vista anteriormente, se trata de insertar una regla en la tabla de filtrado. Es necesario saber que las reglas de filtrado son recorridas en cierto orden cuando un paquete es examinado. Atención: el orden de las reglas puede cambiar totalmente el comportamiento del firewall.
Una regla definida con -A será simplemente añadida a continuación de las reglas ya establecidas en la cadena concernida. Las reglas definidas antes tendrán por lo tanto prioridad (si el paquete examinado corresponde a la descripción de una regla, entonces las siguientes reglas no serán utilizadas).
Una regla insertada con -I se colocará al inicio de las reglas de la cadena en lugar de añadirse después. Por lo tanto, esta regla desplazará a todas las otras hacia abajo. Tendrá prioridad sobre todas las otras.
Por lo general, esta acción es utilizada en casos específicos, por ejemplo si repentinamente necesitamos bloquear o autorizar un servicio, y esto, a pesar de las reglas del firewall definidas inicialmente.
También podemos insertar una regla en un lugar preciso con -I (ver más adelante las paginas del manual)

II.5 - L de List : Lister


Para listar, consultar las reglas de nuestro firewall:

iptales -t filter -L


Veamos esta lista detallada. Con esto, tendremos un firewall básico para la mayoría de configuraciones, en máquinas únicas, con modem ADSL conectado por USB por ejemplo (quizás incluso para los modem con baja velocidad de trasferencia). Digo firewall básico porque éste no opone ninguna restricción a las conexiones salientes. Además, no es lo más adaptado si tenemos un servidor o una aplicación a la escucha en un puerto. Por ejemplo, si tenemos un servidor http, probablemente tengamos que desbloquear el puerto 80.
Para abrir el puerto tcp 80 a las conexiones entrantes:

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

II.6 - D de Delete: Borrar


Acabamos de ver que podemos obtener una lista detallada utilizando el argumento -L. Puede que sea necesario borrar una regla.
Por ejemplo, ya no necesitamos más nuestro servidor http por hoy, vamos a ocultar el puerto 80, porque ya no tenemos ninguna aplicación a la escucha en este puerto. Por lo tanto, borraremos la regla de uso de conexión en el puerto TCP 80. Entonces, será la política de nuestra cadena INPUT que la reemplazará con esta regla por defecto que hemos definido anteriormente => DROP.

Utilizaremos entonces el argumento -D con esta sintaxis:

iptables -t <tabla> -D <cadena> <n° de la regla a borrar>


Entonces tendremos que encontrar el n° de nuestra regla. Para ello, utilizaremos el comando "iptables -t filter -L" que nos da:

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

Chain FORWARD (policy ACCEPT)  
target     prot opt source               destination  

Chain OUTPUT (policy ACCEPT)  
target     prot opt source               destination


Aquí encontramos nuestras políticas y las reglas de las cadenas. Para la cadena INPUT, mi primera regla, es la de aceptar todo lo que proviene de "cualquier parte" siempre y cuando la conexión sea "ESTABLISHED" o "RELATED".
En 2, tenemos "Aceptar todas las conexiones procedentes de localhost".
Y en 3, tenemos "Aceptar todas las conexiones en el puerto "www", es decir el puerto 80.

Por lo tanto, es la regla 3 de la cadena INPUT que nos interesa. Para eliminarla escribimos:

iptables -t filter -D INPUT 3


Nuestro firewall no encontrará más la regla para las conexiones hacia el puerto TCP 80, y se someterá a la política de INPUT que es DROP, por lo tanto, las conexiones serán rechazadas.

II.7 - F de Flush : Limpiar


Si deseamos volver a cero nuestro firewall y pedirle que no bloquee ninguna conexión (configuración por defecto por lo general), debemos escribir:

# Para vaciar las reglas de toda la tabla "filter"  
iptables -t filter -F  

# Para que las politicas acepten las conexiones  
iptables -P INPUT ACCEPT  
iptables -P FORWARD ACCEPT  
iptables -P OUTPUT ACCEPT


Evidentemente esto volverá a nuestro sistema vulnerable, pero regresará a la configuración por defecto si no hemos aplicado ningún firewall antes de probar estos scripts.

Fuente y documentación completa:

III - Las alternativas


Existen una gran cantidad de programas que nos pueden facilitar la administración de nuestro firewall, casi siempre (sino siempre) son front-end para iptables, es decir interfaces que vuelven más fácil la configuración de iptables.

Consulta también

Publicado por Carlos-vialfa. Última actualización: 31 de octubre de 2012 a las 22:42 por Jeff.
El documento «Linux - Instalación de un firewall» se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo libremente. No olvides citar a CCM (es.ccm.net) como tu fuente de información.