Páginas

miércoles, 13 de enero de 2010

Firewall para un host Gentoo

Un cortafuegos para un ordenador GNU-Linux que no ejecuta servicios públicos. Un simple pc o un portátil con movilidad. Consta de 3 scripts fw_host, fw_flush y firewall. Los scripts de inicio de nombre firewall, uno está destinado para usar en Debian y otro para utilizar en Gentoo linux.

Copie el siguiente guion para root chmod 0700 y se llamará /usr/local/bin/fw_host

#!/bin/sh
##/usr/local/bin/fw_host
#iptables firewall script para una estacion de trabajo o portatil

#define variables
ipt="/sbin/iptables"
mod="/sbin/modprobe"
ports="1:1024"
ipall="0.0.0.0/0"
red_A="10.0.0.0/8"
red_B="172.16.0.0/16"
red_D_MULT="224.0.0.0/4"
red_E_RES_NET="240.0.0.0/5"
loopback="127.0.0.0/8"
broad_src="0.0.0.0"
broad_dest="255.255.255.255"

#Flush all rules, delete all chains
$ipt -F
$ipt -X
$ipt -t nat -F
$ipt -t nat -X
$ipt -t mangle -F
$ipt -t mangle -X

#Zero out all counters
$ipt -Z
$ipt -t nat -Z
$ipt -t mangle -Z

#basic set of kernel modules
$mod ip_tables
$mod ip_conntrack
$mod iptable_filter
$mod iptable_nat
$mod iptable_mangle
$mod ipt_LOG
$mod ipt_limit
$mod ipt_state
$mod ipt_MASQUERADE

#opcional para irc y ftp
#$mod ip_conntrack_irc
#$mod ip_conntrack_ftp

#politicas por defecto Incoming es rechazar todo,
#outgoing esta restringido
$ipt -P INPUT DROP
$ipt -P FORWARD DROP
$ipt -P OUTPUT ACCEPT
$ipt -t nat -P OUTPUT ACCEPT
$ipt -t nat -P PREROUTING ACCEPT
$ipt -t nat -P POSTROUTING ACCEPT
$ipt -t mangle -P PREROUTING ACCEPT
$ipt -t mangle -P POSTROUTING ACCEPT

#esta linea es necesaria para la interfaz loopback
#e internos socket-based servicios trabajen correctamente.
$ipt -A INPUT -i lo -j ACCEPT

# rechazar intentos de conexion no iniciados desde el host
$ipt -A INPUT -p tcp --syn -j DROP

#Allow return traffic initiated from the host
$ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Acceptar important ICMP packets
$ipt -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
$ipt -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$ipt -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT

# Cerrar rangos de puertos privilegiados para paquetes que entran
$ipt -A INPUT -s $ipall -p tcp --dport $ports -j DROP
$ipt -A INPUT -s $ipall -p tcp --dport $ports -j DROP

# Cerrar puerto de gestion webmin
$ipt -A INPUT -s $ipall -p tcp --dport 10000 -j DROP

echo "Rechazar pqtes direcciones privadas"

# Rechazar paquetes que digan proceder o ir a direcciones
# privadas de redes A B y C
$ipt -A INPUT -s $red_A -j DROP
$ipt -A OUTPUT -d $red_A -j DROP

$ipt -A INPUT -s $red_B -j DROP
$ipt -A OUTPUT -d $red_B -j DROP

# Rechazar paquetes que digan proceder de la interfaz lo
$ipt -A INPUT -s $loopback -j DROP
$ipt -A OUTPUT -s $loopback -j DROP

# Rechazar pqtes de difusion mal formados
$ipt -A INPUT -s $broad_src -j DROP
$ipt -A INPUT -d $broad_src -j DROP

# Rechazar las direcciones de multidifusion de clase D que
# sean solo ilegales como direcciones de origen. La multi-
# difusion utiliza UDP
$ipt -A INPUT -s $red_D_MULT -j DROP
$ipt -A OUTPUT -s $red_D_MULT -j DROP
$ipt -A INPUT -d $red_D_MULT -j DROP
$ipt -A OUTPUT -d $red_D_MULT -j DROP

