Administración del servidor

Ejemplos del Firewall de iptables de Linux

En la publicación anterior, hablamos sobre cómo proteger el servidor Linux utilizando Hardening Best Practices , algunas personas me preguntaron acerca de la sección de firewall que fue una breve introducción al firewall de iptables . Hoy discutiremos en detalle el firewall de iptables de Linux y cómo proteger el tráfico de tu servidor usando ese impresionante firewall.

 


 

Iptables en CentOS 7

Si estás utilizando CentOS 7, firewalld se introdujo para administrar iptables, por lo que, si desea volver a iptables, debes detener y enmascarar Firewalld.

Luego instala el servicio de iptables y habilítalo:

Entonces podrás iniciarlo:

$ systemctl start iptables

 

Cómo funciona el Firewall de Linux

Las funciones de firewall de Iptables se basan en el marco de Netfilter que está disponible en el kernel de Linux para el filtrado de paquetes.

Tipos de firewall

Hay dos tipos de firewalls:

Firewall sin estado: procesa cada paquete por separado, lo que significa que no ve otros paquetes de la misma conexión.

Firewall de estado: este tipo de firewall se preocupa por todos los paquetes que pasan por este, por lo que conoce el estado de la conexión. Da más control sobre el tráfico.

Netfilter contiene tablas. Estas tablas contienen cadenas y las cadenas contienen reglas individuales.

Si el paquete aprobado coincide con una regla, la acción de la regla se aplicará a ese paquete.

Las acciones pueden ser: aceptarrechazarignorar, o pasar el paquete a otras reglas para un mayor procesamiento.

Netfilter puede procesar el tráfico entrante o saliente utilizando la dirección IP y el número de puerto

Netfilter es administrado y configurado por el comando iptables.

Antes de comenzar a escribir comandos de firewall, debemos entender la estructura del firewall un poco para poder escribir reglas de firewall más fácilmente.

 

Tablas de firewall de iptables

Netfilter tiene tres tablas que pueden llevar reglas para el procesamiento.

La tabla filter Tablet de iptables es la tabla principal para procesar el tráfico.

La segunda es la tabla nat table, que maneja las reglas de NAT.

La tercera tabla es la mangle table, que se utiliza para cambiar los paquetes.

 



Cadenas de tablas

Cada tabla mencionada contiene cadenas, estas son el contenedor de las reglas de iptables.

La tabla filter table contiene las cadenas FORWARD, INPUT, OUTPUT OUTPUT .

Puedes crear una cadena personalizada para guardar tus reglas propias.

Si un paquete llega al host, será procesado por las reglas de la cadena INPUT.

Si el paquete va a otro host, eso significa que será procesado por las reglas de la cadena OUTPUT.

La cadena FORWARD de iptables se usa para manejar paquetes que han accedido al host, pero están destinados a otro host.

 

Políticas de cadena

Cada cadena en la filter table tiene una política. La política es la acción predeterminada a tomar.

La política podría ser DROP, REJECT y ACCEPT.

La política ACCEPT permite que los paquetes pasen el firewall. La política DROP elimina un paquete sin informar al cliente. La política de RECHAZAR también descarta el paquete e informa al remitente.

Desde una perspectiva de seguridad, debes descartar todos los paquetes que llegan al host y aceptar solo los paquetes que provienen de fuentes confiables.

 

Agregar reglas de iptables

Puedes agregar una nueva regla usando el comando iptables de esta manera:

$ iptables -A INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT

Vamos a dividir este comando en partes para que podamos entender todo su contenido.

La -A significa que estamos agregando una nueva regla. De manera predeterminada, todas las reglas nuevas se agregan a la filter table a menos que especifique otra tabla.

La bandera – i significa qué dispositivo se usará para que el tráfico ingrese al host. Si no se especifica ningún dispositivo, la regla se aplicará a todo el tráfico entrante, independientemente de los dispositivos.

El -p especifica el protocolo del paquete que desea procesar, que es TCP en nuestro caso.

