LinuxParty
Hace relativamente poco, os comentábamos por encima algunas de las características de configuración de IPtables, una de las mejores medidas de seguridad que se han desarrollado, totalmente configurable a nuestra medida con un par de líneas de comandos.
Hoy hablaremos de los cortafuegos, unos mecanismos bastante extendidos para proteger un equipo o una red de estos. También conocidos como 'firewalls', los podemos encontrar como dispositivos externos al PC (conectados entre la máquina e internet y destinados a proteger el equipo y la red local), o bien como un software implementado sobre un sistema operativo. Los primeros son denominados 'Hardware Firewall' (cortafuegos por hardware) -que pueden funcionar como proxies- y los segundos, más comunes entre los usuarios 'de a pie' se conocen como 'software firewall' (cortafuegos por software).
* Linux: Instalar un proxy transparente con Squid
Hay varias formas de hacer funcionar un proxy, si estás interesado mira en ésta búsqueda.
La cantidad de marcas que fabrican estos dispositivos (Hardware Firewall) sería incontable y casi tendríamos que dedicar un post sólo para enumerarlas; pero para nombrar alguna de las más conocidas tenemos a Cisco o Linksys. Además de las funciones propias de un cortafuegos, estos dispositivos suelen implementar otras características, como pueden ser soportar VPN, QoS, proxis, etc...
Como recordábamos antes, en el tema de los cortafuegos por software, destaca un nombre, IPtables, el cortafuegos que por defecto viene integrado con la mayoría de las distribuciones Linux, y es en el que nos centraremos hoy, no sin mencionar antes los distintos tipos de software firewall que podemos encontrar.
- Cortafuegos de Estado: Este firewall comprobará el estado del paquete en la transmisión diferenciando entre una nueva conexión y otra ya existente.
- Cortafuegos de capa de aplicación: Tiene en cuenta el contenido del paquete a nivel de aplicación, pudiendo hacer así un filtrado más específico.
- Cortafuegos de filtrado de paquetes: Con este tipo analizamos y filtramos los paquetes transmitidos o recibidos, según alguno parámetros designados previamente como por ejemplo direcciones IP, puertos a usar, origen, destino...
Apuntar que un firewall puede contener todas estas capas unas sobre otras, es decir, no son excluyentes unos de otros, pero como con todo, abusar nunca es bueno, y el interponer más capas de las necesarias, lo que hará será ralentizar nuestra red.
Hoy configuraremos un software firewall de filtrado de paquetes con IPtables. Como pudimos ver en el post anterior de IPtables, existen cuatro tablas a aplicar dentro de IPtables: filter, mangle, nat y raw; que a su vez contienen tres cadenas: INPUT, OUTPUT y FORWARD. Vamos a utilizar la tabla 'filter', y lo podremos hacer de dos formas. Una sería aceptar todos los paquetes entrantes al equipo e ir restringiendo uno a uno los paquetes que nos interesen; esta sería la política conocida como ACCEPT. La otra forma de filtrar paquetes sería el opuesto, denegar el acceso a todos los paquetes y se van permitiendo los paquetes que queramos; esta segunda política de filtrado se conoce como DROP.
Para especificar qué tipos de paquetes acceden o salen de nuestro equipo, tenemos que describirlos de una forma determinada para que IPtables nos comprenda. Para esto necesitamos órdenes y parámetros con los que formular la regla debidamente.
Ordenes:
IPtables –F: flush (borrado, vaciado) de todas las reglas IPtables –L: listado de reglas que se están aplicando IPtables –A: añadir regla IPtables –D: borrar una regla
Etc...
Estos son varios de los parámetros que usaremos para configurar las reglas de IPtables.
-p [protocolo]: Protocolo al que pertenece el paquete. -s [origen]: dirección de origen del paquete, puede ser un nombre de host, una dirección IP normal, o una dirección de red (con máscara, de forma dirección/máscara). -d [destino]: Al igual que el anterior, puede ser un nombre de host, dirección de red o dirección IP singular. -i [interfaz-entrada]: Especificación del interfaz por el que se recibe el paquete. -o [interfaz-salida]: Interfaz por el que se va a enviar el paquete. [!] -f: Especifica que la regla se refiere al segundo y siguientes fragmentos de un paquete fragmentado. Si se antepone !, se refiere sólo al primer paquete, o a los paquetes no fragmentados. -j [target]: Nos permite elegir el target al que se debe enviar ese paquete, esto es, la acción a llevar a cabo con él.
Ahora vamos con un ejemplo de una regla que acepta conexiones al puerto 80 del sistema.
iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p TCP --dport www -j ACCEPT
Y aquí la descripción de cada componente del anterior comando:
iptables: comando para IPtables (no hay que olvidar que las reglas son un Shell script) -A: append, opción para añadir la regla INPUT: estado del paquete (al entrar es INPUT) -i eth0: interfaz de red eth0 -s 0.0.0.0/0: dirección de acceso (cualquiera en este caso) -p TCP: tipo de puerto --dport: puerto de destino -j ACCEPT: destino del paquete (se acepta aunque aquí podría ser DROP, LOG, REJECT,..)
Pues ya tenemos y conocemos todo lo básico para crear un firewall por software en Linux a nuestra medida.
Así que ahora pongámonos manos a la obra y lo primero será cortar todas las comunicaciones con esta línea:
sudo iptables -P INPUT DROP
Así lo que decimos a IPtables es que no permita el paso de ningún paquete de datos, y esto incluye incluso los salientes, por lo que si hacemos la comprobación, comprobaremos que no tenemos conexión a internet. Esto lo podemos arreglar fácilmente si usamos la siguiente línea.
sudo iptables -A INPUT -i lo -j ACCEPT
Muy bien, ahora ya podemos navegar, pero indaguemos en algunas webs y comprobemos que la carga de contenido está restringida, es decir, sí podemos navegar, pero no vemos imágenes, contenido flash y cualquier otro componente de una web de hoy día. Esto se debe a que con la línea anterior hemos permitido el acceso de nuestro equipo (con 'lo' que IPtables traduce como localhost, es decir, nuestro ordenador) a internet, pero no al contrario. Fijemos entonces una norma que nos permita una navegación adecuada y segura a la par con la siguiente línea de comandos:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Así decimos a IPtables que permita la entrada de datos al equipo, pero únicamente aquellos paquetes que estén relacionados directamente con las solicitudes que nuestro equipo ha emitido.
Aquí te ponemos un ejemplo de un firewall básico para tu servidor:
#####################################################3 *raw -F # Limpia la tabla de la cadena raw. :PREROUTING ACCEPT [135997:7911273] # Establece la política predeterminada para la cadena PREROUTING y muestra estadísticas. :OUTPUT ACCEPT [122127:9327786] # Establece la política predeterminada para la cadena OUTPUT y muestra estadísticas. COMMIT # Guarda los cambios realizados en la tabla. *mangle :PREROUTING ACCEPT [831306:104823274] # Establece la política predeterminada para la cadena PREROUTING y muestra estadísticas. :INPUT ACCEPT [831306:104823274] # Establece la política predeterminada para la cadena INPUT y muestra estadísticas. :FORWARD ACCEPT [0:0] # Establece la política predeterminada para la cadena FORWARD y muestra estadísticas. :OUTPUT ACCEPT [944899:686915098] # Establece la política predeterminada para la cadena OUTPUT y muestra estadísticas. :POSTROUTING ACCEPT [944899:686915098] # Establece la política predeterminada para la cadena POSTROUTING y muestra estadísticas. COMMIT # Guarda los cambios realizados en la tabla. *filter :INPUT ACCEPT [0:0] # Establece la política predeterminada para la cadena INPUT y muestra estadísticas. :FORWARD ACCEPT [0:0] # Establece la política predeterminada para la cadena FORWARD y muestra estadísticas. :OUTPUT ACCEPT [944840:686905593] # Establece la política predeterminada para la cadena OUTPUT y muestra estadísticas. :fail2ban-SSH - [0:0] # Crea la cadena fail2ban-SSH. ####################REGLAS ESTABLECIMIENTO DE CONEXION############# -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Permite todo el tráfico establecido y relacionado en la cadena INPUT. -A INPUT -m conntrack --ctstate INVALID -j DROP # Descarta todo el tráfico no válido en la cadena INPUT. -A FORWARD -d 0.0.0.0/0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Permite todo el tráfico establecido y relacionado en la cadena FORWARD. -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # Permite todo el tráfico establecido y relacionado en la cadena FORWARD. -A FORWARD -m conntrack --ctstate INVALID -j DROP # Descarta todo el tráfico no válido en la cadena FORWARD. #####################PAQUETES-MAL-FORMADOS########################## -A INPUT -p tcp --tcp-flags ALL NONE -m limit --limit 1/m --limit-burst 6 -j DROP # Descarta todo el tráfico TCP que tenga todas las banderas configuradas en "ninguna". -A INPUT -p tcp --tcp-flags ALL NONE -m recent --name blacklist_60 --set -m comment --comment "Drop/Blacklist ip Scan Ports" -j DROP # Descarta todo el tráfico TCP que tenga todas las banderas configuradas en "ninguna"
# y lo agrega a la lista negra. ##################PREVENCION SYN-FLOOD############################## -N syn-flood # Crea la cadena syn-flood. -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood # Descarta paquetes TCP que tengan la bandera SYN, ACK, -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j syn-flood # Esta regla filtra y bloquea paquetes TCP que tienen flags SYN, ACK, FIN y RST establecidos
# como RST, para prevenir ataques de inundación SYN. -A syn-flood -m limit --limit 1/m --limit-burst 6 -j DROP -A syn-flood -j DROP # Estas reglas limitan la velocidad de tráfico SYN entrante y descartan los paquetes
# que exceden el límite establecido, para mitigar los efectos de un ataque de inundación SYN. -N PKT_FAKE -A PKT_FAKE -m state --state INVALID -j DROP -A PKT_FAKE -p tcp --dport 80 --tcp-flags ALL ACK,RST,SYN,FIN -j LOG --log-prefix "Firewall PKT_FAKE" -A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "Firewall PKT_FAKE" -A PKT_FAKE -p tcp --dport 80 --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "Firewall PKT_FAKE" -A PKT_FAKE -p tcp --dport 80 ! --syn -m state --state NEW -j LOG --log-prefix "Firewall PKT_FAKE" -A PKT_FAKE -f -j LOG --log-prefix "Firewall PKT_FAKE" -A PKT_FAKE -j RETURN # Estas reglas establecen una cadena personalizada para filtrar paquetes falsificados o sospechosos.
# La primera regla descarta los paquetes con estado "INVALID" y las siguientes cuatro reglas registran
# en el log los paquetes que tienen ciertas combinaciones de flags y puertos TCP. La última regla
# devuelve los paquetes no registrados para ser procesados por otras cadenas del firewall. ################PREVENCION UDP FLOOD############################### -A OUTPUT -p udp -m state --state NEW -j ACCEPT -A OUTPUT -p udp -m limit --limit 10/s -j ACCEPT -A INPUT -p UDP -f -j DROP -A OUTPUT -p udp -j DROP ################PREVENCION ICMP FLOOD############################## -A INPUT -p icmp -m state --state NEW --icmp-type echo-request -m limit --limit 1/s --limit-burst 1 -j ACCEPT -A INPUT -p icmp --icmp-type echo-request -m length --length 60:65535 -j ACCEPT ################################################################### -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT ###### REGLAS AÑADIDAS ############################################ -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 43 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 43 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT # -A INPUT -p udp -m state --state NEW -m udp --dport 69 -j ACCEPT # -A INPUT -p tcp -m state --state NEW -m tcp --dport 16509 -j ACCEPT # -A INPUT -p tcp -m state --state NEW -m tcp --dport 16514 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 8443 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 8443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 8447 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 8447 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 110 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 143 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 1110 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 1110 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 2221 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 2221 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 25 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT # El puerto 5524 servidor de licencias Parallels Plesk -A INPUT -p tcp -m state --state NEW -m tcp --dport 5524 -j ACCEPT -A INPUT -p udp -m state --state NEW -m udp --dport 5524 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A INPUT -p tcp -m state --state NEW -m tcp --dport 10000:65535 -j DROP -A FORWARD -j REJECT --reject-with icmp-host-prohibited -A fail2ban-SSH -j RETURN COMMIT
Pues ya tenemos configurado nuestro cortafuegos por software con IPtables, sólo comentar una última cosa, y es que estas reglas desaparecen al apagar la máquina, por lo que al iniciarlas tendremos que volver a introducirlas o cargar las reglas con el cron:
*/15 * * * * /sbin/iptables-restore < fw.firewall-iptables.reglas
Ahora te enseñaremos algúnos artículos:
20 ejemplos iptables para administradores de sistemas Linux
Más artículos aquí:
-
Seguridad
- Conexión Segura NFS en Linux, Tunelizar NFS sobre SSH y Configuración de NFS sobre SSH para Mayor Seguridad
- Utilizar ssh sin contraseña con ssh-keygen y ssh-copy-id
- Millones de teléfonos móviles podrían ser vulnerables a la vigilancia del gobierno chino
- Cómo limitar las conexiones SSH a la red local en Linux
- Los televisores inteligentes son como un «caballo de Troya digital» en los hogares
- Snort para Windows, detección de Intrusos y seguridad.
- Detección de Intrusiones con las herramientas: BASE y Snort.
- El Sistema de Detección de Intrusos: Snort. ( Windows y Linux )
- Configuración con Ejemplos de Snort para Windows, detección de intrusiones
- ¿El gobierno de EE. UU. ignoró la oportunidad de hacer que TikTok fuera más seguro?
- ¿Qué es SSH y cómo se utiliza? Los conceptos básicos de Secure Shell que necesitas saber
- Asegurar memcached del servidor, para evitar amplificar ataques DDoS
- Consejos de Seguridad para Pagos Móviles en España: Protege tus Transacciones con Estos Consejos Prácticos
- 22 herramientas de seguridad de servidores Linux de código abierto en 2023
- 8 hábitos que deben tomar los teletrabajadores altamente seguros