K.4. Script de ejemplo rc.DHCP.firewall

#!/bin/sh
#
# rc.DHCP.firewall - Script de cortafuegos con IP basada en DHCP bajo
#                    Linux 2.4.x e iptables
#
# Copyright (C) 2001  Oskar Andreasson <bluefluxATkoffeinDOTnet>
#
# Este programa es software libre; puedes redistribuirlo y/o modificarlo
# bajo los términos expresados en la "GNU General Public License", tal como
# lo publica la Free Software Foundation; versión 2 de la Licencia.
#
# Este programa se distribuye con el deseo de que sea útil, pero
# SIN NINGUNA GARANTÍA; incluso sin garantía implícita de COMPRA-VENTA
# o ADECUACIÓN A PROPÓSITO PARTICULAR. Para más detalles, referirse a la
# GNU General Public License.
#
# Deberías haber recibido una copia de la GNU General Public License
# junto a este programa o desde el sitio web de dónde lo bajaste;
# si no es así, escribe a la Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA  02111-1307   USA
#
#
###########################################################################
#
# 1. Opciones de configuración.
#

#
# 1.1 Configuración de Internet.
#

INET_IFACE="eth0"

#
# 1.1.1 DHCP
#

#
# Información respecto a la conexión a Internet mediante DHCP, si es necesaria.
#
# Establece la variable DHCP a "no" si no obtienes una IP mediante DHCP. Si la
# obtienes mediante DHCP, establece la variable como "yes" e indica la dirección
# IP adecuada del servidor DHCP en la variable DHCP_SERVER.
#

DHCP="no"
DHCP_SERVER="195.22.90.65"

#
# 1.1.2 PPPoE
#

#
# Opciones de configuración respectivas a PPPoE (PPP over Ethernet).
#
# Si experimentas problemas con tu conexión PPPoE, como la imposibilidad de
# descargar correos electrónicos grandes, mientras que los pequeños bajan sin
# problemas, ..., puedes establecer esta opción como "yes" y es posible que
# se solucione el problema. Esta opción activa una regla en la cadena
# PREROUTING de la tabla 'mangle' que ajustará el tamaño de todos los paquetes
# enrutados al PMTU (Path Maximum Transmit Unit) [el tamaño máximo de los
# paquetes al pasar a través de interfases Ethernet].
#
# Ten en cuenta que es mejor establecer este valor en el propio paquete PPPoE,
# puesto que esta opción de configuración en PPPoE producirá una carga menor
# al sistema.
#

PPPOE_PMTU="no"

#
# 1.2 Configuracion de la Red de Área Local.
#
# El rango IP de la LAN (red de área local) y la IP del host local. El valor
# "/24" significa que sólo se utilizarán los primeros 24 bits de los 32 bits
# que tiene una dirección IP. Es lo mismo que la máscara de red "255.255.255.0".
#

LAN_IP="192.168.0.2"
LAN_IP_RANGE="192.168.0.0/16"
LAN_BROADCAST_ADDRESS="192.168.255.255"
LAN_IFACE="eth1"

#
# 1.3 Configuración de la DMZ ("Zona Desmilitarizada").
#

#
# 1.4 Configuración del host local.
#

LO_IFACE="lo"
LO_IP="127.0.0.1"

#
# 1.5 Configuración de IPTables.
#

IPTABLES="/usr/sbin/iptables"

#
# 1.6 Otras configuraciones.
#

###########################################################################
#
# 2. Carga de módulos.
#

#
# Necesario para la carga inicial de los módulos.
#

/sbin/depmod -a

#
# 2.1 Módulos requeridos.
#

/sbin/modprobe ip_conntrack
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_nat
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_limit
/sbin/modprobe ipt_MASQUERADE

#
# 2.2 Módulos no-requeridos.
#

#/sbin/modprobe ipt_owner
#/sbin/modprobe ipt_REJECT
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc
#/sbin/modprobe ip_nat_ftp
#/sbin/modprobe ip_nat_irc

###########################################################################
#
# 3. Configuración de /proc.
#

#
# 3.1 Configuración requerida de proc.
#

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

#
# 3.2 Configuración no-requerida de proc.
#

#echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr

###########################################################################
#
# 4. Configuración de las reglas.
#

######
# 4.1 Tabla Filter.
#

#
# 4.1.1 Establecimiento de políticas.
#

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#
# 4.1.2 Creación de "cadenas de usuario."
#

#
# Crea una cadena para paquetes tcp incorrectos.
#

$IPTABLES -N bad_tcp_packets

#
# Crea cadenas separadas para que los paquetes ICMP, TCP y UDP las atraviesen.
#

$IPTABLES -N allowed
$IPTABLES -N tcp_packets
$IPTABLES -N udp_packets
$IPTABLES -N icmp_packets

#
# 4.1.3 Creación de contenido en las cadenas de usuario
#

#
# Cadena bad_tcp_packets
#

$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \ --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

#
# Cadena de "permitidos".
#

$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

#
# Reglas TCP.
#

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed

#
# Puertos UDP.
#

$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT
if [ $DHCP == "yes" ] ; then
 $IPTABLES -A udp_packets -p UDP -s $DHCP_SERVER --sport 67 \
 --dport 68 -j ACCEPT
fi

#$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 53 -j ACCEPT
#$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 123 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 2074 -j ACCEPT
$IPTABLES -A udp_packets -p UDP -s 0/0 --source-port 4000 -j ACCEPT

#
# En Redes Microsoft te verás inundado por difusiones de paquetes
# (broadcasts). Con las siguientes líneas evitarás que aparezcan en
# los registros.
#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE \
#--destination-port 135:139 -j DROP

#
# Si recibimos peticiones DHCP desde el exterior de nuestra red, nuestros
# registros también resultarán inundados. Con esta regla evitaremos
# que queden registrados.
#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255 \
#--destination-port 67:68 -j DROP

#
# Reglas ICMP.
#

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

#
# 4.1.4 Cadena INPUT.
#

#
# Paquetes TCP incorrectos que no queremos.
#

$IPTABLES -A INPUT -p tcp -j bad_tcp_packets

#
# Reglas para redes especiales que no son parte de Internet.
#

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT

#
# Regla especial para peticiones DHCP desde la red local, que de otra manera
# no son correctamente gestionadas.
#

$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT

#
# Reglas para paquetes entrantes desde Internet.
#

$IPTABLES -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED \ -j ACCEPT
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

#
# Si dispones de una Red Microsoft fuera de tu cortafuegos, también puedes
# verte inundado por multidifusiones (multicasts). Desechamos estos paquetes
# para no desbordar los registros.
#

#$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP

#
# Registra paquetes extraños que no concuerdan con lo anterior.
#

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT INPUT packet died: "

#
# 4.1.5 Cadena FORWARD.
#

#
# Paquetes TCP incorrectos que no queremos.
#

$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

#
# Acepta los paquetes que sí queremos reenviar.
#

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# Registra paquetes extraños que no concuerdan con lo anterior.
#

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "

#
# 4.1.6 Cadena OUTPUT.
#

#
# Paquetes TCP incorrectos que no queremos.
#

$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets

#
# Reglas especiales de la tabla OUTPUT para decidir qué IPs están permitidas.
#

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT

#
# Registra paquetes extraños que no concuerdan con lo anterior.
#

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

######
# 4.2 Tabla Nat.
#

#
# 4.2.1 Establece las políticas.
#

#
# 4.2.2 Crea cadenas definidas por el usuario.
#

#
# 4.2.3 Crea contenido en las cadenas de usuario.
#

#
# 4.2.4 Cadena PREROUTING.
#

#
# 4.2.5 Cadena POSTROUTING.
#

if [ $PPPOE_PMTU == "yes" ] ; then
 $IPTABLES -t nat -A POSTROUTING -p tcp --tcp-flags SYN,RST SYN \
 -j TCPMSS --clamp-mss-to-pmtu
fi
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE

#
# 4.2.6 Cadena OUTPUT.
#

######
# 4.3 Tabla Mangle.
#

#
# 4.3.1 Establece las políticas.
#

#
# 4.3.2 Crea cadenas definidas por el usuario.
#

#
# 4.3.3 Crea contenido en las cadenas de usuario.
#

#
# 4.3.4 Cadena PREROUTING.
#

#
# 4.3.5 Cadena INPUT.
#

#
# 4.3.6 Cadena FORWARD.
#

#
# 4.3.7 Cadena OUTPUT.
#

#
# 4.3.8 Cadena POSTROUTING.
#