# Rechazar direcciones reservadas IP de clase E
$ipt -A INPUT -s $red_E_RES_NET -j DROP

echo "Direcciones reservadas por el IANA"

# Rechazar direcciones definidas como reservadas por el IANA
$ipt -A INPUT -s 1.0.0.0/8 -j DROP
$ipt -A INPUT -s 2.0.0.0/8 -j DROP
$ipt -A INPUT -s 5.0.0.0/8 -j DROP
$ipt -A INPUT -s 7.0.0.0/8 -j DROP
$ipt -A INPUT -s 23.0.0.0/8 -j DROP
$ipt -A INPUT -s 27.0.0.0/8 -j DROP
$ipt -A INPUT -s 31.0.0.0/8 -j DROP
$ipt -A INPUT -s 37.0.0.0/8 -j DROP
$ipt -A INPUT -s 39.0.0.0/8 -j DROP
$ipt -A INPUT -s 41.0.0.0/8 -j DROP
$ipt -A INPUT -s 42.0.0.0/8 -j DROP
$ipt -A INPUT -s 58.0.0.0/8 -j DROP
$ipt -A INPUT -s 60.0.0.0/8 -j DROP

$ipt -A INPUT -s 65.0.0.0/8 -j DROP
$ipt -A INPUT -s 66.0.0.0/8 -j DROP
$ipt -A INPUT -s 67.0.0.0/8 -j DROP
$ipt -A INPUT -s 68.0.0.0/8 -j DROP
$ipt -A INPUT -s 69.0.0.0/8 -j DROP
$ipt -A INPUT -s 70.0.0.0/8 -j DROP
$ipt -A INPUT -s 71.0.0.0/8 -j DROP
$ipt -A INPUT -s 72.0.0.0/8 -j DROP
$ipt -A INPUT -s 73.0.0.0/8 -j DROP
$ipt -A INPUT -s 74.0.0.0/8 -j DROP
$ipt -A INPUT -s 75.0.0.0/8 -j DROP
$ipt -A INPUT -s 76.0.0.0/8 -j DROP
$ipt -A INPUT -s 77.0.0.0/8 -j DROP
$ipt -A INPUT -s 78.0.0.0/8 -j DROP
$ipt -A INPUT -s 79.0.0.0/8 -j DROP

$ipt -A INPUT -s 80.0.0.0/8 -j DROP

$ipt -A INPUT -s 96.0.0.0/8 -j DROP

$ipt -A INPUT -s 112.0.0.0/8 -j DROP
$ipt -A INPUT -s 113.0.0.0/8 -j DROP
$ipt -A INPUT -s 114.0.0.0/8 -j DROP
$ipt -A INPUT -s 115.0.0.0/8 -j DROP
$ipt -A INPUT -s 116.0.0.0/8 -j DROP
$ipt -A INPUT -s 117.0.0.0/8 -j DROP
$ipt -A INPUT -s 118.0.0.0/8 -j DROP
$ipt -A INPUT -s 119.0.0.0/8 -j DROP
$ipt -A INPUT -s 120.0.0.0/8 -j DROP
$ipt -A INPUT -s 121.0.0.0/8 -j DROP
$ipt -A INPUT -s 122.0.0.0/8 -j DROP
$ipt -A INPUT -s 123.0.0.0/8 -j DROP
$ipt -A INPUT -s 124.0.0.0/8 -j DROP
$ipt -A INPUT -s 125.0.0.0/8 -j DROP
$ipt -A INPUT -s 126.0.0.0/8 -j DROP

$ipt -A INPUT -s 217.0.0.0/8 -j DROP
$ipt -A INPUT -s 218.0.0.0/8 -j DROP
$ipt -A INPUT -s 219.0.0.0/8 -j DROP
$ipt -A INPUT -s 220.0.0.0/8 -j DROP

echo " Bien. Verifique con iptables -L -n"
#########FIN#############

# Alerta! - borrar esta regla si añade reglas para permitir
# varios servicios SSH o peer to peer $ipt -A INPUT -p tcp --syn -j DROP

y añadir esta otra:
# drop NEW tcp conexiones que no contengan el SYN-flagged
$ipt -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

por ultimo agregar regla con los puerto adecuados para el protocolo desde el que se permite las peticiones de entrada del cliente.
# para SSH:
$ipt -A INPUT -p tcp --dport 22 --sport 1024:65535 -j ALLOW

#!/bin/sh
##/usr/local/bin/fw_flush
####INICIO SCRIPT FLUSH IPTABLES####
#elimina todas las reglas activas y cadenas,
#y las políticas por defecto se restablece a "ACCEPT"
#Esto es como NO tener ningún servidor de seguridad.
#define variables
ipt="/sbin/iptables"

echo "El firewall esta detenido. Todas las reglas y cadenas
han sido eliminadas, las politicas por defecto en ACCEPT.
Todos los contadores a cero"
#Todos los contadores a cero.
$ipt -Z
$ipt -t nat -Z
$ipt -t mangle -Z

#Flush todas las reglas, borrar todas las cadenas.
$ipt -F
$ipt -X
$ipt -t nat -F
$ipt -t nat -X
$ipt -t mangle -F
$ipt -t mangle -X
####FIN SCRIPT FLUSH IPTABLES####

Es el momento de añadir los siguientes parámetros kernel a /etc/sysctl.conf
net.ipv4.ip_forward = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0

Crearemos un script llamado /etc/init.d/firewall que para Gentoo linux tendrá este aspecto:

#!/bin/sh
##/etc/init.d/firewall
#####INICIO SCRIPT FIREWALL IPTABLES####
#simple start-stop INIT script para iptables
#start Inicia y construye el firewall, stop flush
#stop Todas las normas y politicas restauradas a ACCEPT
#restart reinicia, Ejecuta stop y start comandos.
startfile="/usr/local/bin/fw_host"
stopfile="/usr/local/bin/fw_flush"

depend() {
need net
}

case "$1" in
start)
echo "Iniciando... $startfile: iptables esta en marcha"
/bin/sh $startfile start
;;

stop)
echo "Deteniendo... $stopfile: iptables esta detenido."
/bin/sh $stopfile stop
;;

#status)
#/bin/sh $statusfile status
#;;

restart)
/bin/sh $stopfile stop
echo "El cortafuegos ha sido detenido."
/bin/sh $startfile start
echo "El firewall ha sido reiniciado."
;;

esac
#####FIN SCRIPT FIREWALL IPTABLES####

En gentoo linux agregar este script para que se inicie con el sistema:
# rc-update add firewall default

#######script firewall Debian#########
#!/bin/sh
##/etc.init.d/firewall
# simple start-stop init script for iptables
# start builds the firewall, stop flushes
# all rules and resets default policies to ACCEPT
# restart runs the start and stop commands
# status displays all active rules, and packet and byte counters

startfile="/usr/local/bin/fw_nat"
stopfile="/usr/local/bin/fw_flush"
statusfile="/usr/local/bin/fw_status"

case "$1" in
start)
echo "Starting $startfile: iptables is now starting up"
/bin/sh $startfile start
;;

stop)
echo "Stopping $stopfile: iptables is now stopped, all rules and
chains are flushed, and default policies are set to ACCEPT"
/bin/sh $stopfile stop
;;

status)
/bin/sh $statusfile status
;;

restart)
/bin/sh $stopfile stop
echo "The firewall has stopped."
/bin/sh $startfile start
echo "The firewall has now restarted."
;;
esac
###########FIN SCRIPT#############

Agregue este guion a los niveles de ejecucion que desee. Este comando lo añade a los niveles 2-5 en Debian:
# update-rc.d firewall start 01 2 3 4 5. stop 99 0 1 6.

Para activar sin reiniciar:
# /etc/init.d/firewall start
# /sbin/sysctl -p

Linux es genial!

No hay comentarios:

Publicar un comentario