#!/bin/bash

#
# firewall.sh - Script para configurar el muro de fuego
# 28 de julio de 2009
# Copyright (C) 2009  Guillermo Valdes Lozano
# http://www.movimientolibre.com/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Este script ha sido probado en Gentoo Linux. Requiere:
#
# 1) Kernel con soporte para IPTables
#
# 2) Que este instalado "net-firewall/iptables".
#
# 3) Que el comando /sbin/iptables pueda ejecutarse por el usuario.
#    Por defecto, sólo root puede hacerlo. Para ello, instale "app-admin/sudo",
#    luego ejecute "visudo" como root y agregue la siguiente linea:
#
#    %wheel  ALL=(ALL)  NOPASSWD: /sbin/iptables
#

# Nombre de este script
SOY="[Firewall]"

# Comando a ejecutar
CMD="sudo /sbin/iptables"

# Constantes que definen los tipos de errores
EXITO=0
E_NOARGS=65
E_DUPLICADO=98
E_FATAL=99

# Mensaje para mostrar por falta de argumentos
function ayuda() {
	echo "$SOY Ayuda"
	echo
	echo "Objetivo:"
	echo " Configurar el muro de fuego"
	echo
	echo "Sintaxis:"
	echo " firewall.sh <DISPOSITIVO> <CONFIANZA>"
	echo " firewall.sh limpio"
	echo
	echo "Parametros:"
	echo " <DISPOSITIVO> eth0, eth1 o wlan0,"
	echo " <CONFIANZA>   insegura o confiable"
	echo
	echo "Ejemplos:"
	echo " firewall.sh limpio"
	echo " firewall.sh eth0 confiable"
	echo " firewall.sh eth1 inseguro"
	echo
}

# Si el primer parametro es "limpio"
# Vaciamos las cadenas del muro de fuego y
# aceptamos todas las conexiones y terminamos
if [ "$1" = "limpio" ]; then
	echo "$SOY Limpiando las cadenas."
	$CMD -t filter -F
	$CMD -t nat    -F
	echo "$SOY ADVERTENCIA: SE ACEPTARAN TODAS LAS CONEXIONES."
	$CMD -P INPUT   ACCEPT
	$CMD -P OUTPUT  ACCEPT
	$CMD -P FORWARD ACCEPT
	echo "$SOY Script terminado."
	exit $EXITO
fi

#
# Parametros
#

# Primer parámetro: dispositivo de red
case "$1" in
	"eth0")
		INTERFAZ="eth0"
		;;
	"eth1")
		INTERFAZ="eth1"
		;;
	"wlan0")
		INTERFAZ="wlan0"
		;;
	*)
		echo "$SOY ERROR: Dispositivo de red incorrecto."
		ayuda
		exit $E_FATAL
		;;
esac

# Segundo parámetro: confiabilidad de la red
case "$2" in
	"confiable")
		CONFIABILIDAD="confiable"
		;;
	"insegura" | "inseguro")
		CONFIABILIDAD="insegura"
		;;
	*)
		echo "$SOY Por defecto la red se considera INSEGURA."
		CONFIABILIDAD="insegura"
		;;
esac

#
# Proceso
#

# Vaciar las reglas
echo "$SOY Vaciando las reglas actuales."
$CMD -t filter -F
$CMD -t nat    -F

if [ $CONFIABILIDAD = "confiable" ]; then
	echo "$SOY La red es CONFIABLE."
	$CMD -P INPUT   DROP
	$CMD -P OUTPUT  ACCEPT
	$CMD -P FORWARD ACCEPT
fi

if [ $CONFIABILIDAD = "insegura" ]; then
	echo "$SOY La red es INSEGURA."
	$CMD -P INPUT   DROP
	$CMD -P OUTPUT  DROP
	$CMD -P FORWARD DROP
fi

echo "$SOY Aceptar toda entrada y salida por loopback."
$CMD -A INPUT  -i lo -j ACCEPT
$CMD -A OUTPUT -o lo -j ACCEPT

echo "$SOY Aceptar las comunicaciones establecidas."
$CMD -A INPUT -m state --state ESTABLISHED -j ACCEPT
$CMD -A INPUT -m state --state RELATED     -j ACCEPT

if [ $CONFIABILIDAD = "insegura" ]; then
	echo "$SOY SOLO PERMITIR la salida de paquetes nuevos y establecidos."
	$CMD -A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
fi

if [ $CONFIABILIDAD = "confiable" ]; then

	echo "$SOY Aceptar SSH (TCP 22) en $INTERFAZ"
	$CMD -A INPUT -i $INTERFAZ -p tcp --dport 22 -j ACCEPT

	echo "$SOY Aceptar HTTP (TCP 80) en $INTERFAZ"
	$CMD -A INPUT -i $INTERFAZ -p tcp --dport 80 -j ACCEPT

	echo "$SOY Aceptar Samba (TCP y UDP 137, 138, 139, 445) en $INTERFAZ"
	$CMD -A INPUT -i $INTERFAZ -p tcp --dport 137:139 -j ACCEPT
	$CMD -A INPUT -i $INTERFAZ -p udp --dport 137:139 -j ACCEPT
	$CMD -A INPUT -i $INTERFAZ -p tcp --dport 445     -j ACCEPT
	$CMD -A INPUT -i $INTERFAZ -p udp --dport 445     -j ACCEPT

	echo "$SOY Aceptar rsync (TCP 873) en $INTERFAZ"
	$CMD -A INPUT -i $INTERFAZ -p tcp --dport 873 -j ACCEPT

	echo "$SOY ACEPTAR TODO por puertos del 1024 al 65535 en $INTERFAZ"
	$CMD -A INPUT -i $INTERFAZ -p tcp --dport 1024:65535 -j ACCEPT
	$CMD -A INPUT -i $INTERFAZ -p udp --dport 1024:65535 -j ACCEPT

	echo "$SOY Aceptar pings."
	$CMD -A INPUT -p icmp -j ACCEPT

fi

# Para depurar quite los comentarios a los siguientes comandos
# echo "$SOY Configuración lista:"
# $CMD -L -n -v -t filter
# echo

# Mensaje final
echo "$SOY Script terminado."

