InicioLinuxIntroducción amigable a iptables parte 3

Introducción amigable a iptables parte 3

Linux•1/18/2013

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:










Fuentes de conocimientos:




http://www.brazilfw.com.br/forum/viewtopic.php?f=78&t=84622






_____________________________________________________________________





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


---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF

---- Bajalo en PDF
---- Bajalo en PDF

---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF
---- Bajalo en PDF

---- Bajalo en PDF
---- Bajalo en PDF

---- Bajalo en PDF
---- Bajalo en PDF
Datos archivados del Taringa! original
222puntos
533visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
11visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

a
alband🇦🇷
Usuario
Puntos0
Posts71
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.