sábado, 24 de mayo de 2008

LINUX: Ejemplo script iptables para firewall

Después de pelearme un poco con esto de iptables, he montado este pequeño script para un firewall.

Este firewall tiene 2 accesos a Internet balanceadas entre ella con iproute2.

Como tal el script utiliza 2 ficheros de configuración (/etc/firewall/acceso.web y /etc/firewall/acceso.ftp.inet2dmz) donde de pueden poner los nombre de los diferentes host/ordenadores y a que lugar pueden ir.

Aunque script funciona para la web, es MUY ACONSEJABLE utilizar squid como servidor de proxy, ya que permite mejor control y gestión.

Para la gestión del log de iptables, existen soluciones freeware que permiten estadisticas y demás.

#Funcion para dar acceso
#Parámetros $1=Origen $2=Interface desde la que accede el origen
# $3=Destino $4=Interface a través de la cual se llega al destino
# $5=Protoco $6=Puerto de destino
function Acceso {
if $iptables -A FORWARD -s $1 -i $2 -d $3 -o $4 -p $5 --dport $6 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
then
echo Acceso de $1 desde $2 para $3 por $4 ,protocolo:$5, puerto $6
else
echo ERROR Acceso de $1 desde $2 para $3 por $4 ,protocolo:$5, puerto $6
fi

if $iptables -A FORWARD -d $1 -o $2 -s $3 -i $4 -p $5 --sport $6 -m state --state ESTABLISHED,RELATED -j ACCEPT
then
echo Acceso de $3 desde $4 para $1 por $2 ,protocolo:$5, puerto $6
else
echo ERROR Acceso de $3 desde $4 para $1 por $2 ,protocolo:$5, puerto $6
fi
}

function AccesoWEB {

#Estructura de cada registro ,,...,,
for registro in `grep -v "^#" /etc/firewall/accesos.web`
do
CAMPOS=`echo $registro | awk -f /etc/firewall/contador.awk`
ULTIMOORIGEN=`expr $CAMPOS - 1`
for cont in `seq 1 $ULTIMOORIGEN`
do
ORIGEN=`echo $registro | cut -f $cont -d ","`
DESTINO=`echo $registro | cut -f $CAMPOS -d ","`
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET1 tcp http
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET2 tcp http
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET1 tcp https
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET2 tcp https
done
done
}

function AccesoFTP {
for registro in `grep -v "^#" $1`
do
ORIGEN=`echo $registro | cut -f 2 -d ","`
DESTINO=`echo $registro | cut -f 3 -d ","`
echo origen $ORIGEN dev_origen $2 destino $DESTINO dev_destino $3
Acceso $ORIGEN $2 $DESTINO $3 tcp 20
Acceso $ORIGEN $2 $DESTINO $3 tcp 21
done
}

function AccesoFTP_INET2DMZ {
#Estructura de cada registro ,,
AccesoFTP /etc/firewall/accesos.ftp.inet2dmz $DEV_INET1 $DEV_DMZ
AccesoFTP /etc/firewall/accesos.ftp.inet2dmz $DEV_INET2 $DEV_DMZ
}

function AccesoADMIN {
$iptables -A INPUT -s $1 -i $DEV_LAN -d $IP_LAN -p tcp --dport ssh -j ACCEPT
$iptables -A OUTPUT -d $1 -o $DEV_LAN -s $IP_LAN -p tcp --sport ssh -j ACCEPT

$iptables -A INPUT -s $1 -i $DEV_LAN -d $IP_LAN -p icmp -j ACCEPT && echo Acceso PING para $1 desde $2
$iptables -A OUTPUT -d $1 -o $DEV_LAN -s $IP_LAN -p icmp -j ACCEPT && echo Acceso PING para $1 desde $2

Acceso $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1 tcp http
Acceso $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1 tcp https
AccesoPING $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1

Acceso $1 $DEV_LAN $FTP_SERVER $DEV_DMZ tcp ssh
AccesoPING $1 $DEV_LAN $FTP_SERVER $DEV_DMZ

$iptables -A FORWARD -s $1 -p icmp -j ACCEPT
$iptables -A FORWARD -d $1 -p icmp -j ACCEPT

$iptables -A INPUT -s $1 -p icmp -j ACCEPT
$iptables -A OUTPUT -d $1 -p icmp -j ACCEPT
}

