jueves, 15 de noviembre de 2012

Firewall mediante iptables en S.O GNU/LINUX

Configurar script para iptables en GNU/LINUX

Aunque he probado interfaces gráficas, en concreto una, firestarter y parece que funciona bien, personalmente prefiero las iptables, ya que no tienes que depender de ningún entorno gráfico y lo puede correr en cualquier maquina con GNU/LINUX. 
 
Una vez dicho esto empecemos por dar una breve explicación acerca de iptables:

 Simplemente decir que iptables es un firewall vinculado directamente al kernel y que básicamente existen dos políticas: 

          - Aceptar o denegar trafico, entrante o saliente, de un determinado puerto/s,o IP, etc ...

Aquí os dejo mi script iptables, podéis hacer un COPY-PASTE si así lo deseáis y no me rechinaran los dientes. Este script es para mi PC y no tiene implementado servidor alguno, tan sólo tiene habilitados algunos servicios como FTP, SMTP, IMAP, etc ...

nano firewall.sh

#!/bin/sh

case $1 in
start )
echo iniciando iptables
#Borrándose reglas anteriores
iptables -F
iptables -X
iptables -Z
#Estableciendo las reglas por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Al localhost se le permite todo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#Permito salida web
iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT
#web seguras
iptables -A INPUT -i eth1 -p tcp --dport 443 -j ACCEPT
#FTP
iptables -A INPUT -i eth1 -p tcp --dport 21 -j ACCEPT
#Las siguientes reglas permiten el trafico IMAPS
iptables -A INPUT -i eth1 -p tcp --dport 993 -j ACCEPT
#Pemito trafico SMTP
iptables -A INPUT -i eth1 -p tcp --dport 465 -j ACCEPT
#Ahora cerramos los puertos de gestión típicos
iptables -A INPUT -i eth1 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -i eth1 -p udp --dport 1:1024 -j DROP 
# impedimos iniciar conexion los puertos altos
iptables -A INPUT -p tcp --syn --dport 1025:65535 -j DROP 
#Permito tráfico torrent
iptables -A INPUT -i eth1 -p tcp --dport 43253 -j ACCEPT
#Bloqueando ICMP con iptables
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#Se muestran los resultados
if [ $? = 0 ]
then
echo reglas aplicadas correctamente
exit 0
else
echo se produjo un error al aplicar las reglas
exit 1
fi
echo "Listo."
;;
restart )
echo reiniciando iptables
#Borrándose reglas anteriores
iptables -F
iptables -X
iptables -Z
#Estableciendo las reglas por defecto
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
#Al localhost se le permite todo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#Permito salida web
iptables -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT
#web seguras
iptables -A INPUT -i eth1 -p tcp --dport 443 -j ACCEPT
#FTP
iptables -A INPUT -i eth1 -p tcp --dport 21 -j ACCEPT
#Las siguientes reglas permiten el trafico IMAPS
iptables -A INPUT -i eth1 -p tcp --dport 993 -j ACCEPT
#Pemito trafico SMTP
iptables -A INPUT -i eth1 -p tcp --dport 465 -j ACCEPT
#Ahora cerramos los puertos de gestión típicos
iptables -A INPUT -i eth1 -p tcp --dport 1:1024 -j DROP
iptables -A INPUT -i eth1 -p udp --dport 1:1024 -j DROP
# impedimos iniciar conexion los puertos altos
iptables -A INPUT -p tcp --syn --dport 1025:65535 -j DROP 
#Permito tráfico torrent
iptables -A INPUT -i eth1 -p tcp --dport 43253 -j ACCEPT
#Bloqueando ICMP con iptables
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#Se muestran los resultados
if [ $? = 0 ]
then
echo reglas aplicadas correctamente
exit 0
else
echo se produjo un error al aplicar las reglas
exit 1
fi
echo "Listo."
;;
stop )
echo -n "Desactivando Reglas..."
#Pongo las políticas por defecto en 'ACCEPT'
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#Quito todas las reglas declaradas
iptables -F
iptables -X
iptables -Z
#Se habilita la espuesta ping
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
#Se muestran los resultados
if [ $? = 0 ]
then
echo reglas desactivadas
exit 0
else
echo se produjo un error al desactivar las reglas

exit 1
fi
echo "Listo."
;;
* )
echo "No se ha pasado ningún parámetro."
echo "Uso: $0 { start | stop | restart }"
;;
esac

Llegados a este punto, donde voy a dejarme asesorar, espero que no sea la última vez, ya que no soy un experto, ni mucho menos, acerca de iptables, pero si que recientemente implemente un servidor samba para una LAN corporativa,  y que apoyándome en mis vagos conocimientos acerca de iptables y en varios tutoriales, me salio este script:

A continuación muestro el escenario al que me enfrento:
LAN+NAT

nano firewall.sh

#!/bin/sh

LAN=192.168.1.0/24
MI_IP_PUBLICA=x.x.x.x
case $1 in
start )
echo iniciando iptables
iptables -F
iptables -X
#Estableciendo las reglas por defecto
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#Al localhost se le permite todo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#Permitimos trafico samba
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 445 -j ACCEPT
#Habilito el puerto 22, para mi, para conectarme con un ssh desde mi casa
iptables -A INPUT -s "$MI_IP_PUBLICA" -p tcp --dport 22 -j ACCEPT
#Se muestran los resultados
if [ $? = 0 ]
then
echo reglas aplicadas
exit 0
else
echo se produjo un error al aplicar las reglas
exit 1
fi
echo "Listo."
;;
restart )
echo reiniciando iptables
iptables -F
iptables -X
#Estableciendo las reglas por defecto
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#Al localhost se le permite todo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#Permitimos trafico samba
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s $LAN -m state --state NEW -p tcp --dport 445 -j ACCEPT
#Habilito el puerto 22, para mi, para conectarme con un ssh desde mi casa
iptables -A INPUT -s "$MI_IP_PUBLICA" -p tcp --dport 22 -j ACCEPT
#Se muestran los resultados
if [ $? = 0 ]
then
echo reglas aplicadas
exit 0
else
echo se produjo un error al aplicar las reglas
exit 1
fi
echo "Listo."
echo "Listo."
;;
stop )
echo -n "Desactivando Reglas..."
#Pongo las políticas por defecto en 'ACCEPT'
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
#Quito todas las reglas declaradas
iptables -F
iptables -X
iptables -Z
#Se muestran los resultados
if [ $? = 0 ]
then
echo reglas desactivadas
exit 0
else
echo se produjo un error al desactivar las reglas
exit 1
fi
echo "Listo."
;;
* )
echo "No se ha pasado ningún parámetro."
echo "Uso: $0 { start | stop | restart }"
;;
esac

Este script es totalmente funcional pero ciertamente mejorable así que agradecería sugerencias.

Para ver lo que se aplica:


iptables -L


- Para iniciar el script durante el arranque:


cp /home/user/iptables.sh /etc/init.d/
chmod +x /etc/init.d/firewall.sh
update-rc.d firewall.sh defaults



No hay comentarios:

Publicar un comentario