Linux.El Cortafuegos.

Ismael Royano Gómez
Enredando con Linux.
7 min readMay 6, 2016

¿Que es un cortafuegos?. Un cortafuegos o firewall es un dispositivo que filtra el tráfico de dos o más redes, es decir, decide si una conexión se establece o no.

Voy a explicarlo con un pequeño ejemplo/metáfora para que lo entendamos mejor:

Imaginamos un discoteca, donde la gente no para de entrar y salir del local para divertirse, bailar, tomar unas copas…etc. Como es lógico tenemos que vigilar el negocio, controlar un poco quien entra y quien sale y para ello contratamos a un portero. La misión del portero es observar un poco y saber a quien deja pasar al local y a quien no. Para proceder pues se rige por unas políticas básicas, como es por ejemplo, los zapatos, forma de vestir, aptitud, aforo, edad…etc.

En este ejemplo, nuestro ordenador sería el local. El cortafuegos sería el portero, que es el que vigila quien entra y quien no. Las clientes del local sería las posibles conexiones/paquetes que entran y salen de nuestro ordenador.

¿Que es IPTables? IPtables es un cortafuegos integrado en el Kernel Linux. Realmente lo que hace es crear, añadir y borrar reglas de filtrado de paquetes. Es un servicio como otro cualquiera que podemos parar e iniciar a nuestro antojo, es un simple archivo de texto en donde vamos añadiendo reglas para filtrar las conexiones y se ejecuta cada vez que iniciamos nuestro ordenador.

Cuando enviamos/recibimos un paquete o un servicio pasa por 3 tipos de tablas:

NAT. La tabla NAT se consulta cada vez que un paquete inicia una nueva conexión.

MANGLE. Es una tabla un tanto especial, se utiliza para realizar configuraciones complejas del cortafuegos. Aqui no voy a entrar, esto suena muy difícil para mi, la siguiente tabla es la que me interesa.

FILTER. Es la tabla principal de iptables, y se utiliza para especificar filtros de paquetes. Contiene 3 cadenas predefinidas:

  • INPUT: Paquetes que entran a nuestro equipo.
  • FORWARD: Aquellos paquetes en los que el origen y el destino son equipos de redes diferentes.
  • OUTPUT: Paquetes generados localmente, es decir, paquetes que salen de nuestro equipo.

Nosotros vamos a trabajar con la tabla FILTER, generando reglas para controlar un poco las conexiones que entran y salen de nuestra máquina.

Vamos a abrir la terminal/consola y ejecutamos lo siguiente:

sudo iptables -P INPUT DROP

Con esta simple línea estamos diciéndole al cortafuegos que la política por defecto (-P), en las conexiones que entren desde fuera a nuestro ordenador (INPUT), no dejamos pasar nada (DROP). Con esta instrucción absolutamente nadie podría entrar en nuestro ordenador.

Si ahora hacemos un intento de conectarnos a Internet, resulta que no podemos, se queda esperando…esperando….esperando, y así nos podemos quedar todo el día.

¿Que está ocurriendo?. Cuando iniciamos nuestro navegador, en realidad si conecta a Internet, el problema reside cuando intenta descargar html, animaciones, jpg, gif… para facilitar la carga de la página y, según la política que hemos puesto anteriormente, los paquetes entrantes no los dejamos pasar y evidentemente no podemos navegar.

¿Como soluciono esto?. Añadiendo las reglas siguientes:

sudo iptables -A INPUT -i lo -j ACCEPTsudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT”.

La primera línea acepta todas las conexiones locales. (-i lo). El “lo” significa localhost.

La segunda línea aceptamos todas las conexiones ya establecidas localmente desde nuestro ordenador (ESTABLISHED) y si esa conexión generan nuevas conexiones que estén relacionadas (RELATED) también las aceptará (-j ACCEPT).

-m conntrack --cstate

Estos últimos parámetros sirven para indicar el estado de la conexión. ¡¡Vaya, algo nuevo!!!. ¿Ahora resulta que cada conexión pueden tener varios estados? Vamos a verlos:

  • NEW. Cuando un paquete crea un nueva conexión.
  • ESTABLISHED. Cuando un paquete está asociado a una conexión ya existente.
  • RELATED. Cuando un paquete establece una nueva conexión que está relacionada con otra ya existente.
  • INVALID. Cuando un paquete no puede ser asociado a una conexión conocida. Normalmente este tipo de paquetes no se dejan pasar.