El indicador -dport especifica el puerto de destino, que es 80.

El -d especifica la dirección IP de destino que es 1.2.3.4. Si no se especifica ninguna dirección IP de destino, la regla se aplicaría a todo el tráfico entrante en eth1 independientemente de la dirección IP.

El -j especifica la acción o la acción JUMP a realizar, aquí aceptamos los paquetes usando la política de accept.

La regla anterior permite el tráfico HTTP entrante que está en el puerto 80.

¿Qué hay de permitir el tráfico saliente?

La bandera -A se usa para agregar reglas a la cadena de OUTPUT.

El -o se usa para indicar el dispositivo utilizado para el tráfico saliente.

El -sport especifica el puerto de origen.

Puedes usar el nombre del servicio como http o https en lugar del número de puerto numérico en sport o dport . Los nombres de los servicios se pueden encontrar en el archivo  /etc/services.

Se recomienda utilizar el nombre del servicio en lugar de un número de puerto, lo que facilita las reglas de lectura.

 

Orden de las reglas de Iptables

Cuando agregas una regla, se agrega al final de la cadena.

Puedes agregarla en la parte superior mediante la opción -I.

La secuencia de las reglas importa como verás a continuación.

Puedes insertar tus reglas exactamente donde quieras utilizando la bandera I.

Mira las siguientes reglas para entender la importancia del orden de estas:

La primera regla acepta que todo el tráfico UDP llega a eth1, y el número 3 es el orden de la regla.

La segunda regla elimina el tráfico que ingresa al puerto 80.

La primera regla aceptará todo el tráfico, luego la segunda regla será ignorada porque la primera regla ya acepta todo el tráfico, por lo que la segunda regla aquí no tiene sentido.

Tus reglas deben tener sentido ya que el orden en la cadena es importante.

 


Listar reglas de iptables

Puedes enumerar las reglas en una cadena usando la bandera -L:

$ iptables -L INPUT

Además, puedes mostrar los números de línea para las reglas usando –line-numbers:

$ iptables -L INPUT --line-numbers

TLa lista muestra los nombres de los servicios, puede mostrar los números de los puertos en lugar de los servicios usando la opción -n:

$ iptables -L INPUT -n --line-numbers

Esto hará que el listado se realice más rápido porque evita los iptables de la resolución de DNS y las búsquedas de servicios.

Puedes listar todas las reglas para todas las cadenas de la siguiente forma:

$ iptables -L -n --line-numbers

Para obtener la cantidad de paquetes procesados ​​por cada regla, puedes utilizar el indicador -v:

$ iptables -L -v

Además, puede restablecer los contadores a cero usando el indicador -Z.

Ahora podemos agregar una nueva regla a cualquier cadena que deseemos, podemos insertar la regla en un orden específico y podemos listar las reglas para cualquier cadena o todas las cadenas, pero ¿Cómo hacemos para eliminar las reglas?

 

Eliminar reglas

Puedes eliminar una regla usando la bandera -D:

$ iptables -D INPUT -i eth1 -p tcp --dport 80 -d 1.2.3.4 -j ACCEPT

Este comando eliminará la regla HTTP que especificaste anteriormente.

Antes de eliminar una regla, solo asegúrate de la especificación de la regla y luego elimínala.

Puede eliminar la regla utilizando el número de orden en lugar de escribir las especificaciones de la regla.

$ iptables -D INPUT 2

También, puedes eliminar todas las reglas en una cadena específica utilizando el indicador -F, lo que significa eliminar todas las reglas.

$ iptables -F INPUT

Si olvidas mencionar el nombre de la cadena al utilizar la bandera -F, todas las reglas de la cadena serán eliminadas.

 

Reemplazando Reglas

Puedes reemplazar las reglas existentes con tus propias reglas utilizando usando el indicador -R:

$ iptables -R INPUT 1 -i eth1 -p tcp --dport httpht -d 1.2.3.4 -j ACCEPT

