Crea tu propio firewall con iptables mediante este sencillo scrip parte 2

Firewall_(networking)

Hola a todos hoy les traigo una segunda parte de esta serie de tutoriales sobre firewall con iptables, bien sencillos para que puedan copiar y pegar, creo que al final y al cabo es lo que todos los principiantes buscan o hasta los mas experiementados, ¿por que tenemos que reinventar la rueda 100 veces, no?.

Esta vez les digo que tratemos de enfocarnos en el caso muy especifico de si queremos que nuestro firewall sea mucho mas agresivo con una política OUTPUT DROP. Este post también va a petición de un lector de esta paginas y mis post. (Dentro de mi mente Wiiiiiiiiiiiiii)

Hablemos un poco de los «pro y contras» de establecer políticas Output Drop, el contra que te puedo comentar principalmente es que hace el trabajo mucho mas tedioso y trabajoso, sin embargo el pro es que a nivel de red tendrás seguridad que si te sentaste a pensar, diseñar y planifica bien las políticas tendrás un servidor mucho mas seguro.

Para no divagar ni tampoco salirme del tema, te voy a explicar rápidamente con un ejemplo como mas o menos deberían ser tus reglas

iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
-A porque agregamos la regla
-o hace referencia a trafico de salida, luego se coloca la interfaz sino es especificado pues hace match con todas.
–sport puerto de origen, juega un papel importante debido a que en la mayoría de los casos no sabemos desde que puerto nos van a hacer la petición, si así fuera podríamos usar dport
–dport puerto de destino, ya cuando especificamente conocemos de antemano que la conexion saliente debe ir solo a un puerto en especifico. Tiene que ser para algo muy puntual como un servidor remoto de mysql por ejemplo.
-m state –state ESTABLISHED esto es ya adorno de mantener las conexiones ya establecidas, podríamos profundizar en ello en un futuro post
-d para hablar de destino, si se pudiera especificar, por ejemplo ssh a una maquina en especifico por su ip

#!/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 DROP
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
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Loop device.
iptables -A INPUT -i lo -j ACCEPT
# Salida loopback
iptables -A OUTPUT-o 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
# salida
# http, https, no especificamos la interfaz por que
# queremos que sea por todas pero si especificamos el puerto de salida
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 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
# salida
# ssh solo internamente y desde este rango de ip's
iptables -A OUTPUT -p tcp -d 192.168.x.x/24 -o $intranet --sport 7659 -j ACCEPT
# monitoreo por ejemplo si tienen zabbix o algún otro servicio snmp
iptables -A INPUT -p tcp -s 192.168.1.1 -i $intranet --dport 10050 -j ACCEPT
# salida
# monitoreo por ejemplo si tienen zabbix o algún otro servicio snmp
iptables -A OUTPUT -p tcp -d 192.168.1.1 -o $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
# salida
# icmp, ping bueno es decisión tuya
iptables -A OUTPUT -p icmp -d 192.168.x.x/24 -o $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
# salida - pregunta también hecha por un usuario para hacer una regla
# muy especifica servidor:192.168.1.2 mysql: 192.168.1.3
#mysql con postgres es el puerto 5432
iptables -A OUTPUT -p tcp -s 192.168.1.2 -d 192.168.1.3 --dport 3306 -o $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

En la próxima revisión vamos a hacer port range y ademas establecer políticas organizadas por nombres, entre otras cosas… espero sus comentarios y peticiones.


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.