miércoles, 27 de noviembre de 2013

Firewall - Debian

El Firewall o corta fuegos es la herramienta que nos permite administrar los paquetes que entran, salen y se reenvían desde nuestros ordenadores, así dando a nuestro ordenador una seguridad más personalizada de ataques por puertos.


En Linux hay varias formas de hacer Firewall personalizado como lo son: Iptables y Ebtables, como muchos otros, pero a mi agrado trabajo más con estos 2.
Para la ayuda de como utilizar estos comandos está #man iptables o #man ebtables, desde la consola de Linux. (Para salir de está solo presionamos Ctrl + Z)

Para definir estos parámetros es muy bueno tener un script a la mano, es decir, en un archivo de texto, en el cual se van a copiar las ordenes a ejecutar y si algo no sale como lo queremos solo será re-acomodar los parámetros y volver a ejecutar. Así:
(El siguiente ejemplo se trata sobre un Firewall en el cual van conectados un DMZ por la ETH2, una Red Local por la ETH1 y un servicio de Internet por la ETH0)



>> Firewall
allow-hotplug eth0 ( interfaz del Internet )
auto eth0
iface eth0 inet dhcp
(la IP que me da es 192.168.1.16)

allow-hotplug eth1 ( interfaz de la Red Local )
auto eth1
iface eth1 inet static
address 192.168.2.1
network 192.168.2.0
netmask 255.255.255.0
gateway 192.168.1.16

allow-hotplug eth2 ( interfaz del DMZ )
auto eth2
iface eth2 inet static
address 192.168.3.1
network 192.168.3.0
netmask 255.255.255.0
gateway 192.168.1.16

>> Red Local (este host también es un servidor DNS y DHCP Local)
auto eth0
iface eth0 inet static
address 192.168.2.2
network 192.168.2.0
netmask 255.255.255.0
gateway 192.168.2.1

>>Servidor DMZ (DNS, HTTP, FTP, CORREO, etc.)
auto eth0
iface eth0 inet static
address 192.168.3.2
network 192.168.3.0
netmask 255.255.255.0
gateway 192.168.3.1

################# Archivo SCRIPT de iptables en Firewall  ##################

#!/bin/sh

echo > "Aplicando reglas de Firewall........"

#configuración de fordward
echo "1" > /proc/sys/net/ipv4/ip_forward

#Inicio de reglas
iptables -F (elimina lo establecido)
iptables -X (elimina las cadena creadas)
iptables -Z (reinicia el conteo de paquetes)

#Configuracion por defecto
iptables -P INPUT DROP (todo lo que entra es rechaza)
iptables -P OUTPUT DROP (todo lo que sale es rechaza)
iptables -P FORWARD DROP (todo lo que se reenvia se rechaza)

#Traduccion de IPs
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.3.0/24 -j MASQUERADE

#Firewall de reenvios
iptables -A FORWARD -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

#Reglas necesarias del NAT
iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp --dport 80 -j DNAT --to 192.168.3.2:80

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp --dport 443 -j DNAT --to 192.168.3.2:443

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp --dport 53 -j DNAT --to 192.168.3.2:53 

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p udp --dport 53 -j DNAT --to 192.168.3.2:53

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp --dport 21 -j DNAT --to 192.168.3.2:21

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp --dport 20 -j DNAT --to 192.168.3.2:20

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp -m multiport --dport 5000:5005 -j DNAT --to 192.168.3.2

iptables -t nat -A PREROUTING -i eth0 -d 192.168.1.16 -p tcp -m multiport --dport 25,143 -j DNAT --to 192.168.3.2

####Conexion de Internet al DMZ
#HTTP
iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp --sport 80 -j ACCEPT

#HTTPS
iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp --dport 443 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp --sport 443 -j ACCEPT

#DNS
iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp --dport 53 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp --sport 53 -j ACCEPT

iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p udp --sport 53 -j ACCEPT

#FTP
iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp --dport 21 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp --sport 21 -j ACCEPT


iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp --dport 20 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp --sport 20 -j ACCEPT

#OTROS
iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp -m multiport --dport 5000:5005 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp -m multiport --sport 5000:5005 -j ACCEPT 

#SMTP,POP3
iptables -A FORWARD -i eth0 -s 0.0.0.0/0 -o eth2 -d 192.168.3.2 -p tcp -m multiport --dport 25,143 -j ACCEPT

iptables -A FORWARD -o eth0 -d 0.0.0.0/0 -i eth2 -s 192.168.3.2 -p tcp -m multiport --sport 25,143 -j ACCEPT

###Conexion de Red local al Internet
#HTTP
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth0 -d 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth0 -s 0.0.0.0/0 -p tcp --sport 80 -j ACCEPT 

#HTTPS
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth0 -d 0.0.0.0/0 -p tcp --dport 443 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth0 -s 0.0.0.0/0 -p tcp --dport 8080 -j ACCEPT

