martes, 18 de mayo de 2010

Un vistazo a Iptables con DMZ


Revisando el baúl de los recuerdos me encontré con algunos trabajos escolares, y me se me ocurrió que era buena idea comentar alguno de ellos. Definitivamente uno de mis favoritos es iptables, y en este ejemplo hacemos una implementación de esas reglas para una arquitectura con DMZ.

Les voy a compartir un script, que lo que hace es activar un firewall usando iptables y que a la vez tiene finalidad de ayudarnos a protegernos a nivel de capa de red y transporte. El único requerimiento es tener instalado awk, e iptables en linux.

#!/bin/bash
#Re-adaptado por:
#Martin Edmundo Barriga Orozco

#Revisamos la dependencia de AWK
awk --version > /dev/null
if [ "$?" != "0" ]; then
echo "Se requiere AWK para continuar"
exit 1
fi

echo "Preparando interfaces..."
echo 1 > /proc/sys/net/ipv4/ip_forward

#Interfaces de red que usamos para la red LAN, DMZ e Internet
if_lan="eth1"
if_dmz="eth2"
if_pub="eth0"

#Direcciones que tenemos en cada interface
ip_pub="10.27.46.145"
ip_lan="172.16.1.254"
ip_dmz="192.168.1.254"

#Direcciones IPs conocidas.
web_server="192.168.1.1"
mail_server="192.168.1.3"
dhcp_server="192.168.1.129"
dns_server="192.168.1.2"

id_lan="172.16.0.0/16"
id_dmz="192.168.1.0/24"

#Configuracion final con el usuario
read -p "Habilitar uso para DMZ [y/N]: " enable_dmz
if [ "$enable_dmz" = "y" ]; then
if [ -n "$if_dmz" ]; then
#call metodo_valida_interfaz
echo "invocamos al metodo de validacion de interfaz"
else
echo " Interfaces Disponibles:"
#Imprimimos el listado de interfaces
ifconfig -a | awk 'BEGIN{FS="[ ]+" ; RS=""} $1!~/lo/{print " " NR ") " $1}'
read -p " Nombre de la interfaz a usar: " if_dmz

#call metodo_valida_interfaz
#echo "invocamos al metodo de validacion de interfaz"

echo -n " >>IP: " ;
#Se imprime la direccion IP de la interfaz $if_dmz
ifconfig $if_dmz | grep 'inet:' | awk 'BEGIN{FS="[ ]+"} {print $3}' | awk 'BEGIN{FS=":"}{print $2}'
read -p " Desea conservar esta IP para esta interfaz [y/N]: " tmp_ans
if [ "$tmp_ans" != "y" ]; then
read -p " Nueva IP: " ip_dmz
ifconfig $if_dmz $ip_dmz
fi
fi
fi

read -p "Habilitar el modo paranoico [y/N]: " enable_paranoico_mode


echo "Aplicando reglas del firewall..."


#Borrado de las reglas aplicadas actualmente (flush)
iptables -F #flush todas las cadenas
iptables -t nat -F
iptables -X #Borra cadenas definidas por el usuario
iptables -Z

#Activamos bitacora de reenvio
iptables -t nat -A PREROUTING -j LOG
iptables -t nat -A POSTROUTING -j LOG

#Politicas por defecto (INPUT OUTPUT FORWARD)
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

#REDIRECCIONAMIENTO A SERVIDOR WEB EN DMZ DESDE LA LAN Y RED PUBLICA
iptables -t nat -A PREROUTING -i $if_lan -s $id_lan -d $ip_lan -p tcp --dport 80 -j DNAT --to 192.168.1.1:80
iptables -t nat -A PREROUTING -i $if_pub -d $ip_pub -p tcp --dport 80 -j DNAT --to 192.168.1.1:80
#iptables -t nat -A PREROUTING -i $if_lan -s 0.0.0.0 -d 255.255.255.255 -p udp --dport 67 -j DNAT --to 192.168.1.129:67

#ABRIENDO PUERTOS PARA INPUT, OUTPUT, FORWARD: TRABAJO SUCIO PERO HAY QUE HACERLO!

#Aceptamos peticiones de ICMP para la LAN.
iptables -A INPUT -i $if_lan -s $id_lan -d $ip_lan -p icmp -j ACCEPT
iptables -A OUTPUT -o $if_lan -s $ip_lan -d $id_lan -p icmp -j ACCEPT

if [ "$enable_dmz" = "y" ]; then
#Aceptamos peticiones e ICMP para la DMZ.
iptables -A INPUT -i $if_dmz -s $id_dmz -d $ip_dmz -p icmp -j ACCEPT
iptables -A OUTPUT -o $if_dmz -s $ip_dmz -d $id_dmz -p icmp -j ACCEPT
fi

