Crea tu propio firewall con iptables mediante este sencillo script

Estuve un tiempo pensando en dos cosas respecto a esto de iptables: la mayoría de los que buscan estos tutoriales son principiantes y segundo muchos buscan ya algo medianamente sencillo y ya elaborado.

Este ejemplo es para un servidor web, pero puedes fácilmente agregar mas reglas y adaptarlo a tus necesidades.

Cuando vean “x” cambien por sus ip’s


#!/bin/bash

#Limpiamos tablas
iptables -F
iptables -X
# Limpiamos NAT
iptables -t nat -F
iptables -t nat -X
# tabla mangle para cosas como PPPoE, PPP, and ATM
iptables -t mangle -F
iptables -t mangle -X
# Politicas Pienso que este es la mejor forma para principiantes y
# aun así no esta mal, te explico output(salida) todo porque son conexiones
# salientes, input descartamos todo, y ningun servidor debería hacer forward.
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#Intranet LAN
intranet=eth0

#Extranet wan
extranet=eth1

# Keep state. Todo lo que ya esta conectado (establecido) lo dejamos asi
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Loop device.
iptables -A INPUT -i lo -j ACCEPT

# http, https, no especificamos la interfaz por que
# queremos que sea por todas
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# ssh solo internamente y desde este rango de ip's
iptables -A INPUT -p tcp -s 192.168.x.x/24 -i $intranet --dport 7659 -j ACCEPT

# monitoreo por ejemplo si tienen zabbix o algun otro servicio snmp
iptables -A INPUT -p tcp -s 192.168.x.x/24 -i $intranet --dport 10050 -j ACCEPT

# icmp, ping bueno es decisión tuya
iptables -A INPUT -p icmp -s 192.168.x.x/24 -i $intranet -j ACCEPT

#mysql con postgres es el puerto 5432
iptables -A INPUT -p tcp -s 192.168.x.x --sport 3306 -i $intranet -j ACCEPT

#sendmail bueeeh si quieres enviar algún correo
#iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT

#Anti-SPOOFING 09/07/2014
#
SERVER_IP="190.x.x.x" # server IP - la ip wan real de tu servidor
LAN_RANGE="192.168.x.x/21" # Rango LAN de tu red o de tu vlan

# Ip's que no deberian entrar por la extranet nunca, es usar un poco de
# lógica si tenemos una interfaz netamente WAN no debería jamas entrar
# trafico tipo LAN por esa interfaz
SPOOF_IPS="0.0.0.0/8 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16"

# Acción por defecto - que se realizara cuando haga match alguna regla
ACTION="DROP"

# Paquetes con la misma ip de mi servidor por la wan
iptables -A INPUT -i $extranet -s $SERVER_IP -j $ACTION
#iptables -A OUTPUT -o $extranet -s $SERVER_IP -j $ACTION

# Paquetes con el Rango LAN por la wan, lo coloco así por si tienes
# alguna red particular, pero esto es redundante con la siguiente
# regla dentro del bucle "for"
iptables -A INPUT -i $extranet -s $LAN_RANGE -j $ACTION
iptables -A OUTPUT -o $extranet -s $LAN_RANGE -j $ACTION

## Todas las Redes SPOOF no permitidas por la wan
for ip in $SPOOF_IPS
do
iptables -A INPUT -i $extranet -s $ip -j $ACTION
iptables -A OUTPUT -o $extranet -s $ip -j $ACTION
done

Como siempre espero sus comentarios, permanezcan sintonizados en este blog, Gracias

Comparte para difundir

Si te ha gustado nuestro contenido ahora puedes ayudar a difundirlo en las redes sociales de manera sencilla usando los siguientes botones:

Envía
Pinea
Print

10 comentarios

  1.   HO2Gi dijo

    Me sirve para seguir aprendiendo un poco mas gracias copiado.

    1.    BrodyDalle dijo

      de nada, me alegro de ser de ayuda

  2.   Javier dijo

    Lo siento mucho, pero tengo dos preguntas (y una de regalo 😉 ):

    ¿Llegaría con esta configuración para tener Apache funcionando y cerrar el resto salvo SSH?

    #Limpiamos tablas
    iptables -F
    iptables -X

    Limpiamos NAT

    iptables -t nat -F
    iptables -t nat -X

    iptables -A INPUT -p tcp –dport 80 -j ACCEPT

    ssh solo internamente y desde este rango de ip’s

    iptables -A INPUT -p tcp -s 192.168.x.x/24 -i $intranet –dport 7659 -j ACCEPT

    Segunda pregunta: ¿Es el 7659 el puerto que se usa en SSH en este ejemplo?

    Y tercera y última: ¿en qué archivo debe guardarse esta configuración?

    Muchas gracias por el tutorial, es una pena que sea tan novato y no pueda aprovecharlo bien.

    1.    BrodyDalle dijo

      esta es la regla que necesitas para http de apache
      iptables -A INPUT -p tcp –dport 80 -j ACCEPT

      pero también necesitas declarar las políticas por defecto de drop (esta en el script)
      iptables -P INPUT DROP
      iptables -P OUTPUT ACCEPT
      iptables -P FORWARD DROP

      y esta por que si estas remoto, te va a botar.
      iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

      si 7659 es el puerto de ese ssh en el ejemplo, por defecto es 22, aunque te recomiendo cambiar a un puerto “no bien conocido”
      hombre no se, como tu quieras… firewall.sh y lo colocas en rc.local (sh firewall.sh) para que se ejecute automatico, depende de que sistema operativo tengas existen archivos donde puedes colocar las reglas directamente.

  3.   Jge dijo

    Eii bro muy bueno tu script, analizandolo ….sabes como podria denegar todas la peticiones de mis usuarios a un sitio web especifico?…. pero este sitio web tiene mucho servidores ….

    1.    BrodyDalle dijo

      Te recomiendo otras opciones:
      1) Puedes crear una zona falsa en tu dns…
      2) Puedes colocar un proxy con acl
      sin embargo
      Por iptables puedes asi… no siempre es la mejor opción(existen mas formas)
      iptables -A INPUT -s blog.desdelinux.ne -j DROP
      iptables -A OUTPUT -d blog.desdelinux.net -j DROP

      Cuéntame si funciono

  4.   Javier dijo

    Gracias por la respuesta, todo aclarado. Lo del puerto lo preguntaba porque me extrañó usar el 7659, ya que los puertos privados empiezan en el 49152, y podría interferir con algún servicio o algo.
    De nuevo, gracias por todo, ¡así da gusto!

    Saludos.

  5.   sic dijo

    BrodyDalle como puedo ponerme en contacto con usted? Muy interesante su script.

    1.    BrodyDalle dijo

      soulofmarionet_1@hotmail.com

  6.   Carlos dijo

    La ante última línea “iptables -A OUTPUT -o $extranet -s $ip -j $ACTION” está para evitar que tu propia máquina haga spoofing? ¿o es posible que ingrese algún paquete envenenado y pueda salir con ese source envenenado y por eso también se incluye la regla con OUTPUT?
    Muchas gracias por la aclaración!!!

Deja un comentario

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

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.