.

Breaking News
recent

-

Introducción amigable a iptables parte 3


Cuando hablamos de filtrado tipo firewall, especialmente si estamos hablando de filtrado en ordenadores personales, normalmente hacemos énfasis en el filtrado entrante, asegurándonos que nadie pueda acceder desde fuera y "colarse" en nuestro equipo.

Sin embargo, en un alarmantemente alto porcentaje es el propio usuario quien sale a Internet a buscar todo tipo de malware para instalarlo en el PC.

Teniendo un firewall en DROP y con la ayuda de unas reglas podremos evitar algunas situaciones indeseables.






Bloquear descarga de archivos con iptables

Si lo que deseamos el evitar la descarga de archivos ejecutables, iptables tiene una forma muy efectiva de lograrlo.

iptables -A INPUT -p tcp -m string --string ".exe" --algo bm -j DROP








Restringir navegación por horarios y días


Para mantener esta restricción durante las 9 am y las 13 hs del puerto 80 (http) lo podemos hacer con iptables usando el siguiente comando:


iptables -A INPUT -p tcp --sport 80 -m time --timestart 09:00 --timestop 13:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP




Atención con el orden de las reglas, para que lo anterior funcione, esta regla de tiempo debe ir primero que la regla que abre el puerto 80

Ejemplo:

iptables -A INPUT -p tcp --sport 80 -m time --timestart 09:00 --timestop 13:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP
iptables -A INPUT -p tcp -m tcp --sport 80 -m state --state RELATED,ESTABLISHED -j ACCEPT


De esta forma primero se verifica la regla de tiempo, en caso de cumplirse se descarta el trafico al puerto 80 (http), caso contrario se acepta el paquete.

Atención con este comando, la hora se aplica en formato UTC, deberá obtener la hora en UTC de su sistema "date -u" y ajustar la diferencia con su hora local de ser necesario.








Mostrar Filter y las reglas de NAT


Si bien esto es algo explicado en anteriores ocasiones, es importante diferenciar este comando:


iptables -nvL








iptables -t nat -nvL





En el segundo comando la salida es más reducida, solo mostrando las reglas NAT










Utilizar listas con Iptables







Una forma interesante de gestionar iptables es con listas, en la cuál podemos poner la IP que deseamos bloquear, veamos un práctico ejemplo:



#!/bin/sh
# Creacion de variables
LISTA_NEGRA="/usr/local/lista_negra"
PUERTOS="80 443 22 25 110"
# Borrar cualquier politica existente
iptables -f
#LISTA NEGRA
for HOST in `grep -v ^# $LISTA_NEGRA | awk '{print $1}'`; do
iptables -A INPUT -t filter -s $HOST -j DROP
done
# PUERTOS A LOS QUE SE CONECTAN LOS
for PUERTO in $PUERTOS; do
iptables -A INPUT -t filter -p tcp -m multiport --dports $PUERTO -j ACCEPT
done;
#Se bloquean intentos de conexión de otros protocolos.
iptables -A INPUT -t filter -p tcp --syn -j DROP










El usuario afectado queda aislado, es una política muy usada en entornos empresariales, se puede mejorar el código para brindarle algunos servicios, pero de momento para este ejemplo esta regla nos servirá.

Como se aprecia en el ejemplo, se define la variable LISTA_NEGRA, la misma es una lista que contiene las IP bloqueadas, el archivo está en /usr/local/lista_negra en la imagen se muestra un ejemplo del archivo.





Esto mismo se puede usar para bloquear por mac address, luego veremos un ejemplo.

La variable PUERTOS contiene los puertos que se pueden conectar las IP permitidas.








Servidor con firewall en DROP


Ya entendido lo anterior vamos a crear un firewall completamente funcional, este código es para un servidor con dos tarjetas de red, la eth0 es la que recibe internet, y eth1 esta conectada a la red local, y provee de internet a los clientes.









A continuación nos disponemos a crear un código con políticas restrictivas (DROP), el servidor debe tener una configuración de red similar a la siguiente adaptándola a su propia red:



Escribimos el siguiente comando para realizar esta tarea con permisos administrativo:

su

poner la contraseña de root, a partir de ahora y en todo el tutorial vamos a trabajar como usuario root.
(si desconoces la contraseña de root, usa "sudo -i" y pones tu propia contraseña)




nano -wB /etc/network/interfaces


auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.113
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.254

auto eth1
iface eth1 inet static
address 192.168.10.1
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255







No vamos a activar un servidor DHCP en el firewall, así que la configuración de red en los clientes debe ser suministrada de forma manual, con los siguientes datos:


auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.10.100
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255
gateway 192.168.10.1







Ahora veamos el código, en el usaremos todo lo visto anteriormente, no se podrán conectar a internet los equipos cuya IP figure en la lista negra o su mac este en la lista de macs bloqueadas, durante las 13:01 y las 08:59 y podran usar los puertos que se le habilito.



#!/bin/sh
# Creacion de variables
PUERTOS_TCP="80 443"
PUERTOS_UDP="53"
MAC_BLOQUEADAS="/usr/local/lista_macs"
IPLISTA_NEGRA="/usr/local/lista_negra"
## FLUSH de reglas
iptables -F
iptables -X
iptables -Z
iptables -t nat -F

## Politica por defecto: DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Bit forward
echo 1 > /proc/sys/net/ipv4/ip_forward

# Guardar los accesos con paquetes fragmentados, recurso utilizado para tirar
# servidores y otras maldades (bug en Apache por ejemplo)
iptables -A INPUT -i eth0 -f -j LOG --log-prefix "Fragmento! "
iptables -A INPUT -i eth0 -f -j DROP

# Operar en localhost sin limitaciones
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Enmascaramiento
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE


# Abrimos puertos tcp para el servidor

for PUERTO in $PUERTOS_TCP; do
iptables -A OUTPUT -p tcp -m tcp -m multiport --dports $PUERTO -j ACCEPT
done;

for PUERTO in $PUERTOS_TCP; do
iptables -A INPUT -p tcp -m tcp -m multiport --sports $PUERTO -m state --state RELATED,ESTABLISHED -j ACCEPT
done;

# Abrimos puertos udp para el servidor

for PUERTO in $PUERTOS_UDP; do
iptables -A OUTPUT -p udp -m udp -m multiport --dports $PUERTO -j ACCEPT
done;


for PUERTO in $PUERTOS_UDP; do
iptables -A INPUT -p udp -m udp -m multiport --sports $PUERTO -m state --state RELATED,ESTABLISHED -j ACCEPT
done;


#Bloqueo la descarga de ".exe"
iptables -A FORWARD -p tcp -m string --string ".exe" --algo bm -j DROP


#Bloqueo de horario
iptables -A FORWARD -p tcp -m multiport --sports 80,443 -m time --timestart 09:00 --timestop 13:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP


#Lista negra de IPS
for HOST in `grep -v ^# $IPLISTA_NEGRA | awk '{print $1}'`; do
iptables -A FORWARD -t filter -s $HOST -j DROP
done


#Bloqueo por mac address
for MACS in `grep -v ^# $MAC_BLOQUEADAS | awk '{print $1}'`; do
iptables -A FORWARD -m tcp -p tcp -m mac --mac-source $MACS -j DROP
done


# Forward puertos tcp para los clientes

for PUERTO in $PUERTOS_TCP; do
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 192.168.10.0/24 -d 0/0 -p tcp -m multiport --dports $PUERTO -j ACCEPT
done;


for PUERTO in $PUERTOS_TCP; do
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 192.168.10.0/24 -s 0/0 -p tcp -m multiport --sports $PUERTO -m state --state RELATED,ESTABLISHED -j ACCEPT
done;



# Forward puertos udp para los clientes

for PUERTO in $PUERTOS_UDP; do
iptables -t filter -A FORWARD -i eth1 -o eth0 -s 192.168.10.0/24 -d 0/0 -p udp -m multiport --dports $PUERTO -j ACCEPT
done;


for PUERTO in $PUERTOS_UDP; do
iptables -t filter -A FORWARD -i eth0 -o eth1 -d 192.168.10.0/24 -s 0/0 -p udp -m multiport --sports $PUERTO -m state --state RELATED,ESTABLISHED -j ACCEPT
done;










Para evitar errores de escritura pueden bajar en script de aca:

wget http://files.myopera.com/alband/files/firewal-drop-2if


Luego copiarlo

cp firewal-drop-2if /etc/network/if-up.d/


Ahora le damos permisos de ejecución y ejecutamos el script

chmod +x /etc/network/if-up.d/firewal-drop-2if
bash /etc/network/if-up.d/firewal-drop-2if








Revisando los resultados



En un equipo cliente tratamos de descargar un ejecutable desde la consola, para hacerlo más rápido


wget http://dl.google.com/picasa/picasa39-setup.exe

Esta petición de descarga jamás recibira respuesta... la interrumpimos con Ctrl+c.






Si comentamos en el firewall la regla correspondiente veremos que si se puede realizar la descarga, como se muestra en la imágen.