#Aceptamos peticiones ICMP desde la red publica.
iptables -A INPUT -i $if_pub -s 0/0 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -o $if_pub -d 0/0 -p icmp --icmp-type 0 -j ACCEPT

#Aceptamos el flujo para el DNS para la LAN. REVISAR
iptables -A INPUT -i $if_lan -p udp --dport 67 -j ACCEPT
iptables -A OUTPUT -o $if_lan -p udp --sport 67 -j ACCEPT

if [ "$enable_paranoico_mode" != "y" ]; then
#Aceptamos navegar en la web. (Opcional)
iptables -A INPUT -i $if_pub -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i $if_pub -p tcp --sport 443 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p tcp --dport 443 -j ACCEPT

#Aceptamos las peticiones de MSNP, tenemos tolerancia. xD (Opcional)
iptables -A INPUT -i $if_pub -p tcp --sport 1863 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p tcp --dport 1863 -j ACCEPT
fi

#Aceptamos el flujo de DNS para la red publica. REVISAR
iptables -A INPUT -i $if_pub -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -o $if_pub -p udp --dport 53 -j ACCEPT

if [ "$enable_dmz" = "y" ]; then
#Permitimos el flujo de de comununicacion entre el WEB server de la DMZ y los clientes de la LAN
#Evitamos rafagas de paquetes syn.
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $web_server -p tcp --dport 80 -m limit --limit 3/minute --limit-burst 3 state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $web_server -d $id_lan -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de de comununicacion entre el DNS server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $dns_server -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $dns_server -d $id_lan -p udp --sport 53 -j ACCEPT

#Permitimos el flujo de de comununicacion entre el MAIL server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $mail_server -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $mail_server -d $id_lan -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de de comununicacion entre el MAIL server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $mail_server -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $mail_server -d $id_lan -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de de comununicacion entre el MAIL server de la DMZ y los clientes de la LAN
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $mail_server -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $mail_server -d $id_lan -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

#Permitimos el flujo de ICMP hacia el servidor web
iptables -A FORWARD -i $if_lan -o $if_dmz -s $id_lan -d $web_server -p icmp -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_lan -s $web_server -d $id_lan -p icmp -j ACCEPT

#Permitimos a nuestro servidor DNS, solicitar direcciones al DNS del ITMorelia
iptables -A FORWARD -i $if_dmz -o $if_pub -s $dns_server -d 200.33.171.1 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_dmz -s 200.33.171.1 -d $dns_server -p udp --sport 53 -j ACCEPT

#iptables -A FORWARD -i $if_dmz -o $if_pub -p udp --dport 53 -j ACCEPT
#iptables -A FORWARD -i $if_pub -o $if_dmz -p udp --sport 53 -j ACCEPT

#Permitimos a nuestro servidor DNS, solicitar direcciones al DNS del ITMorelia
iptables -A FORWARD -i $if_dmz -o $if_pub -s $dns_server -d 200.33.171.8 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_dmz -s 200.33.171.8 -d $dns_server -p udp --sport 53 -j ACCEPT

#Permitimos exponer nuestro webserver a la red publica.
iptables -A FORWARD -i $if_pub -o $if_dmz -d $web_server -p tcp --dport 80 -m limit --limit 5/minute --limit-burst 5 -j ACCEPT
iptables -A FORWARD -i $if_dmz -o $if_pub -s $web_server -p tcp --sport 80 -j ACCEPT
else
#Sino hay DMZ permitimos a los clientes LAN consultar DNS externos
iptables -A FORWARD -i $if_lan -o $if_pub -s $id_lan -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_lan -d $id_lan -p udp --sport 53 -j ACCEPT
fi

#Permitimos a las personas de la LAN, navegar en la web.
iptables -A FORWARD -i $if_lan -o $if_pub -s $id_lan -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_lan -d $id_lan -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $if_lan -o $if_pub -s 172.16.1.21 -p tcp --dport 443 -j ACCEPT ##1863 :1503 3389
iptables -A FORWARD -i $if_pub -o $if_lan -d 172.16.1.21 -p tcp --sport 443 -j ACCEPT

#Permitimos el uso del MSNP en la computadora del SysAdmin dentro de la LAN
iptables -A FORWARD -i $if_lan -o $if_pub -s 172.16.1.21 -p tcp --dport 1863 -j ACCEPT ##1863 :1503 3389
iptables -A FORWARD -i $if_pub -o $if_lan -d 172.16.1.21 -p tcp --sport 1863 -j ACCEPT
iptables -A FORWARD -i $if_lan -o $if_pub -s 172.16.1.21 -p udp --dport 1863 -j ACCEPT
iptables -A FORWARD -i $if_pub -o $if_lan -d 172.16.1.21 -p udp --sport 1863 -j ACCEPT

#ENMASCARAMIENTO DE LA RED Y LA DMZ
iptables -t nat -A POSTROUTING -o $if_pub -s $id_lan -j MASQUERADE
if [ "$enable_dmz" = "y" ]; then
iptables -t nat -A POSTROUTING -o $if_pub -s $dns_server -p udp --dport 53 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $if_pub -s $id_dmz -j MASQUERADE
iptables -t nat -A POSTROUTING -o $if_dmz -s $id_lan -d $web_server -p tcp --dport 80 -j SNAT --to-source $ip_dmz
iptables -t nat -A POSTROUTING -o $if_dmz -s ! $id_lan -d $web_server -p tcp --dport 80 -j SNAT --to-source $ip_dmz
#iptables -t nat -A POSTROUTING -o $if_dmz -s 0.0.0.0 -d $dhcp_server -p udp --dport 67 -j SNAT --to-source $ip_dmz
fi

echo "Reglas aplicadas correctamente :)"

domingo, 21 de febrero de 2010

OLPC XO, Netbook fundacion Telmex.

Hace unos días y de manera involuntaria me entere de que la fundación Telmex, hace donativos, de unas netbooks para escuelas primarias de escasos recursos, siempre y cuando la escuela lo solicite y después de hacer una evaluación la fundación telmex determina si procede el donativo o no. Estas netbooks no están en venta en México. Para mas información puedo compartir el teléfono del HelpDesk 01 800 822 02 50.

Tengo que agradecer a mi amigo Roman Aguilar quien amablemente me dejo revisar un equipo de estos y así poder compartirlo con ustedes. El diseño es muy atractivo y como juguete de pruebas seria un muy buen ambiente.

Se trata de una computadora portátil desarrollado por la organización One Laptop Per Child, cuyo objetivo es apoyar a los niños de escasos recursos de todo el mundo, poniendo a su alcaze computadoras portátiles. Para mas información podemos ver [ aquí ].

Esta diminuta computadora tiene un sistema basado en GNU/linux, y un sistema de escritorios, sugar con iconos muy grandes ideal para los niños, aquí podemos encontrar aplicaciones para colorear, navegar en Internet, juegos, una consola!. Como otras aplicaciones también tiene gcc, sshd, es un fedora así que una vez en Internet podemos instalar mas cosas.
/*** Nucleo ***/
[olpc@xo-1D-F7-DA ~]$ uname -a
Linux xo-1D-F7DA.localdomain 2.6.22-20080312.2.olpc.f3687aa7e09fd65 #1 PREEMPT Wed Mar 12 21:25:06 EDT 2008 i586 i586 i386 GNU/Linux


/*** Distribución usada ***/
[olpc@xo-1D-F7-DA ~]$ cat /etc/fedora-release

Fedora release 7 (Moonshine)
/*** Cantidad de memoria ***/
[olpc@xo-1D-F7-DA ~]$ free -m
total used free shared buffers cached
Mem: 232 218 13 0 0 120
-/+ buffers/cache: 98 134
Swap: 0 0 0

/*** HD ***/
[olpc@xo-1D-F7-DA ~]$ df -h

S.ficheros Tamaño Usado Disp Uso% Montado en
mtd0 1.0G 375M 650M 37% /
tmpfs 35M 0 35M 0% /dev/shm

/*** Perifericos PCI ***/
[olpc@xo-1D-F7-DA ~]$ lspci

00:01.0 Host bridge: Advanced Micro Devices [AMD] Unknown device 0028 (rev 21)
00:01.1 VGA compatible controller: Advanced Micro Devices [AMD] Geode LX Video
00:01.2 Entertainment encryption device: Advanced Micro Devices [AMD] Geode LX AES Security Block
00:0c.0 FLASH memory: Marvell Technology Group Ltd. Unknown device 4100 (rev 10)
00:0c.1 Generic system peripheral [0805]: Marvell Technology Group Ltd. Unknown device 4101 (rev 10)
00:0c.2 Multimedia video controller: Marvell Technology Group Ltd. Unknown device 4102 (rev 10)
00:0f.0 ISA bridge: Advanced Micro Devices [AMD] CS5536 [Geode companion] ISA (rev 03)
00:0f.3 Multimedia audio controller: Advanced Micro Devices [AMD] CS5536 [Geode companion] Audio (rev 01)

00:0f.4 USB Controller: Advanced Micro Devices [AMD] CS5536 [Geode companion] OHC (rev 02)
00:0f.5 USB Controller: Advanced Micro Devices [AMD] CS5536 [Geode companion] EHC (rev 02)

/*** CPU ***/
[olpc@xo-1D-F7-DA proc]$ cat cpuinfo
processor : 0
vendor_id : AuthenticAMD ( ¿que?..., ¿hay otro? xD )
cpu family : 5
model : 10
model name : Geode(TM) Integrated Processor by AMD PCS
stepping : 2
cpu MHz : 433.386
cache size : 128 KB
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu de pse tsc msr cx8 sep pge cmov clflush mmx mmxext 3dnowext 3dnow
bogomips : 867.83
clflush size : 32