function LOG_NoDeseado {
$iptables -A INPUT -p udp ! --dport 137:138 -j LOG
$iptables -A INPUT -j LOG
$iptables -A OUTPUT -j LOG
$iptables -A FORWARD -j LOG
}

function Acceso_DNSServer {
$iptables -A OUTPUT -o $DEV_LAN -d $1 -p tcp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_LAN -s $1 -p tcp --sport domain -j ACCEPT
$iptables -A OUTPUT -o $DEV_LAN -d $1 -p udp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_LAN -s $1 -p udp --sport domain -j ACCEPT
$iptables -A OUTPUT -o $DEV_INET1 -p udp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_INET1 -p udp --sport domain -j ACCEPT
Acceso $1 $DEV_LAN $MUNDO $DEV_INET2 tcp domain
Acceso $1 $DEV_LAN $MUNDO $DEV_INET2 udp domain
}

IP_INET1=80.33.33.33
IP_INET2=80.33.34.34
IP_DMZ=10.0.2.1
IP_LAN=10.0.1.1

DEV_INET1=eth3
DEV_INET2=eth2
DEV_DMZ=eth1
DEV_LAN=eth0

NET_INET1=80.33.33.0/24
NET_INET2=80.33.34.0/24
NET_DMZ=10.0.2.0/24
NET_LAN=10.0.1.0/24

MUNDO=0.0.0.0/0

#SERVER
DNS_SERVER=10.0.1.2
FTP_SERVER=10.0.2.2
MAIL_SERVER=10.0.1.3

#COMANDOS
iptables=/usr/sbin/iptables
ifconfig=/sbin/ifconfig
route=/sbin/route

#LIMPIADO DE LAS TABLAS
$iptables -F
$iptables -Z
$iptables -X
$iptables -t nat -F

#DEFINICION POLITICA POR (DROP)
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP

#########################################################################
# D N S - Damos acceso para que los nombre de host se puedan resolver #
#########################################################################

Acceso_DNSServer $DNS_SERVER

#################################
# O T R O S A C C E S O S #
#################################
AccesoADMIN nuestro_host.nuestro_dominio

#############
# D N A T #
#############

# Acceso de Internet a nuestro servidor de correo
# --------------
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 25 -j DNAT --to :25
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 25 -j DNAT --to :25

# DESDE INET A FTP SERVER
-----------------------
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 20 -j DNAT --to :20
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 21 -j DNAT --to :21

$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 20 -j DNAT --to :20
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 21 -j DNAT --to :21

#Con esto permitimos el ftp pasivo
modprobe ip_nat_ftp


###################
# R O U T I N G #
###################
$iptables -A POSTROUTING -t nat -o $DEV_INET1 -j MASQUERADE
$iptables -A POSTROUTING -t nat -o $DEV_INET2 -j MASQUERADE
$iptables -A POSTROUTING -t nat -o $DEV_DMZ -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

###########
# F T P #
###########

#Con estos accesos permitimos el tráfico desde fuera a nuestro servidor
Acceso $MUNDO $DEV_INET1 $DEV_DMZ tcp 20
Acceso $MUNDO $DEV_INET1 $DEV_DMZ tcp 21

Acceso $MUNDO $DEV_INET2 $DEV_DMZ tcp 20
Acceso $MUNDO $DEV_INET2 $DEV_DMZ tcp 21

AccesoFTP_INET2DMZ


###################
# A C C E S O S #
###################
AccesoFTP_INET2DMZ
AccesoWEB

###########
# L O G #
###########
LOG_NoDeseado

No hay comentarios: