# ------ COMIENZO SCRIPT ------
#!/bin/sh

#
# -----  Modifica esto -----
#

IPTABLES="/sbin/iptables"
IFCONFIG="/sbin/ifconfig"
GREP="/bin/grep"
CUT="/usr/bin/cut"
CAT="/bin/cat"


# La dirección de internet (hay que cambiar el script si el formato del ifconfig es distinto)
# Para que la dirección sea la adecuada el script debe ejecutarse cuando la interfaz de
# internet ya esté activa.

# Interfaces 
IF1=eth0
IF2=eth0:0

# IPs (no se está usando)
IP1=`$IFCONFIG $IF1 | $GREP "inet addr" | $CUT -d ":" -f 2 | $CUT -d " " -f 1`
IP2=`$IFCONFIG $IF2 | $GREP "inet addr" | $CUT -d ":" -f 2 | $CUT -d " " -f 1`

# Puertos TCP a los que permitir el acceso (separados por coma, 15 máximo, los demás serán ignorados)
PORTS=3306,80,21,25,22

#
# --------------------------
# Cargamos módulos necesarios para protocolos complejos (FTP, IRC, ICQ...)
# FTP
/sbin/modprobe ip_conntrack_ftp

# Para impedir q los logs del iptables salgan por pantalla
dmesg -n 5

# Activamos protección contra spoof y desactivamos ip forward
for fichero in /proc/sys/net/ipv4/conf/*/rp_filter
do
  echo "1" > $fichero
done

echo "0" >/proc/sys/net/ipv4/ip_forward
		

# Eliminamos todas las reglas que puedan existir
$IPTABLES -F
$IPTABLES -t nat -F

# Borramos cualquier cadena que no sean las de defecto
$IPTABLES -X
$IPTABLES -t nat -X

# Establecemos las políticas por defecto
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# Aceptamos TODO lo que venga de la interfaz local
$IPTABLES -A INPUT -p ALL -i lo -j ACCEPT

# Aceptamos cualquier conexión que hayamos solicitado
$IPTABLES -A INPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT

# Aceptamos conexiones a los puertos especificados 
# (si hay más de 15 puertos, habría que añadir más líneas como la siguiente)
$IPTABLES -A INPUT -p TCP -m multiport --destination-port $PORTS -j ACCEPT

# Aceptamos paquetes ICMP Ping 
iptables -A INPUT -p ICMP --icmp-type echo-request -j ACCEPT

# Logeamos cualquier paquete entrante que no haya encajado en ninguna de las reglas anteriores (posibles escaneos casuales)
$IPTABLES -A INPUT -jLOG --log-level warn --log-prefix "IPTables Input (DROP): " 


# Rellenamos la cadena OUTPUT

# Aceptamos TODO lo que salga de la interfaz local
$IPTABLES -A OUTPUT -p ALL -o lo -j ACCEPT

# Permitimos salir cualquier conexion previamente establecida o relacionada con una establecida
$IPTABLES -A OUTPUT -p ALL -m state --state ESTABLISHED,RELATED -j ACCEPT

# Aceptamos todo lo que salga por las interfaces de red desde alguno de los puertos permitidos 
# (evita la pérdida de ciertos paquetes cuando el IPTables borra el estado de la conexión)
$IPTABLES -A OUTPUT -p TCP -m multiport --source-port $PORTS  -j ACCEPT

# Permitimos enviar/responder a los pings
iptables -A OUTPUT -p ICMP --icmp-type echo-request -j ACCEPT

# Permitimos resoluciones DNS (sólo a los servidores colocados en el resolv.conf)
for i in `$GREP nameserver /etc/resolv.conf | $CUT -d" " -f2`; do
	$IPTABLES -A OUTPUT -p UDP -d $i --dport 53 -j ACCEPT
done

# Permitimos hacer ssh a otras máquinas (sólo al root y a los usuarios del grupo 1000)
$IPTABLES -A OUTPUT -m owner --uid-owner 0 -p TCP --dport 22 -j ACCEPT
$IPTABLES -A OUTPUT -m owner --gid-owner 1000 -p TCP --dport 22 -j ACCEPT

# Permitimos que se acceda al imap de otro servdior (muy útil si montamos un webmail que acceda a un imap remoto)
$IPTABLES -A OUTPUT -p TCP --dport 143 -d 1.2.3.4 -j ACCEPT

# Logeamos cualquier paquete saliente que no haya encajado en ninguna de las reglas anteriores (riesgo de seguridad)
$IPTABLES -A OUTPUT -jLOG --log-level warn --log-prefix "IPTables Output (DROP): " 


