Introducción
iptables es una potente herramienta que todo administrador de sistemas debería conocer y utilizar. Pero como desarrollador web, a veces es difícil sacar provecho a todas las funcionalidades que este enorme cortafuegos ofrece.
A continuación veremos un ejemplo de configuración de iptables restrictivo y útil, en el que cerraremos todos los puertos e iremos abriendo los necesarios según las necesidades personales de cada uno.
Lo primero es especificar qué tipo de reglas vamos a añadir. Esto se hace marcando el inicio y el fin:
Reglas básicas
Utilizaremos una política restrictiva donde cerraremos todos los puertos por defecto:
Si una conexión ya obtuvo permiso para interactuar con nuestra máquina, dejamos que los siga teniendo:
También permitimos las conexiones loopback de nuestra máquina:
Y por último configuramos el sistema de registros:
Reglas comunes
Las reglas vienen a ser bastante sencillas: especificamos el protocolo, el puerto e incluímos INPUT
si queremos conexiones entrantes y/o OUTPUT
si queremos conexiones salientes.
Por ejemplo, si nuestro servidor corre un servicio HTTP (Apache, Nginx, etc), generalmente nos interesa que se pueda acceder desde el exterior a los puertos 80 (HTTP) y 443 (HTTPS):
Y a su vez, si queremos navegar desde nuestro servidor hacia el exterior (p. ej. con lynx u otro navegador), necesitaremos crear la misma regla pero esta vez cambiando INPUT
por OUTPUT
:
Sencillo, ¿verdad? A continuación una lista de reglas comunes que nos podría interesar añadir.
SSH
Para poder conectar por SSH y a su vez que nuestro servidor pueda conectar por SSH a otros servidores, necesitaremos crear las reglas INPUT
y OUTPUT
para el puerto 22:
DNS
Si queremos que nuestro servidor pueda consultar nombres de dominio a otros servidores DNS, necesitaremos abrir el puerto 53:
Y si nuestro servidor corre un servicio DNS (p. ej. BIND), utilizaremos INPUT
:
FTP
En el caso del protocolo FTP, normalmente nuestro servidor correrá el servicio FTP en el puerto 21. Pocas veces necesitaremos conectar desde nuestro servidor al exterior por FTP, así que solo INPUT
:
Rsync
Es muy común utilizar rsync para realizar backups. Además algunos gestores de paquetes en Linux también utilizan rsync para descargar paquetes. Para estos casos nos sirve la regla OUTPUT
para el puerto 873:
Git
El puerto por defecto para Git es 9418. Como no corremos un servidor Git en nuestra máquina y solo necesitamos descargar software a través de GitHub, utilizaremos lo siguiente:
Ping
Si queremos que nuestro servidor pueda enviar y recibir pings, estas son las reglas:
Resumen
Si quieres copiar y pegar todo el fichero de reglas, recuerda que lo tienes disponible en articles/introduction-to-iptables/rules.
En el repositorio del blog en GitHub encontrarás todo el contenido asociado con este y otros artículos.
Para limitar más aún la apertura del puerto y acceder desde una IP específica (por ejemplo, para conectar únicamente desde nuestro ordenador de sobremesa), solo hay que añadir el parámetro -s 12.34.56.78
a la regla en cuestión.
Para cargar las reglas en iptables basta con guardar estas reglas en un fichero y después ejecutar iptables-restore < fichero
.
Una vez hayamos cargado las reglas en iptables, si queremos reemplazar las reglas por otras nuevas o si queremos eliminar las actuales, debemos ejecutar una serie de comandos:
Esto eliminará las reglas existentes y permitirá acceso de nuevo a todo.
Si solo hacemos flush (iptables -F
), eliminaremos las reglas pero nos quedaremos sin conexión, por lo que no es buena idea.
Puedes apoyarme para que pueda dedicar aún más tiempo a escribir artículos y tener recursos para crear nuevos proyectos. ¡Gracias!