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


11 comentarios, deja el tuyo

Deja tu 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.

  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.

  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!!!

  7.   fran dijo

    este es mi propio script de iptables, es muy completo:

    # franes.iptables.airoso
    # doc.iptables.airoso: iptables para legacy y para nft
    #
    # puertos del firewall
    ###########################
    #!/bin/bash
    #
    # limpia la pantalla
    ############################### inicio de /etc/f-iptables/default.cfg |||||
    clear
    # deja una linea en blanco
    echo
    export si=»» no=»echo off»
    # las variables que puedes cambiar para permitir acceso
    ###################### variables para modificar con $si o $no
    export hayexcepciones=»$no»
    # hayexcepciones: $si para permitir host excepcioneles y $no para desactivar
    export hayping=»$no»
    # hayping: $si para permitir los pings a terceros y $no para denegar
    export haylogserver=»$no»
    # haylogeosserver: $si para poder logear tcp $no para no poder logear tcp
    ######
    ###################### variables a modificar añadiendo «,» o con rangos de «:»
    export excepciones=»baldras.wesnoth.org»
    # excepciones permitir a uno o a varios host desde el firewall o sin valor
    export logserver=discard,ipp,dict,ssh
    # puertos servidor tcp a los que se guarda un log cuando entran paquetes
    export redserver=0/0
    # redserver: la red para puertos servidores preferible red local o varias ips
    export redcliente=0/0
    # redcliente: la red para puertos clientes preferible todas las redes
    export servidortcp=discard,ipp,dict,6771
    # servidortcp: los puertos servidores tcp especificados
    export servidorudp=discard
    # servidorudp: los puertos servidores udp especificados
    export clienteudp=domain,bootpc,bootps,ntp,20000:45000
    # clienteudp: los puertos clientes udp especificados
    export clientetcp=domain,http,https,ipp,git,dict,14999:15002
    # clientetcp: los puertos clientes tcp especificados
    ############################## fin de /etc/f-iptables/default.cfg |||||
    ############################### fin de variables para modificar
    export firewall=$1 variables=$2
    if [ «$variables» = «$NULL» ]; then source /etc/f-iptables/default.cfg;
    else source /etc/f-iptables/$2; fi
    ############################### o va sobreescribir las variables con un archivo.cfg
    ############################################################################################
    export firewall=$1 export variables=$2
    ########################################## variables automaticas del sistema
    if [ «$firewall» = «desconectado» ]; then echo FIREWALL DESCONECTADO;
    export activarservidor=»$no» activarcliente=»$no» mojado=»$no»;
    elif [ «$firewall» = «cliente» ];then echo FIREWALL CLIENTE;
    export activarservidor=»$no» activarcliente=»» mojado=»$no»;
    elif [ «$firewall» = «servidor» ]; then echo FIREWALL SERVIDOR;
    export activarservidor=»» activarcliente=»$no» mojado=»$no»;
    elif [ «$firewall» = «clienteyservidor» ]; then echo FIREWALL CLIENTE Y SERVIDOR;
    export activarservidor=»»; export activarcliente=»»;export mojado=»$no»;
    elif [ «$firewall» = «permisivo» ]; then echo FIREWALL PERMISIVO;
    export activarservidor=»$no» activarcliente=»$no» mojado=»»;
    else
    $comprueba sudo echo iptables-legacy:
    $comprueba sudo iptables-legacy -v -L INPUT
    $comprueba sudo iptables-legacy -v -L OUTPUT
    $comprueba sudo echo iptables-nft:
    $comprueba sudo iptables-nft -v -L INPUT
    $comprueba sudo iptables-nft -v -L OUTPUT
    echo _____parmetros____ $0 $1 $2
    echo «lanza sin parametros es para listar iptables.»
    echo «El primer parametro (activar iptables): desconectado o cliente o servidor o clienteyservidor o permisivo.»
    echo «El segundo parametro: (opcional): el archivo.cfg por defecto elige /etc/f-iptables/default.cfg»
    echo «Las configuraciones de las variables: » $(ls /etc/f-iptables/)
    exit 0; fi
    ################
    echo
    echo Lanza $0 desconectado o cliente o servidor o clienteyservidor o permisivo o variables o sin usar parametro para listar iptables.
    echo El archivo $0 contiene algunas variables editables dentro.
    ################################ las anteriores variables activadas
    ################################
    echo configurando las variables de iptables
    echo variables activadas
    echo
    ############################ las reglas de iptables
    echo Configurando iptables-legacy
    sudo /usr/sbin/iptables-legacy -t filter -F
    sudo /usr/sbin/iptables-legacy -t nat -F
    sudo /usr/sbin/iptables-legacy -t mangle -F
    sudo /usr/sbin/ip6tables-legacy -t filter -F
    sudo /usr/sbin/ip6tables-legacy -t nat -F
    sudo /usr/sbin/ip6tables-legacy -t mangle -F
    sudo /usr/sbin/ip6tables-legacy -A INPUT -j DROP
    sudo /usr/sbin/ip6tables-legacy -A OUTPUT -j DROP
    sudo /usr/sbin/ip6tables-legacy -A FORWARD -j DROP
    sudo /usr/sbin/iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
    $haylogserver sudo /usr/sbin/iptables-legacy -A INPUT -p tcp -m multiport –dports $logserver -j LOG > /dev/null
    $hayexcepciones sudo /usr/sbin/iptables-legacy -A INPUT -s $excepciones -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-legacy -A INPUT -p udp -m multiport –dports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-legacy -A INPUT -p tcp -m multiport –dports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-legacy -A INPUT -p udp -m multiport –sports $clienteudp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-legacy -A INPUT -p tcp -m multiport –sports $clientetcp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $hayping sudo /usr/sbin/iptables-legacy -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT > /dev/null
    sudo /usr/sbin/iptables-legacy -A INPUT -j DROP > /dev/null
    sudo /usr/sbin/iptables-legacy -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
    $hayexcepciones sudo /usr/sbin/iptables-legacy -A OUTPUT -d $excepciones -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-legacy -A OUTPUT -p udp -m multiport –sports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-legacy -A OUTPUT -p tcp -m multiport –sports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-legacy -A OUTPUT -p udp -m multiport –dports $clienteudp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-legacy -A OUTPUT -p tcp -m multiport –dports $clientetcp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $hayping sudo /usr/sbin/iptables-legacy -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT > /dev/null
    sudo /usr/sbin/iptables-legacy -A OUTPUT -j DROP
    sudo /usr/sbin/iptables-legacy -A FORWARD -j DROP
    echo iptables-legacy activado
    echo
    echo Configurando iptables-nft
    sudo /usr/sbin/iptables-nft -t filter -F
    sudo /usr/sbin/iptables-nft -t nat -F
    sudo /usr/sbin/iptables-nft -t mangle -F
    sudo /usr/sbin/ip6tables-nft -t filter -F
    sudo /usr/sbin/ip6tables-nft -t nat -F
    sudo /usr/sbin/ip6tables-nft -t mangle -F
    sudo /usr/sbin/ip6tables-nft -A INPUT -j DROP
    sudo /usr/sbin/ip6tables-nft -A OUTPUT -j DROP
    sudo /usr/sbin/ip6tables-nft -A FORWARD -j DROP
    sudo /usr/sbin/iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
    $haylogserver sudo /usr/sbin/iptables-nft -A INPUT -p tcp -m multiport –dports $logserver -j LOG > /dev/null
    $hayexcepciones sudo /usr/sbin/iptables-nft -A INPUT -s $excepciones -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-nft -A INPUT -p udp -m multiport –dports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-nft -A INPUT -p tcp -m multiport –dports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-nft -A INPUT -p udp -m multiport –sports $clienteudp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-nft -A INPUT -p tcp -m multiport –sports $clientetcp -m state –state established -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $hayping sudo /usr/sbin/iptables-nft -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT > /dev/null
    sudo /usr/sbin/iptables-nft -A INPUT -j DROP > /dev/null
    sudo /usr/sbin/iptables-nft -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
    $hayexcepciones sudo /usr/sbin/iptables-nft -A OUTPUT -d $excepciones -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-nft -A OUTPUT -p udp -m multiport –sports $servidorudp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarservidor sudo /usr/sbin/iptables-nft -A OUTPUT -p tcp -m multiport –sports $servidortcp -s $redserver -d $redserver -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-nft -A OUTPUT -p udp -m multiport –dports $clienteudp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $activarcliente sudo /usr/sbin/iptables-nft -A OUTPUT -p tcp -m multiport –dports $clientetcp -s $redcliente -d $redcliente -j ACCEPT > /dev/null
    $hayping sudo /usr/sbin/iptables-nft -A OUTPUT -p icmp –icmp-type echo-request -j ACCEPT > /dev/null
    sudo /usr/sbin/iptables-nft -A OUTPUT -j DROP
    sudo /usr/sbin/iptables-nft -A FORWARD -j DROP
    echo iptables-nft activado
    echo
    $mojado sudo /usr/sbin/iptables-legacy -F > /dev/null
    $mojado sudo /usr/sbin/iptables-legacy -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
    $mojado sudo /usr/sbin/iptables-legacy -A INPUT -m state –state established -j ACCEPT > /dev/null
    $mojado sudo /usr/sbin/iptables-legacy -A INPUT -j DROP > /dev/null
    $mojado sudo /usr/sbin/iptables-legacy -A OUTPUT -j ACCEPT > /dev/null
    $mojado sudo /usr/sbin/iptables-legacy -A FORWARD -j DROP > /dev/null
    $mojado sudo /usr/sbin/iptables-nft -F > /dev/null
    $mojado sudo /usr/sbin/iptables-nft -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT > /dev/null
    $mojado sudo /usr/sbin/iptables-nft -A INPUT -m state –state established -j ACCEPT > /dev/null
    $mojado sudo /usr/sbin/iptables-nft -A INPUT -j DROP > /dev/null
    $mojado sudo /usr/sbin/iptables-nft -A OUTPUT -j ACCEPT > /dev/null
    $mojado sudo /usr/sbin/iptables-nft -A FORWARD -j DROP > /dev/null
    ##########################
    echo has lanzado $0 $1 $2
    # sale del script
    exit 0