Este comando reemplazará la primera regla en la cadena INPUT con la regla escrita.

 


Listar una tabla especifica

Para listar una tabla específica, utiliza la bandera -t con el nombre de la tabla:

$ iptables -L -t nat

Aquí listamos las reglas de la tabla nat.

 

Cadena del firewall de Iptables

Para crear una cadena definida por el usuario, utiliza el indicador -N.

$ iptables -N MY_CHAIN

Además, puedes cambiarle el nombre utilizando el indicador -E.

$ iptables -E MY_CHAIN NEW_NAME

Puedes eliminar una cadena definida por el usuario utilizando el indicador -X.

$ iptables -X MY_CHAIN

Si no menciona el nombre de la cadena cuando utilizas el indicador -X, eliminarás todas las cadenas definidas por el usuario. No puedes eliminar cadenas como INPUT y OUTPUT.

 

Redirección a una cadena definida por el usuario

Puedes redirigir paquetes a una cadena definida por el usuario como cadenas integradas usando la opción -j.

$ iptables -A INPUT -p icmp -j MY_CHAIN

Por lo tanto, todo el tráfico ICMP entrante se redireccionará a la cadena recién creada llamada MY_CHAIN.

 

Establecer la política predeterminada para las cadenas

Puedes usar la -P para establecer la política predeterminada para una cadena específica. La política predeterminada puede ser ACCEPT, REJECT y DROP.

$ iptables -P INPUT DROP

Entonces ahora la cadena de entrada dejará caer cualquier paquete a menos que escribas una regla para permitir el tráfico entrante.

 


SYN Flooding

El atacante envía paquetes SYN solo sin completar el protocolo de enlace TCP y, como resultado, el servidor receptor tendría muchas conexiones abiertas ocupando demasiado tu servidor para responder a otros clientes.

Podemos usar el módulo de límite del firewall de iptables para protegernos del SYN flooding.

$ iptables -A INPUT -i eth1 -p tcp --syn -m limit --limit 10/second -j ACCEPT

Aquí especificamos 10 paquetes SYN por segundo solamente. Puedes ajustar este valor de acuerdo a las necesidades de tu red.

Si esto acelerará su red, puede usar cookies SYN.

Cookies SYN

En el archivo  /etc/sysctl.conf  agrega esta línea:

net.ipv4.tcp_syncookies = 1

Luego guarda y recarga.

$ sysctl -p

 

Descartar Paquetes de estado INVALID

Los paquetes de estado INVALID son paquetes que no pertenecen a ninguna conexión y deben descartarse.

$ iptables -A INPUT -m state --state INVALID -j DROP

Esta regla soltará todos los paquetes de estado inválidos entrantes.

 

Soltar paquetes fragmentados

Los paquetes fragmentados son pedazos rotos de grandes paquetes malformados y deberían ser eliminados

La bandera -f le dice al firewall de iptables que seleccione todos los fragmentos. Entonces, si no estás utilizando iptables como enrutador, puede eliminar paquetes fragmentados.

$ iptables -A INPUT -f -j DROP

 

Guardar reglas de iptables

Todas las reglas que discutimos se perderán si reinicia su servidor, entonces, ¿cómo persistir?

Puedes guardar todas tus reglas usando el comando iptables- save si estás usando CentOS o Red Hat.

iptables-save > /etc/sysconfig/iptables

En CentOS 7, puede guardar reglas de esta forma:

$ service iptables save

Puede guardar una tabla específica como la tabla de filtro solamente:

$ iptables-save -t filter

Además, puede usar iptables -restore para restaurar las reglas que se guardaron.

En las distribuciones basadas en Debían, puede usar el paquete iptables- persistent para guardar y restaurar reglas.

Primero, instálalo:

$ apt-get install iptables-persistent

Luego puedes guardar y restaurar reglas:

$ netfilter-persistent save

$ netfilter-persistent reload

Espero que encuentre el firewall de iptables fácil. Vuelve pronto.

Gracias.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *