IPTables ¡qué recuerdos!

Comentando con los alumnos de seguridad las IPTables, hace unos días rescaté unos cuantos scripts de los que tenía hechos cuando trabajaba con ellas en lugar de con UTM’s para pasárselas a un alumno interesado en el tema.

Eso me hizo recordar esos tiempos de “picar” todas y cada una de las reglas necesarias a mano. La verdad es que era un poco pesado configurar un router/firewall completo así,  pero se conseguía un control total sobre todas las comunicaciones que entraban y salían de la empresa, así como de las redirecciones de puertos, NAT y demás configuraciones. Y además ¡¡lo habías hecho tu mismo!!

La costumbre era poner en monopuesto el router del proveedor de turno y colocar detrás un equipo con Linux con varias tarjetas de red (desde 2 el más simple hasta 5 o 6 dependiendo de la finalidad del mismo) que pasaría a ser el router/firewall de esa/esas ADSL. Podía haber más de una y poder hacer balanceo de carga, usarla como failover,…

De hecho, en una de las versiones más divertidas que hice, mediante comando ping controlaba las conexiones de las ADSL (con sus tiempos prudenciales y demás comprobaciones extras) y si detectaba la caída del enlace, los enrutaba a todos hacia un módem 3G USB. Seguía comprobando el estado de la línea y cuando se restauraba se volvía a enrutar el tráfico por las líneas convencionales. El enlace 3G no es que fuese una maravilla, pero podían navegar mientras se restauraba la conexión.

Otro ejemplo de las cosas interesantes que se podían hacer con estos equipos, es que hay una parte en la cuál se rebota el correo de un comercial que trabajaba en remoto al cuál su proveedor de Internet le tenía el puerto 25 “capado”. Así conectando al puerto 8000 del equipo Linux, cambiado la IP de origen del paquete y reenviando hacia el puerto 25 del servidor de correo, se consigue que dicho servidor nos conteste el correo el cuál le pasamos al portátil sin problema.

Se hace algo parecido con un RDP que se conectaba a dicho Linux para ser rebotado mediante una MPLS a otra sede.

Importante la parte también de permitir las conexiones que se están estableciendo o ya están establecidas. Así cada vez que se agrega o modifica una nueva regla y se reinicia el script para que tome los cambios, no tira la conexión a los que ya están trabajando.

Os dejo el script completo por si os sirve para vuestras pruebas. Incluye también la cabecera necesaria para crear un servicio que autoarranque en el inicio una vez que haya arrancado la red y el sistema de archivos (necesarios para poder hacer correr dicho servicio de reglas IPTables).

He cambiado alguna IP pública por XXX.XXX.XXX.XXX, no me lo tengáis en cuenta ;-D.

También hay un detalle para los más puristas. En lugar de utilizar MASQUERADE para enmascarar la red interna, se utiliza un SNAT (source NAT) con la IP pública. ¿Sabríais decirme por qué?

Un saludo y hasta la próxima.


!/bin/sh
#
### BEGIN INIT INFO
# Provides:          Reglas IPTables
# Required-Start:    $network $local_fs
# Required-Stop:     $network
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Reglas IPTables
# Description:       Reglas IPTables
### END INIT INFO
#
. /etc/rc.status

# Reset status of this service
rc_reset

case "$1" in
    start)
	echo "Iniciando Reglas IPTables "

	#Borrado de todas las reglas anteriores
	iptables -F
	iptables -X
	iptables -Z
	iptables -t nat -F

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

	#Permitir el paso de las ip's de administradores hacia todos los sitios y al firewall
	iptables -A FORWARD -s 192.168.46.45 -j ACCEPT
	iptables -A FORWARD -d 192.168.46.45 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.235 -j ACCEPT
	iptables -A FORWARD -d 192.168.46.235 -j ACCEPT
	iptables -A INPUT -s 192.168.46.45 -j ACCEPT
	iptables -A OUTPUT -d 192.168.46.45 -j ACCEPT
	iptables -A INPUT -s 192.168.46.235 -j ACCEPT
	iptables -A OUTPUT -d 192.168.46.235 -j ACCEPT

	#Permitimos ping
	iptables -A INPUT -p icmp -j ACCEPT
	iptables -A OUTPUT -p icmp -j ACCEPT
	iptables -A FORWARD -p icmp -j ACCEPT

	#Permitimos el forward
	echo 1 > /proc/sys/net/ipv4/ip_forward

	#Enmascaramos la red interna para salir al exterior
	iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to XXX.XXX.XX.X

	#Mantener abiertas las conexiones ya establecidas
	iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
	iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
	iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

	#Acceso RDP Servidor XXXXXX
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3389 -j DNAT --to 192.168.46.58:3389
	iptables -A FORWARD -p tcp -s 192.168.46.58 --sport 3389 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.58 --dport 3389 -j ACCEPT

	#Servidor Http
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 83 -j DNAT --to 192.168.46.72:83
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 82 -j DNAT --to 192.168.46.72:82
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 85 -j DNAT --to 192.168.46.72:85
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 86 -j DNAT --to 192.168.46.72:86
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 192.168.46.72:8080
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 87 -j DNAT --to 192.168.46.72:87
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 88 -j DNAT --to 192.168.46.72:88
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 89 -j DNAT --to 192.168.46.72:89
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 91 -j DNAT --to 192.168.46.72:91
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 82 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 83 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 85 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 82 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 83 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 85 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 86 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 86 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 8080 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 8080 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 87 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 87 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 88 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 88 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 89 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 89 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.72 --sport 91 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.72 --dport 91 -j ACCEPT

	#Servidor Http
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 7015 -j DNAT --to 192.168.46.216:80
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 6405 -j DNAT --to 192.168.46.216:6405
	iptables -A FORWARD -p tcp -s 192.168.46.216 --sport 80 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.216 --dport 80 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.216 --sport 6405 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.216 --dport 6405 -j ACCEPT

	#TS JMG
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 11850 -j DNAT --to 192.168.46.133:11850
	iptables -A FORWARD -p tcp -s 192.168.46.133 --sport 11850 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.133 --dport 11850 -j ACCEPT

	#Soporte Remoto JMG
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 11800 -j DNAT --to 192.168.46.133:11800
	iptables -A FORWARD -p tcp -s 192.168.46.133 --sport 11800 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.133 --dport 11800 -j ACCEPT

	#SSH J.Leal
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 62628 -j DNAT --to-destination 192.168.46.5:22
	iptables -A FORWARD -p tcp -d 192.168.46.5 --dport 22 -j ACCEPT
	iptables -A FORWARD -p tcp -s 192.168.46.5 --sport 22 -j ACCEPT

	#Permitir envio de correos
	iptables -A FORWARD -s 192.168.46.216 -p tcp --dport 25 -j ACCEPT
	iptables -A FORWARD -d 192.168.46.216 -p tcp --sport 25 -j ACCEPT

	#Permitir consulta de DNS's
	iptables -A FORWARD -p udp --dport 53 -j ACCEPT
	iptables -A FORWARD -p udp --sport 53 -j ACCEPT

	#SQL TAREAS
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 1433 -j DNAT --to 192.168.46.45:1433
	iptables -t nat -A PREROUTING -i eth1 -p udp --dport 1434 -j DNAT --to 192.168.46.45:1434
	iptables -A FORWARD -p tcp -s 192.168.46.45 --sport 1433 -j ACCEPT
	iptables -A FORWARD -p tcp -d 192.168.46.45 --dport 1433 -j ACCEPT
	iptables -A FORWARD -p udp -s 192.168.46.45 --sport 1434 -j ACCEPT
	iptables -A FORWARD -p udp -d 192.168.46.45 --dport 1434 -j ACCEPT

	#REDIRECCION SERVIDOR DE CORREO
	iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
	iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
	iptables -t nat -A PREROUTING -p tcp --dport 8000 -j DNAT --to-destination IPSERVIDORCORREO:25
	iptables -t nat -A POSTROUTING -p tcp -d IPSERVIDORCORREO --dport 25 -j SNAT --to-source IPPUBLICALINUX
	iptables -A FORWARD -p tcp -d IPSERVIDORCORREO --dport 25 -j ACCEPT

	#Routeo a sede Zaragoza
	route add -net 192.168.132.0 netmask 255.255.255.0 gw 192.168.46.1

	#Conexión a RDP Zaragoza Rebotada
	iptables -A INPUT -p tcp --dport 13500 -j ACCEPT
	iptables -A OUTPUT -p tcp --dport 3389 -j ACCEPT
	iptables -t nat -A PREROUTING -p tcp --dport 13500 -j DNAT --to-destination 192.168.132.82:3389
	iptables -t nat -A POSTROUTING -p tcp -d 192.168.132.82 --dport 3389 -j SNAT --to-source 192.1168.46.138
	iptables -A FORWARD -p tcp -d 192.168.132.82 --dport 3389 -j ACCEPT

	#Abrimos puerto y protocolo GRE VPN
	iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
	iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT
	iptables -A INPUT -p 47 -j ACCEPT
	iptables -A OUTPUT -p 47 -j ACCEPT
	iptables -A FORWARD -p 47 -j ACCEPT

	#Permitimos el paso de la subred de la vpn al 67
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.67 -j ACCEPT
	iptables -A FORWARD -d 192.168.200.0/24 -s 192.168.46.67 -j ACCEPT

	#Permitimos web del 64
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.46.64:80
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.64 -p tcp --dport 80 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.64 -d 192.168.200.0/24 -p tcp --sport 80 -j ACCEPT

	#Permitimos imprimir en impresora del 61 (192.168.200.2)
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p tcp --dport 139 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p tcp --sport 139 -j ACCEPT
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p tcp --dport 445 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p tcp --sport 445 -j ACCEPT
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p udp --dport 137 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p udp --sport 137 -j ACCEPT
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p udp --dport 138 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p udp --sport 138 -j ACCEPT
	iptables -A FORWARD -s 192.168.200.0/24 -d 192.168.46.61 -p tcp --dport 135 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.61 -d 192.168.200.0/24 -p tcp --sport 135 -j ACCEPT

	#SERVIDOR DE ARCHIVOS
	#ENTRAR AL 61 PARA LAS BLACKBERRYS 8081
	#OWNCLOUD PUERTO 444
	iptables -A FORWARD -s 192.168.46.61 -j ACCEPT
	iptables -A FORWARD -d 192.168.46.61 -j ACCEPT
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8081 -j DNAT --to-destination 192.168.46.61:8081
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 444  -j DNAT --to-destination 192.168.46.61:444

	#Oscar
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 3397 -j DNAT --to-destination 192.168.46.45:3399
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 993 -j DNAT --to-destination 192.168.46.45:3399
	iptables -A FORWARD -s 192.168.46.45 -p tcp --sport 3399 -j ACCEPT
	iptables -A FORWARD -d 192.168.46.45 -p tcp --dport 3399 -j ACCEPT

	#GATEWAY DE TERMINAL SERVER 192.168.46.110
	iptables -A FORWARD -d 192.168.46.110 -p tcp --dport 443 -j ACCEPT
	iptables -A FORWARD -s 192.168.46.110 -p tcp --sport 443 -j ACCEPT
	iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to-destination 192.168.46.110:443

	# Remember status and be verbose
	rc_status -v
	;;
    stop)
	echo "Deteniendo Reglas IPTables "

	#Borrado de reglas anteriores
	iptables -F
	iptables -X
	iptables -Z
	iptables -t nat -F

	#Politica por defecto ACCEPT (Todo aceptado)
	iptables -P INPUT ACCEPT
	iptables -P OUTPUT ACCEPT
	iptables -P FORWARD ACCEPT

	#No Detenemos el forward
	echo 1 > /proc/sys/net/ipv4/ip_forward

	# Remember status and be verbose
	rc_status -v
	;;
    restart)
	## Stop the service and regardless of whether it was
	## running or not, start it again.
	$0 stop
	$0 start

	# Remember status and be quiet
	rc_status
	;;
    status)
	echo "Mostrando Estado de Reglas IPTables "
	iptables -L
	rc_status -v
	;;
    *)
	echo "Uso: $0 {start|stop|status|restart}"
	exit 1
	;;
esac
rc_exit

MegaTools desde Raspberry Pi

Buenas noches.

Hoy traigo una entrada que para los más entendidos no tendrá mucho misterio, pero como ya dije en Sobre mí y Contacto también escribo para mis alumnos y para la gente que me plantea dudas.

Un ex-alumno me planteó la opción de modificar un script en Python para Raspberry Pi, para que en lugar de utilizar un TFTP para guardar ciertos archivos, se pudiese utilzar Mega.

Me comentó que había encontrado una herramienta llamada “MegaTools” que parecían servirle, pero que no era capaz de hacerla correr en una Raspberry.

Yo he estado probando la instalación y ejecución de la herramienta y salvo algún warning, han funcionado correctamente.

Paso a explicar el proceso que he seguido y que he extraído del propio foro de Raspberry (así también lo tenéis publicado aquí) https://www.raspberrypi.org/forums/viewtopic.php?t=30523

Lo primero de todo, como siempre es actualizar los repositorios y actualizar el sistema de nuestra Raspberry Pi.

apt-get update
apt-get upgrade

Una vez actualizado el sistema, procedemos a instalar los paquetes necesarios para el funcionamiento de la herramienta.

apt-get install gcc build-essential libcurl4-openssl-dev libglib2.0-dev glib-networking

Creamos un directorio donde descargaremos el código fuente.

mkdir MegaTools
cd MegaTools

Una vez creado el directorio y una vez posicionados en él, descargamos el código fuente para su compilación para la Raspberry Pi.

wget http://megatools.megous.com/builds/megatools-1.9.95.tar.gz

La versión 1.9.95 es la última disponible a la hora de escribir este post. Si queréis ver todas las versiones sólo tenéis que entrar en http://megatools.megous.com/builds y ver el listado completo.

Una vez descargada, descomprimimos el paquete y entramos en el directorio recién creado.

tar -xvzf megatools-1.9.95.tar.gz
cd megatools-1.9.95

Ejecutamos el “configure” y lo creamos con “make”.

./configure --disable-shared
make

Una vez terminado, ejecutamos el siguiente comando para que se instale y pueda ser llamado desde cualquier directorio.

sudo make install

Ahora, si no queremos estar añadiendo el usuario y contraseña en cada comando, podemos crear un archivo de configuración llamado “.megarc” con el siguiente contenido.

[Login]
Username = nombre de usuario
Password = password de la cuenta

Una vez creado el archivo, ya podremos ejecutar comandos como por ejemplo

megals

El cuál nos listará todo el contenido de nuestro disco duro en la nube de Mega.

Para el resto de comandos, por favor, dirigirse a la ayuda de la propia herramienta.

Un saludo y hasta la próxima.