Ir al contenido

Iptables: ejemplo para proteger un servidor web. Como Firewall

Uno de los Ataques al que será objeto un servidor web son aquellos como los de direcciones IP Enmascaradas o inválidas que intentan engañar al servidor para que entienda que los paquetes que recibe llegan desde la red interna o de una red confiable. Otro de los eventos al que es expuesto es al escaneo de puertos de comunicación que tiene como objetivo ver que puertos de comunicación tiene abierto el equipo y así determinar los servicios que está corriendo y utilizar esa información como base a un posible ataque.

El script de abajo, lo he estado provando mis servidores web y las reglas han mostrado ser efectivas. El script consiste en reglas de iptables para detener los paquetes inválidos y que llegan desde direcciones enmascaradas, intenta además detener el escaneo de puertos bloqueando por un tiempo determinado la dirección ip desde donde se origina. Otra de las mejores prácticas que se siguen aquí es la de descartar las conexiones a todos los puertos de comunicación y solo crear reglas con los puertos que realmente vamos a necesitar.

En este script permito las conexiones a los puertos HTTP (80), SSH (22), HTTPS (443), SMTP (25) y descarto cualquier otro. Se puede modificar según las necesidades. Por Ejemplo, el script permite solo los puertos 80 ya que es un servidor web sin certificado Digital y el 22 para las tareas de administración.

El Script para Firewall

# firewall.sh
#Limpiar Reglas Existentes
iptables -F

# INPUT
# Aceptar loopback input
iptables -A INPUT -i lo -p all -j ACCEPT

#Permitir Handshake de tres vias<
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#Detener Ataques Enmascarados<
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -m limit --limit 1/second -j ACCEPT

#Descartar Paquetes Inválidos
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

#Descartar paquetes RST Excesivos para Evitar Ataques Enmascarados
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#Cualquier IP que intente un Escaneo de Puertos sera Bloqueada por 24 Horas.
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

#Pasadas las 24 Horas, remover la IP Bloqueada por Escaneo de Puertos
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

#Esta Regla agrega el Escaner de Puertos a la Lista de PortScan y Registra el Evento.
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

#Permitir estos puertos desde Fuera
# smtp
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# http
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
# https
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
# ssh & sftp
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

#Descartar cualquier otra Entrada
iptables -A INPUT -j REJECT

#Permitir el Ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

#OUTPUT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#Permitir estos puertos desde Fuera
# smtp
iptables -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
# http
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
# https
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
# ssh & sftp
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT

#Permitir Pings
iptables -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

#Descartar cualquier otra Salida
iptables -A OUTPUT -j REJECT

#No Permitir Forward
iptables -A FORWARD -j REJECT
Compartir:

3 pensamientos en “Iptables: ejemplo para proteger un servidor web. Como Firewall”

  1. Hola, estoy leyendo tu publicación y estoy verificando tus reglas y me aparece la siguiente notificación
    iptables v1.8.4 (legacy): icmp: option “–icmp-type” must be specified

    Qué puede estar sucediendo ?
    agradezco tus comentarios

    1. Seguramente te estas refiriendo a la regla : #Permitir el Ping
      iptables -A INPUT -p icmp -m icmp –icmp-type 8 -j ACCEPT

      Esto es un poco viejo, antiguamente el pingo simple era una amenaza para los servidores.

      El problema es que al usar el módulo icmp, siempre debe especificar uno o más tipos de icmp usando –icmp-type. Esto se debe a que ICMP se usa para muchas cosas legales, como la “fragmentación necesaria”, que sería malo bloquear, ya que conduciría a destinos inalcanzables.

      Chequeada que el ufw esté instalado completamente, y que hayas copiado/tipiado correctamente el comando.

      Ufw genera reglas del IPTABLE clásico.

      Pues te paso las reglas de icmp que pueden exitir en /etc/ufw/before.rule

      icmp codes

      -A ufw-before-input -p icmp –icmp-type destination-unreachable -j ACCEPT
      -A ufw-before-input -p icmp –icmp-type source-quench -j ACCEPT
      -A ufw-before-input -p icmp –icmp-type time-exceeded -j ACCEPT
      -A ufw-before-input -p icmp –icmp-type parameter-problem -j ACCEPT
      -A ufw-before-input -p icmp –icmp-type echo-request -j ACCEPT

      Puedes aceptarlas (ACCEPT) o puedes denegarlas (DROP)

Deja un comentario

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