Intentamos actualizar la hora del sistema con un servidor NTP.

ntpdate -u ntp.ubuntu.com






Evidente que este comando no anda por que usa el puerto udp 123, si lo lo agregamos al script en la variable puertos udp, debe quedar así:


PUERTOS_UDP="53 123"


Ahora el resultado será el esperado.






Si intentamos descargar un torrent vemos que la descarga no se inicia, para lograrlo vamos a ver que puerto usa transmission:






Y lo agregamos al script en la variable puertos tcp, debe quedar así:

PUERTOS_TCP="80 443 51413"








La mac que esta bloqueada no puede navegar







La IP bloqueada tampoco puede salir a internet.






Y como era de esperar solo se puede navegar en el horario establecido.






De esta forma tenemos el control sobre las ips que se conectan, las mac, y los puertos que usan los clientes.
Imagino que ya percibis el control que iptables te da sobre tu red, ahora te invito a seguir profundizando sobre esta herramienta en mi proximo aporte.



Seria recomendable que también visites los aportes anteriores:

http://www.mundo-linux-b.blogspot.com/ ion-amigable-a-iptables.html

http://www.mundo-linux-b.blogspot.com/ ion-amigable-a-iptables-parte-2.html






Fuentes de conocimientos:

http://www.linux-os.com.ar/linuxos/mostrar-las-reglas-de-iptables-netfilter/
http://www.linux-os.com.ar/linuxos/utilizar-listas-con-iptables/
http://blog.urfix.com/25-ssh-commands-tricks/
http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=84622
http://andalinux.wordpress.com/2008/11/18/sincronizar-correctamente-el-reloj-del-sistema-en-ubuntu-linux/
http://ornellas.apanela.com/dokuwiki/pub:firewall_and_adv_routing




_____________________________________________________________________





Si te gusto el post comenta!
Estas sin tiempo para leerlo detenidamente? Agregalo a favoritos ya!
No entendiste algo? mandame un MP que te ayudo.
Te gustan mis aportes? Seguime! no te defraudaré.





Visita mis aportes o bajalo en PDF


Servidor Debian cambio placa de red ---- Bajalo en PDF
Servidor Debian con Zoneminder ---- Bajalo en PDF
Plantillas de documentos para oficina ---- Bajalo en PDF
GNU/Linux y la ecología ---- Bajalo en PDF
Asegurando el sistema con hosts.deny/allow ---- Bajalo en PDF
cp a fondo ---- Bajalo en PDF
nano a fondo ---- Bajalo en PDF
Conferencias de Richard Stallman que deberias ver
Servidor Codeka (TPV) ---- Bajalo en PDF
Resetear contraseña de mysql ---- Bajalo en PDF
Cursos gratuitos online
Micro core para equipos obsoletos ---- Bajalo en PDF
SSH comandos imprescindibles ---- Bajalo en PDF
SSH a fondo ---- Bajalo en PDF
Servidor DNS a fondo ---- Bajalo en PDF
Mínima protección necesaria - gufw ---- Bajalo en PDF
Firewall para servidores expuestos ---- Bajalo en PDF
Servidor gentoo ---- Bajalo en PDF
sed a fondo ---- Bajalo en PDF
Mover /home a otra partición/disco ---- Bajalo en PDF
Introducción amigable a iptables parte 2 ---- Bajalo en PDF
ntp a fondo ---- Bajalo en PDF
clonezilla a fondo ---- Bajalo en PDF
cron a fondo ---- Bajalo en PDF
rsync a fondo ---- Bajalo en PDF
Samba a fondo ---- Bajalo en PDF
Introducción amigable a iptables ---- Bajalo en PDF
Servidor OpenSSH ---- Bajalo en PDF
Mínima protección necesaria - Firestarter ---- Bajalo en PDF
Squid a fondo - editado ---- Bajalo en PDF
Linux terminal server en debian parte 2 ---- Bajalo en PDF
Linux terminal server en debian parte 1 ---- Bajalo en PDF
5 plantillas para glabels
Iptables - control de tráfico entrante y saliente ---- Bajalo en PDF
25 reglas para iptables ---- Bajalo en PDF
Video tutorial servidores Gnu-Linux
Ayuda memoria de comandos Gnu-Linux con ejemplos ---- Bajalo en PDF
Cambiar la tecla ç por la ñ ---- Bajalo en PDF
Sk1, alternativa a Corel Draw para Linux

No hay comentarios:

Publicar un comentario en la entrada

-

Con la tecnología de Blogger.