En la situación que he definido anteriormente, las políticas por defecto de iptables para INPUT, OUTPUT y FORWARD, si no se toca nada, es siempre ACCEPT, es decir, que por defecto se deja pasar las conexiones que entran (INPUT), las que salen (OUTPUT) y los conexiones que se reenvían (FORWARD).

Las políticas por defecto de un cortafuegos son básicamente 2:

  • Se acepta todo por defecto y se van cerrando las conexiones que no utilicemos.
  • Se bloquea todo por defecto y se van abriendo las conexiones que iremos necesitando.

La primera opción es mas fácil de configurar. La segunda opción es más segura pero un poco más complicada, ya que tenemos que tener muy claro que conexiones son los que tenemos que dar paso.

Comandos de IPTABLES.

-A #Agrega una regla al firewall.
-D #Borra una regla en el firewall.
-F #Limpia todas las reglas del firewall.
-L #Lista todas las cadena de iptables aplicadas en el firewall.
-P #Configura la política por defecto del cortafuego.
-X #Borra reglas especificada por el usuario, no borra reglas no creada por el usuario.
-Z #Pone en ceros los contadores de bytes y de paquetes.

Parámetros de IPTABLES.

-t <tabla> #Especifica la tabla con la que trabajamos.
-i <interfaces> #Interfaz de entrada.
-j <acción> #Acción a realizar
-o <interfaces> #Interfaz de salida.
-p <protocolo> #Protocolo de conexión (tcp, udp, icmp).
-s <origen> #Sirve para especificar de donde viene la conexión, como un ip.
--dport <puerto> #Puerto de destino.
--sport <puerto> #Puerto de origen.

Veamos algunos ejemplos:

sudo iptables -P OUTPUT DROP #Por defecto la política de las conexiones que salen, se rechaza.sudo iptables -A INPUT -i lo -j ACCEPT #Aceptamos todas las conexiones que vengan por el interfaz local.sudo iptables -A INPUT -i lo -p tcp --dport 80 -j ACCEPT #Aceptamos todas las conexiones de entrada por el interfaz local y el puerto 80.sudo iptables -A INPUT -p icmp -j DROP #Rechazamos cualquier conexión de entrada que venga por el protocolo icmp.sudo iptables -A INPUT -i local -p tcp --dport 1:1024 -j DROP #Rechazamos todas las conexiones de entrada por el interfaz local de los puertos comprendidos entre el 1 y el 1024.

Vamos a intentar crear un cortafuegos decente para defender nuestra propia máquina Linux.

Ahora mismo tengo una conexión ADSL conectada por cable. Habilito un puerto TCP y otro UDP para las conexiones con P2P (amule y torrent). Utilizo SAMBA para compartir impresora y una carpeta pública con mi novia, que se conecta de forma inalámbrica. La seguridad de ella es cosa suya, yo lo único que quiero es proteger mi máquina y darle permiso para que pueda utilizar mi impresora y esa carpeta pública. Vamos a empezar añadiendo reglas:

#Borramos todas las reglas que puedan haber.

iptables -F
iptables -X
iptables -Z

#Políticas por defecto “duras”, lo rechazamos todo, la entrada, la salida y el reenvío.

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Le permitimos todas las conexiones locales a los dispositivos de red que pudiera haber en nuestro equipo.

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Nota. El “lo” significa cualquier interfaz de red conectado a nuestro equipo, es decir, cualquier dispositivo local como una tarjeta ethernet o inalámbrica.

#Ahora vamos a darle permiso a nuestro propio equipo para salir y entrar a su antojo.

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTiptables -A OUTPUT -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPTiptables -A INPUT -m conntrack --ctstate INVALID -j DROP

¿Pero que significa esto que pongo aquí?. Pues muy fácil, me explico:

  • La primera línea significa que sólo voy a dejar entrar aquellos paquetes de conexiones que ya estén establecidas y si generan otros paquetes que estén relacionados con esa conexión, pues también los dejo pasar.
  • La segunda línea significa que sólo voy dejar salir aquellas conexiones nuevas que yo genero desde mi equipo, las que ya están establecidas y si éstas generan otros paquetes relacionados también los dejo salir.
  • La tercera línea estamos bloqueando todos aquellos paquetes que no sabemos el origen de su conexión.

Si ahora hacemos un intento de conectarnos a internet pasa lo siguiente: Va crear una conexión hacia fuera que nosotros creamos (OUTPUT, NEW). Al conectar (ESTABLISHED), se crea otra conexión para descargar elementos como html, jpg, gif para mostrarla en nuestro equipo (INPUT,RELATED).

Pasaría lo mismo si usamos por ejemplo, un gestor de correo, siempre que la conexión esté generada en nuestro equipo.

Ahora procedemos a abrir los puertos para la mula y el torrent ya que no voy a ponerles a la vez nunca. Si pasara tal cosa deberíamos usar un puerto distinto para los dos programas. En mi equipo uso los mismo puertos para todos los programas de intercambio (P2P); tcp 3025 y 3035 udp. Vamos a proceder abrirlos con iptables:

#P2P.
iptables -A INPUT -p tcp --dport 3025 -j ACCEPT
iptables -A INPUT -p udp --dport 3035 -j ACCEPT

Ahora voy a continuar por samba.

Samba utiliza los puertos 137,138,139 y 445 para que Windows pueda acceder a archivos e impresoras de un equipo Linux. Vamos a configurarlo:

#Samba.
iptables -A INPUT -p udp --dport 137:139 -j ACCEPT
iptables -A INPUT -p tcp --dport 137:139 -j ACCEPT
iptables -A INPUT -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -p udp --dport 445 -j ACCEPT

Podemos reducir un poco el “cerco” de personas que queremos que usen nuestros recursos compartidos. Mi configuración es muy sencilla; mi equipo esta conectado por cable con ip fija 192.168.1.33, mi novia usa conexión wifi con la ip fija 192.168.1.34 y por último se conectan 4 móviles por wifi mediante dhcp. Lo único que quiero es limitar mis recursos a una sola persona, mi novia. Veamos como lo haremos:

#Samba.
iptables -A INPUT -s 192.168.1.34 -p udp --dport 137:139 -j ACCEPT
iptables -A INPUT -s 192.168.1.34 -p tcp --dport 137:139 -j ACCEPT
iptables -A INPUT -s 192.168.1.34 -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -s 192.168.1.34 -p udp --dport 445 -j ACCEPT

Ahora estamos usando dos conceptos nuevos:

  • -s. Aquí se especifica la ip de origen, es decir, de donde provienen los paquetes de la conexión.
  • -d. Aquí se deberá especificar la ip de destino, es decir, a donde va dirigida los paquetes de conexión.

Si usamos iptables sin intermediarios, es decir, sin entornos gráficos que facilitan su configuración, nos daremos cuenta que cuando volvemos a reiniciar hemos perdidos todas esas reglas que hemos definido en este pequeño tutorial.

¿Como hago para no perder las reglas?.

  • Lo primero y más primordial es guardar las reglas en un archivo de texto: “iptables-save > /etc/sysconfig/iptables”.
  • Ahora ejecutamos y e incluiremos iptables para el arranca automático: “systemctl start iptables.service && systemctl enable iptables.service”. Reiniciamos y ya tenemos listo nuestro las reglas y ejecutadas cada que vez que iniciemos nuestra máquina.

Hay que tener en cuenta donde guarda iptables la configuración, en el ejemplo anterior estoy trabajando en fedora y se guarda en “/etc/sysconfig”. En otras distribuciones:

  • Archlinux lo almacena en “/etc/iptables/iptables.rules”.
  • Gentoo y derivados lo guarda en “/var/lib/iptables/rules-save”.
  • Si estamos usando otras distribuciones, es curiosear poco por internet y no tendremos mayores problemas.

Continúa por El antivirus.

--

--

Ismael Royano Gómez
Enredando con Linux.

Técnico Informático curioso, lector activo de las nuevas tecnologías, amante de las series de televisión y usuario del respetable mundo del enredo.