Finalmente un pequeño video:



sábado, 23 de enero de 2010

Martin, ¿donde estas? Te extrañamos!.

Tal vez el titulo de este post pueda parecer un poco extremo, pero seguro te robe una sonrisa. Bien, este tiempo pase un poco ausente por que he tenido un poco de trabajo, muchas cosas buenas y malas en mi vida. Tratare de categorizar esto.

Trabajo: Afortunadamente este año se visualiza muy bueno, inicie con el pie derecho y así quiero que se mantenga, estoy trabajando en algo que me gusta, la administración de servidores tanto GNU/Linux (RedHat Enterprise, Ubuntu, etc) y M$ Windows.

Escuela: Me da pena admitirlo, pero los resultados nos son los esperados, voy atrasado en la tesis "Diseño e implementación de una técnica en tiempo real para los sistemas de prevension de intrusos". Tengo una pequeña implementación con Snort que debo aun modificar, unos artículos que he leido, pero no es suficiente.

Proyectos:
  • Marioneta: Codigo del prototipo publicado en google, a la brevedad comparto el url. Control de escritorio remoto.
  • Futura Medica: Desarrollo en openlaszlo para el control de pacientes y diccionario medico.
  • Productos Naturistas: Desarrollo en openlaszlo para venta de producto multinivel.
  • Implementación de MediaWiki y los problemas que se presentaron, espero comentar algo en post futuros.
Una cosa mas que quiero compartir, es que he estado haciendo ejercicio, ya tengo como dos meses trabajando con brazos y abdomen, sin embargo, esto no es lo que quiero; estoy buscando salud, por lo tanto me gustaria ir a correr espero un dia comenzar y de ahi no dejarlo.

sábado, 19 de diciembre de 2009

Installing glibc2.4, but faill :(

Hace unas semanas me vi en la necesidad de actualizar mi viejo flashplayer plugin de la version 8 a la 10, ya que no podia ver las video conferencias de mis amigos en servicios como ustream, videos en facebook, etc.

En principio ese era el problema, siguiendo el procedimiento coloque el libflashplayer.so en el directorio de plugins del browser, al tratar de cargar los videos podemos ver un mensaje de error, donde los requerimientos de libflashplayer son glibc2.4. En mi lap con Debian etch la es glibc2.3.6. Tambien estamos corriendo Linux 2.6.23.1.

De el problema de actualizar flashplayer, tendríamos que pasar entonces a actualizar glibc, que es una libreria base del sistema. A pesar de contar con glibc mas nuevos en la web del proyecto, se descargo la 2.4. No me pregunten por que..., solo lo hice así. A continuación escribo el procedimiento que seguí para conseguir mas problemas.

Descargar el archivo de glibc2.4 y desempaquetarlo dentro de
/usr/gnu/glibc-2.4

La recomendación de los desarrolladores es crear un directorio donde construiremos el paquete, de esta manera solo borramos el directorio de construcción y listo, podemos repetir los pasos.
/usr/gnu/glibc-build

Entrar en este segundo directorio y configurarlo, para eso corriendo el script, en esta parte cambiamos el prefix, ya que con el que tiene por defecto se presentaron problemas. Así que ejecutamos la siguiente linea:
../glibc-2.4/configure --prefix=/usr

Para la compilacion se requiere el awk de gnu, gawk, y sobre todo las herramientas de compilación como make y gcc. Para eso ejecutar:
../glibc-2.4/make && ../glibc-2.4/make check

Hasta aquí todo en orden la compilación, solo falta la instalación de esta nueva biblioteca, esa instalación es el "paso de la muerte", y debería hacerse en supervision de un adulto :)

Siguiendo las recomendaciones debemos iniciar en modo monouser, para evitar el rompimiento de algunas bibliotecas (LOL), y una vez ahí instalar con la siguiente linea:
env LANGUAGE=C LC_ALL=C make install

En ese momento el sistema se pone a instalar, pero en mi caso, después de un rato de felicidad viendo que todo iva en orden, se detiene en el siguiente mensaje

GLIBC_PRIVATE not defined
Kernel Panic - not syncing: Attempted to kill init!

WTF! seguramente no son buenas noticias por que después de eso, ningún comando funciona, reiniciar tampoco sirve de mucho, por que el Kernel panic persiste. Al momento de escribir este post lo hago desde mi debian, logre arreglarlo siguiendo el siguiente [ tip ], al parecer es un bug de glib. Por los problemas que tengo en mi sistema, flashplayer, espacio insuficiente, problemas de montaje con ntfs. Por estas razones y por que viene un ano nuevo, comenzaremos con un distro nuevo... Lenny :)