###DNS exterior para host 192.168.2.2
iptables -A FORWARD -i eth1 -s 192.168.2.2 -o eth0 -d 0.0.0.0/0 -p tcp --dport 53 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.2 -i eth0 -s 0.0.0.0/0 -p tcp --sport 53 -j ACCEPT

iptables -A FORWARD -i eth1 -s 192.168.2.2 -o eth0 -d 0.0.0.0/0 -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.2 -i eth0 -s 0.0.0.0/0 -p udp --sport 53 -j ACCEPT

###Conexion de Red local al DMZ
#HTTP
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 - tcp --dport 80 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p tcp --sport 80 -j ACCEPT

#HTTPS
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 -p tcp --dport 443 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p tcp --sport 443 -j ACCEPT

#DNS
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 -p tcp --dport 53 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p tcp --sport 53 -j ACCEPT

iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p udp --sport 53 -j ACCEPT

#FTP
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 -p tcp --dport 21 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p tcp --sport 21 -j ACCEPT

#OTROS
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 -p tcp -m multiport --dport 5000:5005 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p tcp -m multiport --sport 5000:5005 -j ACCEPT

#SMTP,POP3
iptables -A FORWARD -i eth1 -s 192.168.2.0/24 -o eth2 -d 192.168.3.2 -p tcp -m multiport --dport 25,143 -j ACCEPT

iptables -A FORWARD -o eth1 -d 192.168.2.0/24 -i eth2 -s 192.168.3.2 -p tcp -m multiport --sport 25,143 -j ACCEPT

##Peticiones y respuesta DHCP
iptables -A INPUT -i eth1  -s 192.168.2.0/24 -d 255.255.255.255 -p udp --dport 67 --sport 68 -j ACCEPT

iptables -A OUTPUT -o eth1 -s 192.168.2.2 -d 255.255.255.255 -p udp --dport 67 --sport 68 -j ACCEPT

##Permitir SSH desde Red local
iptables -A INPUT -i eth1 -s 192.168.2.0/24 -d 192.168.2.2 -p tcp --dport 22 -j ACCEPT

iptables -A OUTPUT -o eth1 -d 192.168.2.0/24 -s 192.168.2.2 -p tcp --sport 22 -j ACCEPT

##Permitir consultas al servidor DNS de Red local
iptables -A INPUT -i eth1 -s 192.168.2.1 -d 192.168.2.2 -p tcp --dport 53 -j ACCEPT

iptables -A OUTPUT -o eth1 -d 192.168.2.1 -s 192.168.2.2 -p tcp --sport 53 -j ACCEPT

iptables -A INPUT -i eth1 -s 192.168.2.1 -d 192.168.2.2 -p udp --dport 53 -j ACCEPT

iptables -A OUTPUT -o eth1 -d 192.168.2.1 -s 192.168.2.2 -p udp --sport 53 -j ACCEPT

##Permitir PING al DMZ desde Red local
iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -o eth1 -p icmp --icmp-type echo-reply -j ACCEPT

iptables -A INPUT -i eth2 -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -o eth2 -p icmp --icmp-type echo-reply -j ACCEPT 

exit 0

###############################################################################

Estos son solo algunos ejemplos de como se puede utilizar el iptables, ya que hay muchas más opciones para configurar.

iptables -L     >>> Muestra lo configurado simple
iptables -nL   >>> Muestra lo configurado pero un poco mas especifico
iptables -nvL >>> Muestra lo configurado pero detallado y con recuento de paquetes
iptables -t Nombre_Tabla  Politica >>> Crea nuevas entradas personalizadas}

ebtables -L        >>> Muestra lo configurado simple
ebtables -L --cL >>> Muestra lo configurado pero detallado y con recuento de paquetes

Una de las formas para prohibir el escaneo de puertos con IPTABLES, cuando las políticas son ACCEPT

iptables -A INPUT -p tcp ! --syn -m state --state NEW --log-prefix "No SYN"
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

Otra de las formas en la cual podemos utilizar el IPTABLES para prohibir el escaneo de puertos es esta:

iptables -A INPUT -m unclean -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

Con EBTABLES y una interfaz puente o bridge podemos desde un servidor DHCP denegar las peticiones de ciertos HOST ( Tipo SCRIPT )

##!/bin/bash

##Planteamiento
ebtables -F
ebtables -X

##Politicas por defecto
ebtables -P INPUT ACCEPT
ebtables -P OUTPUT ACCEPT
ebtables -P FORWARD ACCEPT

##Denegación de servicio DHCP por MAC
ebtables -A INPUT -i br#  --log-level info --log-ip --log-prefix FwDHCP

ebtables -A INPUT -i br# -s MAC-CLIENTE -p ip4 --ip-proto udp --ip-dport 68 --ip-sport 67 -j DROP

ebtables -A OUTPUT -o br# -d MAC-CLIENTE -p ip4 --ip-proto udp --ip-sport 68 --ip-dport 67 -j DROP

exit 0


No hay comentarios:

Publicar un comentario