Posteado por: alejandrolaorden | 21 septiembre, 2006

Firewall Router seguro en linux

Hace un tiempo, haciendo mi router para compartir ONO con mis compañeros de piso, me hice un servidor en debian simplemente con una placa, memoria y un micro de un ordenador antiguo.  sentí la imperiosa necesidad de tener un buen firewall para que mis compañeros:

-Tuvieran un ancho de banda razonable para ver páginas web (configuré un proxy con squid)

-Una conexión segura, con restricción de puertos, usando aplicaciones P2P.

Me sentí atraido por las iptables que es un comandito con el que puedes crear scripts. Mi primer contacto con este tema fue con la publicación de hackxcrack de un mini-firewall que estaba bien y la revista desapareció de los quioscos misteriosamente. Supongo que no había tanta gente para comprarla o por problemas legales.

El script está alojado en esta página, a veces este servidor está caído, así que intentadlo, sé que está cacheado por google. Es de una serie de firewalls con licencia GPL. En este caso he elegido el extremistic que se puede configurar con opciones que deseemos (abrir emule, o tener un servidor web). Me funcionó bastante bien. Hace logs de casi todo, podemos igualmente configurarlo para que no los haga.
Como he visto que no funciona muy bien la página, os remito un mirror del firewall

Un saludo. Es lo más completo y mejor que he visto en internet, espero que os ayude y no estar dando tumbos durante meses como me pasó a mi.

instalacion router:

Instalación de Cortafuegos (Router-Firewall) con Proxys transparentes
(web proxy y pop3 proxy)
Debian GNU/Linux + iptables + squid + p3scan + clamav + spamassassin
Versión 1.1 – Julio de 2007

Consulte el documento original – Puede estar más ctualizado

Copyright (c) 2007 Luis Miguel Armendáriz
Está permitido copiar, distribuir y/o modificar los documentos bajo los términos de la GNU Free Documentation License, Version 1.2
Para obtener una copia de la licencia “GNU Free Documentation License” visite http://www.fsf.org/licenses/fdl.txt
Índice

* Resumen
* Notas sobre el documento
* Instalación del sistema base
o Activación de framebuffer en consola (OPCIONAL)
o Configuración de la red
o Actualización del sistema
* Configuración de ssh
* Instalación de la pasarela -gateway- con enrutador y cortafuegos
* Configuración de proxy web transparente (Squid)
* Configuración de antivirus (ClamAV)
* Configuración de SpamPd (Usa SpamAssasin)
* Configuración de proxy POP3 (p3scan)
* Algunas comprobaciones
* BONO EXTRA – Configuración de OpenVPN (SIN TERMINAR)
* Postinstalación del sistema

Resumen
El objetivo del documento es conseguir instalar un servidor que haga las veces de enrutador, cortafuegos, pasarela y proxy transparente de web y POP3, entre una red local (LAN) e Internet.
Es decir que sin tocar nada en los equipos clientes de la red local, podamos disponer de un cortafuegos que ademas filtre el tráfico http y analice la descarga de correo (POP3) en busca de spam y virus.

Todos los manuales que he encontrado para filtrar spam y antivirus se basan en instalar un servidor de correo y filtrar el protocolo SMTP. Eso te obliga a tener cuentas de correo, usuarios… Mi intención era únicamente analizar el tráfico en busca de virus y spam en los correos de los clientes, independientemente de cual sea su servidor (direcciones personales, empresariales…).
La solución es p3scan, un proxy transparente de POP3. Pero ni siquiera en su web he encontrado un manual de instalación.

El documento que estas leyendo pretende ser esa guía que yo no encontré que permita instalar y configurar un proxy transparente de POP3 integrado en un cortafuegos e integrado, por el mismo precio, con un proxy transparente de web y redireccionamientos NAT.

Para ello vamos a utilizar Debian GNU/Linux con, principalmente, iptables, squid, p3scan, clamav y spampd (SpamAssassin).

Notas sobre el documento
La mayoría de los ficheros de configuración se muestran incompletos. Generalmente las lineas aquí mostradas son únicamente las que ha sido necesario modificar.

Las versiones de los paquetes Debian utilizadas al realizar este documento han sido:

* Debian Etch RC1 (2006-11-13)
* kernel linux 2.6.18-3-686
* iptables 1.3.6.0debian1-5
* squid 2.6.5-2
* p3scan 2.1-2
* clamav y clamav-daemon 0.88.7-1
* spampd 2.30-15
* spamassassin 3.1.7-1
* spamc 3.1.7-1

Instalación del sistema base
Vamos a utilizar un CD de netinstall de Debian Etch RC1 (2006-11-13) que nos permitirá de forma facil y sencilla instalar un sistema básico.
Recordemos que puesto que vamos a instalar un cortafuegos, es mejor no instalar paquetes innecesarios.

Realizamos una instalación minima arrancando desde el CD (sin utilizar repositorios en red) instalando solo el sistema base.

Generamos tres particiones:

* una para el sistema
* otra para swap
* otra de respaldo en /copia
en esta guardamos una imagen del sistema instalado datos de configuración que queramos conservar y copias de seguridad.

Una vez instalado el sistema desde el CD, configuramos algunos detalles.

Activación de framebuffer en consola (OPCIONAL)
# vi /boot/grub/menu.lst

(…)
kernel        /boot/vmlinuz-2.6.18-3-686 root=/dev/hda3 ro vga=791
(…)

Configuración de la red
Configuramos las interfaces.
# vi /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet dhcp
### Interfaz EXTERNA
iface eth0 inet static
address 280.280.280.280 # Aquí debe ir la IP pública del equipo
# Esta es una IP ficticia. De hecho no es una IP válida.
# Es la que usaremos como ejemplo en el documento
netmask 255.255.255.0
gateway 280.280.280.1
up route add default gw 280.280.280.1

### Interfaz INTERNA
iface eth1 inet static
address 192.168.0.10
netmask 255.255.255.0

auto eth0
auto eth1

Configuramos la resolucion DNS.
Tengo disponible una lista de servidores de DNS. Aquí pongo un par de servidores de Telefónica de ejemplo.
# vi /etc/resolv.conf

#Telefonica
nameserver 80.58.0.33
nameserver 80.58.32.97

Actualización del sistema
Configuramos los repositorios utilizando el mirror de Francia, ya que el de España sigue dando problemas de vez en cuando (y van un montón de años…)
# vi /etc/apt/sources.list

#
# deb cdrom:[Debian GNU/Linux testing _Etch_ – Official Snapshot i386 Binary-1 (20061111)]/ etch main

#deb cdrom:[Debian GNU/Linux testing _Etch_ – Official Snapshot i386 Binary-1 (20061111)]/ etch main

deb http://ftp.fr.debian.org/debian/ etch main
deb-src http://ftp.fr.debian.org/debian/ etch main

deb http://security.debian.org/ etch/updates main
deb-src http://security.debian.org/ etch/updates main

Insertamos la clave del repositorio
# gpg –keyserver keyring.debian.org –recv-key 6070d3a1
# gpg –armor –export 6070d3a1 | apt-key add –

Actualizamos el sistema
# aptitude update
# aptitude upgrade
# aptitude dist-upgrade

Instalamos algunos paquetes utiles y/o necesarios
# aptitude install less vim lynx lsof telnet tofrodos
# aptitude install openssh-server nmap iptables
… y el entorno grafico si lo deseamos (NO SE RECOMIENDA)
# aptitude install xserver-xorg xserver-common xfonts-base gnome

Quitamos servicios innecesarios
(El servicio portmap puede ser necesario matarlo con kill -9)
# /etc/init.d/portmap stop
# update-rc.d -f portmap remove
# update-inetd –disable chargen
# update-inetd –disable ident
# update-inetd –disable discard
Opcionalmente y según lo que hayamos instalado (RECOMENDADO)
# /etc/init.d/cups stop
# update-rc.d -f cups remove
# update-rc.d -f gdm remove

Servicios a quitar si no se ha realizado la instalación básica indicada
# /etc/init.d/lpd stop
# update-rc.d -f lpd remove
# /etc/init.d/nfs-common stop
# update-rc.d -f nfs-common remove
# /etc/init.d/pcmcia stop
# update-rc.d -f pcmcia remove
# /etc/init.d/ppp stop
# update-rc.d -f ppp remove
# /etc/init.d/exim4 stop
# update-rc.d -f exim4 remove
# /etc/init.d/bittorrent stop
# update-rc.d -f bittorrent remove
# update-rc.d -f ntpdate remove
# update-inetd –disable time
# update-inetd –disable daytime
# update-inetd –disable echo

Configuración de ssh
Configuramos ssh para cambiar el puerto, reducir el tiempo de login, denegar conexiones de root, autorizar el acceso solo a ciertos usuarios y con fichero de clave privada, etc.

Instalación de la pasarela -gateway- con enrutador y cortafuegos
Copiamos los archivos para gestionar iptables en el directorio /etc/network/iptables.
# mkdir /etc/network/iptables
# cd /etc/network/iptables
# wget http://www.guimi.net/datos/tec-docs/firewall/guimi_iptables.tgz
# tar xzf guimi_iptables.tgz

Tendremos los siguientes ficheros:

* ipflush.sh anula cortafuegos y enrutador. Es el script que se ejecuta al hacer “iptables stop”.
* ipgw_flush.sh activa el enrutador sin cortafuegos (permitiendo todo el tráfico). MUY PELIGROSO. Utilizar solo en entornos de prueba protegidos y controlados.
* iprules.sh activa el enrutador y cortafuegos. Es el más importante y al que más tiempo habrá que dedicar para adaptarlo a nuestras necesidades. Es el script que se ejecuta al hacer “iptables start”.
* iptables utilizado para des/activar enrutador y cortafuegos.
* iptables-check muestra las reglas de iptables activas en el sistema.
* iptables.flush contiene la salida de iptables-save > iptables.flush tras ejecutar ipflush.sh

A continuación se puede ver el contenido de iprules.sh que nos permite:

* generar un cortafuegos con todas las acciones por omisión a “DROP” (si un paquete no se ha aceptado explícitamente, se descarta)
* hacer DNAT para un par de servidores FTP y web (redirige peticiones FTP y web de la dirección pública a servidores internos)
* hacer NAT de salida para la intranet (los equipos de la LAN pueden navegar con la ip pública del servidor)
* utilizar un par de proxys transparentes de web y POP3 redireccionando las peticiones de los equipos clientes (cuando un cliente pretende navegar o leer un correo el servidor “secuestra” la conexión y la analiza antes de permitirla)

#!/bin/bash
#
# Por Guimi 2007/01 – http://www.guimi.net
#
# Para guardar las reglas
#+ iptables-save > reglas
#+ iptables-restore < reglas
#

# Miramos si tenemos un parametro en linea de comando
if [ -n “$1” ] && [ “$1” = “q” ]
then
QUIET=”1″
else
QUIET=”0″
fi

# Registramos el inicio del firewall
#FECHA=$(date +”%C%y-%m-%d %H:%M”)
#echo $FECHA
#/usr/bin/logger -p kern.notice  -t NETFILTER  \
#             “====== Iniciado Cortafuegos: $FECHA =========”

if [ $QUIET = “0” ]; then
echo ”    Realizado por Guimi (http://www.guimi.net)”
echo ”    ——————————————”
fi

# PARAMETRIZACION DEL SCRIPT
##########################################
### Definimos constantes para usar en el
###+ script
if [ $QUIET = “0” ]; then
echo ”    Cargando parametros…”
fi

# Binario de iptables
IPTABLES=/sbin/iptables

# INTERFACES
# eth0 – conectado a internet con IP FIJA
EXT_IF=eth0
EXT_IP=280.280.280.280
# eth1 – conectado a LAN
LAN_IF=eth1
LAN_IP=192.168.0.1
LAN_RED=192.168.0.0/24
# lo – interfaz de loopback
LOO_RED=127.0.0.0/8
# cualquier red
ANY_RED=0.0.0.0/0

# MAQUINAS INTERNAS
IP_SERVIDOR_FTP=192.168.0.2

if [ $QUIET = “0” ]; then
echo ”    Cargando modulos…”
fi
##########################################
### Nos aseguramos que tenemos cargados
###+ los modulos necesarios
modprobe ip_conntrack_irc
modprobe ip_conntrack_ftp
modprobe ip_nat_irc
modprobe ip_nat_ftp

if [ $QUIET = “0” ]; then
echo ”    Limpiando FW…”
fi
##########################################
### Limpiamos la configuracion existente

# Limpiamos (flush) las reglas
$IPTABLES -F
# Borramos ‘cadenas’ de usuario
$IPTABLES -X
# Ponemos a cero paquetes y contadores
$IPTABLES -Z
# Limpiamos las reglas de NAT
$IPTABLES -t nat -F
# Borramos ‘cadenas’ de usuario de NAT
$IPTABLES -t nat -X

if [ $QUIET = “0” ]; then
echo ”    Estableciendo politicas…”
fi
##########################################
### Establecemos las politicas por omision
###+ de las ‘cadenas’

# Por omision descartamos los paquetes
$IPTABLES -P INPUT   DROP
$IPTABLES -P OUTPUT  DROP
$IPTABLES -P FORWARD DROP
# PREROUTING – NAT sobre la IP destino: normalmente desde inet hacia LAN
# POSTROUTING – NAT sobre la IP origen: normalmente desde LAN hacia inet
$IPTABLES -t nat -P PREROUTING   DROP
$IPTABLES -t nat -P POSTROUTING  DROP

# Relajamos la politica de salida
#+ Dejamos salir paquetes de LAN_IP por LAN_IF
$IPTABLES -A OUTPUT -o $LAN_IF -s $LAN_IP -j ACCEPT
#+ Dejamos salir paquetes de EXT_IP por EXT_IF
$IPTABLES -A OUTPUT -o $EXT_IF -s $EXT_IP -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    -> Denegacion de redes invalidas…”
fi
##########################################
# No admitimos desde el exterior redes locales (RFC 1918)
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 192.168.0.0/16  -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 10.0.0.0/8      -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 172.16.0.0/12   -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 224.0.0.0/4     -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 240.0.0.0/5     -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s $LOO_RED        -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 0.0.0.0/8       -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 169.254.0.0/16  -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s 255.255.255.255 -j DROP
$IPTABLES -t nat -A PREROUTING -i $EXT_IF -s $EXT_IP         -j DROP
# Desde el interior solo admitimos nuestra red LAN
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s ! $LAN_RED      -j DROP

if [ $QUIET = “0” ]; then
echo ”    -> Denegacion de broadcast de NetBIOS…”
fi
##########################################
# Bloquear paquetes broadcast de NetBios salientes
iptables -A FORWARD -p tcp –sport 137:139 -o $EXT_IF -j DROP
iptables -A FORWARD -p udp –sport 137:139 -o $EXT_IF -j DROP
iptables -A OUTPUT  -p tcp –sport 137:139 -o $EXT_IF -j DROP
iptables -A OUTPUT  -p udp –sport 137:139 -o $EXT_IF -j DROP

if [ $QUIET = “0” ]; then
echo ”    Activando NAT…”
fi
##########################################
# Activamos el bit de forward
echo 1 > /proc/sys/net/ipv4/ip_forward
# Enmascaramos la salida de la LAN
$IPTABLES -t nat -A POSTROUTING -s $LAN_RED -o $EXT_IF -j MASQUERADE

if [ $QUIET = “0” ]; then
echo ”    Accesos a la maquina local permitidos…”
fi
##########################################
### Permitimos ciertos accesos a la maquina

if [ $QUIET = “0” ]; then
echo ”    -> loopback…”
fi
# Permitimos todas las conexiones del interfaz loopback
#$IPTABLES -A INPUT  -i lo -j ACCEPT
#$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT  -i lo -s $LOO_RED -d $LOO_RED -j ACCEPT
$IPTABLES -A OUTPUT -o lo -s $LOO_RED -d $LOO_RED -j ACCEPT
# Permitimos el PostEnrutado de paquetes enviados localmente
$IPTABLES -t nat -A POSTROUTING -o lo -s $LOO_RED -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    -> LAN…”
fi
# Damos acceso desde la red local
$IPTABLES -A INPUT  -s $LAN_RED -i $LAN_IF -j ACCEPT
$IPTABLES -A OUTPUT -d $LAN_RED -o $LAN_IF -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    -> DNS…”
fi
# Aceptamos conexiones DNS
$IPTABLES -A INPUT  -s $ANY_RED -i $EXT_IF -p udp -m udp –sport 53 –dport 1024:65535 -j ACCEPT
$IPTABLES -A OUTPUT -d $ANY_RED -o $EXT_IF -p udp -m udp –dport 53 –sport 1024:65535 -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    -> ntpd…”
fi
# Aceptamos conexiones ntpd
$IPTABLES -A INPUT  -p udp -m udp –dport 123 -i $EXT_IF -s $ANY_RED -j ACCEPT
$IPTABLES -A OUTPUT -p udp -m udp –sport 123                        -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    -> icmp…”
fi
# Permitimos paquetes ICMP (ping, traceroute…)
#+ con limites para evitar ataques de DoS
# Aceptamos ping y pong
$IPTABLES -A INPUT   -p icmp –icmp-type echo-request  -m limit –limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT  -p icmp –icmp-type echo-request  -m limit –limit 2/s -j ACCEPT
$IPTABLES -A INPUT   -p icmp –icmp-type echo-reply    -m limit –limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT  -p icmp –icmp-type echo-reply    -m limit –limit 2/s -j ACCEPT
# Aceptamos redirecciones
$IPTABLES -A INPUT   -p icmp –icmp-type redirect      -m limit –limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT  -p icmp –icmp-type redirect      -m limit –limit 2/s -j ACCEPT
# Aceptamos tiempo excedido
$IPTABLES -A INPUT   -p icmp –icmp-type time-exceeded -m limit –limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT  -p icmp –icmp-type time-exceeded -m limit –limit 2/s -j ACCEPT
# Aceptamos destino inalcanzable
$IPTABLES -A INPUT   -p icmp –icmp-type destination-unreachable -m limit –limit 2/s -j ACCEPT
$IPTABLES -A OUTPUT  -p icmp –icmp-type destination-unreachable -m limit –limit 2/s -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    -> ssh…”
fi
# Abrimos el puerto xxxx para ssh
#$IPTABLES -A INPUT  -p tcp -i $EXT_IF -s $ANY_RED -m tcp –dport xxxx –sport 1024:65535 -j ACCEPT
$IPTABLES -A INPUT  -p tcp -s $ANY_RED -m tcp –dport xxxx –sport 1024:65535 -m state –state NEW -j LOG –log-prefix “[FW – SSH] ”
$IPTABLES -A INPUT  -p tcp -s $ANY_RED -m tcp –dport xxxx –sport 1024:65535 -j ACCEPT
# …y conexiones salientes relacionadas
$IPTABLES -A OUTPUT -p tcp -m tcp –sport xxxx -m state –state RELATED,ESTABLISHED -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    Redirecciones…”
fi
##########################################
### Generamos redireccionamientos
###+ transparentes para el resto de maquinas

if [ $QUIET = “0” ]; then
echo ”    -> Proxy web transparente (Squid)…”
fi
#+ Con la redireccion activa (primera linea)
#+  no se llega a la segunda linea
#+ Para bloquear todo acceso a la web comentar
#+  solo la primera linea
#+ Para anular el proxy comentar las dos reglas
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s $LAN_RED -p tcp –dport 80 -j REDIRECT –to-port 3128
$IPTABLES -A FORWARD -i $LAN_IF -p tcp –dport 80 -j DROP

if [ $QUIET = “0” ]; then
echo ”    -> Filtro de correo (P3Scan)…”
fi
#+ Con la redireccion activa (primera linea)
#+  no se llega a la segunda linea
#+ Para bloquear todo acceso a POP comentar
#+  solo la primera linea
#+ Para anular el filtrado comentar las dos reglas
$IPTABLES -t nat -A PREROUTING -i $LAN_IF -s $LAN_RED -p tcp –dport 110 -j REDIRECT –to-port 8110
$IPTABLES -A FORWARD -i $LAN_IF -p tcp –dport 110 -j DROP
###$IPTABLES -t nat -A OUTPUT -p tcp –dport 110 -m owner –owner-id p3scan -j ACCEPT
###$IPTABLES -t nat -A OUTPUT -p tcp –dport 110 -j REDIRECT –to-port 8110

if [ $QUIET = “0” ]; then
echo ”    -> DNAT (21 y 20)…”
fi
# Redirigimos “$EXT_IP”:2220-1 a “$IP_SERVIDOR_FTP”:20-1
###$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp –dport 21 -j LOG –log-prefix “[FW – FTP] ”
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp –dport 220 -j DNAT –to “$IP_SERVIDOR_FTP”:20
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -p tcp –dport 221 -j DNAT –to “$IP_SERVIDOR_FTP”:21
# …y conexiones salientes relacionadas (ftp pasivo)
$IPTABLES -t nat -A PREROUTING  -m state –state RELATED,ESTABLISHED -j ACCEPT
# Permitimos postruteos a “$IP_SERVIDOR_FTP”:20-1
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -d $IP_SERVIDOR_FTP -p tcp –dport 20 -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -d $IP_SERVIDOR_FTP -p tcp –dport 21 -j ACCEPT
# Permitimos reenvios desde el exterior a “$IP_SERVIDOR_FTP”:20-1
$IPTABLES -A FORWARD -i $EXT_IF -d $IP_SERVIDOR_FTP -p tcp –dport 20 -j ACCEPT
$IPTABLES -A FORWARD -i $EXT_IF -d $IP_SERVIDOR_FTP -p tcp –dport 21 -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    Reenvios…”
fi
##########################################
### Aceptamos algunos reenvios

if [ $QUIET = “0” ]; then
echo ”    -> icmp…”
fi
# Permitimos paquetes ICMP (ping, traceroute…)
#+ con limites para evitar ataques de DoS
# Aceptamos ping y pong
$IPTABLES -A FORWARD -p icmp –icmp-type echo-request  -m limit –limit 2/s -j ACCEPT
$IPTABLES -A FORWARD -p icmp –icmp-type echo-reply    -m limit –limit 2/s -j ACCEPT
# Aceptamos redirecciones
$IPTABLES -A FORWARD -p icmp –icmp-type redirect      -m limit –limit 2/s -j ACCEPT
# Aceptamos tiempo excedido
$IPTABLES -A FORWARD -p icmp –icmp-type time-exceeded -m limit –limit 2/s -j ACCEPT
# Aceptamos destino inalcanzable
$IPTABLES -A FORWARD -p icmp –icmp-type destination-unreachable -m limit –limit 2/s -j ACCEPT
# Aceptamos todas en LAN_IF
$IPTABLES -t nat -A PREROUTING  -i $LAN_IF -p icmp –icmp-type any -m limit –limit 2/s -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -p icmp –icmp-type any -m limit –limit 2/s -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    Salida general…”
fi
##########################################
### Aceptamos conexiones salientes

# Permitimos cualquier salida tcp desde la propia maquina
$IPTABLES -A OUTPUT -o $EXT_IF -p tcp -m state –state NEW,ESTABLISHED,RELATED -j ACCEPT
# …y conexiones entrantes relacionadas
$IPTABLES -A INPUT  -i $EXT_IF -p tcp -m state –state ESTABLISHED,RELATED     -j ACCEPT

# Permitimos el reenvio de paquetes enviados desde la LAN
$IPTABLES -A FORWARD -i $LAN_IF -j ACCEPT
# …y conexiones salientes relacionadas
$IPTABLES -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde la LAN
$IPTABLES -t nat -A PREROUTING  -i $LAN_IF -j ACCEPT
# …y conexiones salientes relacionadas
$IPTABLES -t nat -A PREROUTING  -m state –state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde inet hacia la IP publica
$IPTABLES -t nat -A PREROUTING  -i $EXT_IF -d $EXT_IP -j ACCEPT
# …y conexiones salientes relacionadas
$IPTABLES -t nat -A PREROUTING  -m state –state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el NAT de paquetes enviados desde la IP publica hacia inet
$IPTABLES -t nat -A POSTROUTING -o $EXT_IF -s $EXT_IP -j ACCEPT
# …y conexiones salientes relacionadas
$IPTABLES -t nat -A POSTROUTING -m state –state RELATED,ESTABLISHED -j ACCEPT

# Permitimos el PostEnrutado de paquetes enviados localmente
$IPTABLES -t nat -A POSTROUTING -o $LAN_IF -s $LAN_RED -j ACCEPT

if [ $QUIET = “0” ]; then
echo ”    Cerrando puertos restringidos…”
fi
##########################################
### Puertos restringidos (telnet, ftp, imap, pop3, etc.)
###+ Reiterativo: para pruebas
$IPTABLES -A INPUT -p tcp –dport 1:1024 -j DROP
$IPTABLES -A INPUT -p udp –dport 1:1024 -j DROP

###echo ”    ACTIVADO DEBUG…”
##########################################
### Reglas utilizadas en debug para detectar
#+ paquetes no tratados todavia
#+ -j LOG –log-prefix “–PR> ”
###$IPTABLES -t nat -A PREROUTING  -j LOG –log-prefix “[FW – PR] ”
###$IPTABLES -t nat -A POSTROUTING -j LOG –log-prefix “[FW – PO] ”
###$IPTABLES -A FORWARD -j LOG –log-prefix “[FW – FW] ”
###$IPTABLES -A INPUT  -j LOG –log-prefix “[FW – IN] ”
###$IPTABLES -A OUTPUT -j LOG –log-prefix “[FW – OU] ”

if [ $QUIET = “0” ]; then
echo ”    Configuracion FW terminada.”
echo “”
echo ”    A continuacion podria desear:”
echo ”     – verificar reglas: iptables -nvL && iptables -nvL -t nat”
echo ”     – guardar reglas:   iptables-save > reglas”
echo ”     – restaurar reglas: iptables-restore < reglas”
fi
##########################################
exit 0

Para dejar iptables perfectamente configurado aplicamos y guardamos las reglas del cortafuegos
# cd /etc/network/iptables
# ./iprules.sh
# iptables-save > iptables.rc

Configuramos la red para que active y desactive la pasarela cuando se levante o se tumbe la tarjeta de red conectada con internet.
# vi /etc/network/interfaces

(…)
### Interfaz EXTERNA
iface eth0 inet static
(…)
pre-up /etc/network/iptables/iptables start
post-down /etc/network/iptables/iptables stop

### Interfaz INTERNA
(…)

Si lo deseamos podemos filtrar tr´fico p2p.

Configuración de proxy web transparente (Squid)
Para que funcione debe existir una redirección del puerto 80 al squid.
Esa redirección la hemos realizado con el fichero iprules.sh.
Nótese que en el ejemplo solo se utiliza el proxy para las conexiones al puerto 80, es decir, las conexiones de https (puerto 443) se reenvían directamente.

# aptitude install squid
# vi /etc/squid/squid.conf

http_port 3128 transparent
#                                        proxy  icp
#          hostname             type     port   port  options
#          ——————– ——– —– —–  ———–
#cache_peer 1.2.3.4             parent   8080  0      no-query
cache_dir aufs /var/spool/squid 600 16 256
visible_hostname mi_pasarela
acl our_networks src 192.168.0.0/16
http_access allow our_networks
#nonhierarchical_direct off

Reiniciamos el servicio
# /etc/init.d/squid restart

Si se desea hacer pruebas, un modo sencillo es comentar en /etc/squid/squid.conf la linea que dice http_access allow our_networks y probar a navegar por la web desde la intranet.
El navegador debería mostrarnos una página generada por Squid indicándonos que no tenemos permiso para navegar.

Este manual nos permite añadir análisis antivirus a squid (otra versión).

Configuración de antivirus (ClamAV)
Realizamos una instalación manteniendo la configuración por omisión
# aptitude install clamav clamav-daemon

Comprobamos los permisos de la base de datos y los logs
# ls -al /var/lib/clamav/

total 8216
drwxr-xr-x  2 clamav clamav    4096 2006-12-30 09:55 .
drwxr-xr-x 45 root   root      4096 2006-12-29 12:29 ..
-rw-r–r–  1 clamav clamav 1460245 2006-12-30 09:55 daily.cvd
-rw-r–r–  1 clamav clamav 6924820 2006-12-29 12:30 main.cvd

# ls -al /var/log/clamav/

total 28
drwxr-xr-x  2 clamav clamav  4096 2006-12-29 12:30 .
drwxr-xr-x 12 root   root    4096 2006-12-30 10:02 ..
-rw-r—–  1 clamav adm    12287 2006-12-30 11:25 clamav.log
-rw-r—–  1 clamav adm     5233 2006-12-30 11:29 freshclam.log

Configuramos el demonio clamav (este ejemplo es para una máquina con pocos recursos):
# vi /etc/clamav/clamd.conf


#ArchiveMaxFiles 1000
ArchiveMaxFiles 100
#ArchiveMaxFileSize 10M
ArchiveMaxFileSize 2M
#ArchiveMaxCompressionRatio 250
ArchiveMaxCompressionRatio 50
ArchiveLimitMemoryUsage false
ArchiveBlockEncrypted false
#MaxDirectoryRecursion 15
MaxDirectoryRecursion 6
FollowDirectorySymlinks false
FollowFileSymlinks false
#ReadTimeout 180
ReadTimeout 60
#MaxThreads 12
MaxThreads 10
#MaxConnectionQueueLength 15
MaxConnectionQueueLength 8
#StreamMaxLength 10M
StreamMaxLength 7M

MailFollowURLs false

Probamos el antivirus
Para hacer pruebas utilizamos el test eicar de eicar.org.
El test eicar es una firma utilizada para probar los antivirus. No hace absolutamente nada pero todos los antivirus la reconocen.
Podemos crear un fichero de texto detectable haciendo que contenga unicamente la siguiente linea:

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Tambien podemos utilizar estos ficheros con la firma eicar.

Por ejemplo, utilizando el usuario ya visto (servi3):
$ cd /home/servi3
$ wget http://www.guimi.net/datos/tec-docs/firewall/guimi_eicar.tgz
$ tar xzf guimi_eicar.tgz

$ clamdscan /home/servi3/eicar/

/home/servi3/eicar//eicar.com.txt: Eicar-Test-Signature FOUND
/home/servi3/eicar//eicar.com: Eicar-Test-Signature FOUND
/home/servi3/eicar//eicar_com.zip: Eicar-Test-Signature FOUND

———– SCAN SUMMARY ———–
Infected files: 3
Time: 0.025 sec (0 m 0 s)

Nota: en equipos en que no se dispone del demonio de clamav se puede utilizar la herramienta clamscan, pero es tremendamente más lenta:
$ clamscan /home/servi3/eicar/

/home/servi3/eicar/eicar.com.txt: Eicar-Test-Signature FOUND
/home/servi3/eicar/eicar.com: Eicar-Test-Signature FOUND
/home/servi3/eicar/eicar_com.zip: Eicar-Test-Signature FOUND

———– SCAN SUMMARY ———–
Known viruses: 235757
Engine version: 0.90.1
Scanned directories: 1
Scanned files: 3
Infected files: 3
Data scanned: 0.00 MB
Time: 51.074 sec (0 m 51 s)

Configuración de SpamPd (Usa SpamAssasin)
SpamPD es un filtro contra spam que utiliza spamassasin. Configuraremos p3scan para que utilice el cliente spamc.
# aptitude install spampd

Configuramos spampd para que utilice el mismo usuario del antivirus.
Al usar un usuario para todo lo que tiene que ver con correo (p3scan, clamav, spampd) simplificamos los permisos
# vi /etc/default/spampd

USERID=clamav
GRPID=clamav

Activamos SA
# vi /etc/default/spamassassin

ENABLED=1

Configuramos SA
# vi /etc/spamassassin/init.pre

# URIDNSBL – look up URLs found in the message against several DNS
# blocklists.
#
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL

# Hashcash – perform hashcash verification.
#
loadplugin Mail::SpamAssassin::Plugin::Hashcash

# SPF – perform SPF verification.
#
loadplugin Mail::SpamAssassin::Plugin::SPF

### Plugin para comprobar el lenguaje del mensaje
loadplugin Mail::SpamAssassin::Plugin::TextCat

# vi /etc/spamassassin/local.cf

### Indicamos en la cabecera del mensaje que es probable spam
rewrite_header Subject *****SPAM*****
### El mensaje original lo incluimos como un anexo en MIME
report_safe 1
### Marcamos el umbral de puntuacion para que un mensaje sea
###+ considerado spam
required_score 4.0
### Utilizamos el filtro bayesiano
use_bayes 1
### Activamos el autoaprendizaje del filtro bayesiano
bayes_auto_learn 1
###
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
### Aceptamos mensajes en frances y espanyol
###+ El resto puntua como posible spam
ok_languages            fr es
### Aceptamos el juego de caracteres occidental
###+ El resto puntua como posible spam
ok_locales              en
### Anyadimos cabeceras a los mensajes
### Solo a los que son spam
add_header              spam Flag _YESNOCAPS_
### A todos
add_header              all Status _YESNO_, score=_SCORE_ required=_REQD_ autolearn=_AUTOLEARN_ version=_VERSION_ bayes=_BAYES_
add_header              all Level _STARS(*)_
add_header              all Checker-Version SpamAssassin _VERSION_ (_SUBVERSION_) on _HOSTNAME_
### Cambiamos el valor de algunas reglas
score UNWANTED_LANGUAGE_BODY 3.7
score FROM_ENDS_IN_NUMS      1.88
score FROM_STARTS_WITH_NUMS  1.337
### Generamos unas cuantas listas blancas
whitelist_from_rcvd *@guimi.net
whitelist_from mi_amigo@guimi.net

Preparamos un script que mantenga las reglas de SA actualizadas
# vi /root/bin/actualiza_sa.sh

#!/bin/bash
#
# Script para actualizar las reglas de SpamAssassin
#
# Guimi – http://guimi.net
# 2007-01
#

# Cambiamos al directorio adecuado
cd /etc/spamassassin/

# Actualizamos las reglas
wget http://mywebpages.comcast.net/mkettler/sa/antidrug.cf
wget http://www.nospamtoday.com/download/mime_validate.cf
wget http://www.rulesemporium.com/rules/70_sare_adult.cf
wget http://www.rulesemporium.com/rules/70_sare_bayes_poison_nxm.cf
wget http://www.rulesemporium.com/rules/70_sare_evilnum0.cf
wget http://www.rulesemporium.com/rules/70_sare_genlsubj0.cf
wget http://www.rulesemporium.com/rules/70_sare_genlsubj_eng.cf
wget http://www.rulesemporium.com/rules/70_sare_header0.cf
wget http://www.rulesemporium.com/rules/70_sare_header_eng.cf
wget http://www.rulesemporium.com/rules/70_sare_html0.cf
wget http://www.rulesemporium.com/rules/70_sare_html_eng.cf
wget http://www.rulesemporium.com/rules/70_sare_obfu0.cf
wget http://www.rulesemporium.com/rules/70_sare_oem.cf
wget http://www.rulesemporium.com/rules/70_sare_random.cf
wget http://www.rulesemporium.com/rules/70_sare_specific.cf
wget http://www.rulesemporium.com/rules/70_sare_spoof.cf
wget http://www.rulesemporium.com/rules/70_sare_stocks.cf
wget http://www.rulesemporium.com/rules/70_sare_unsub.cf
wget http://www.rulesemporium.com/rules/70_sare_uri0.cf
wget http://www.rulesemporium.com/rules/72_sare_bml_post25x.cf
wget http://www.rulesemporium.com/rules/72_sare_redirect_post3.0.0.cf
wget http://www.rulesemporium.com/rules/88_FVGT_body.cf
wget http://www.rulesemporium.com/rules/88_FVGT_headers.cf
wget http://www.rulesemporium.com/rules/88_FVGT_rawbody.cf
wget http://www.rulesemporium.com/rules/88_FVGT_subject.cf
wget http://www.rulesemporium.com/rules/88_FVGT_uri.cf
wget http://www.rulesemporium.com/rules/99_FVGT_DomainDigits.cf
wget http://www.rulesemporium.com/rules/99_FVGT_meta.cf
wget http://www.rulesemporium.com/rules/99_FVGT_Tripwire.cf
wget http://www.rulesemporium.com/rules/99_sare_fraud_post25x.cf
wget http://www.stearns.org/sa-blacklist/random.current.cf
wget http://www.timj.co.uk/linux/bogus-virus-warnings.cf
wget http://www.yackley.org/sa-rules/evilnumbers.cf

# Reiniciamos los servicios
/etc/init.d/spamassassin restart
/etc/init.d/spampd restart

Programamos el sistema para que actualice al menos una vez a la semana (NO más de una vez al día para no contravenir la política de descarga de SARE)
# crontab -e

#m  h  dom mon dow   command
00 05    *   *   1   /root/bin/actualiza-sa.sh

Configuración de proxy POP3 (p3scan)
# aptitude install p3scan

Utilizamos el mensaje de virus en español
# cd /etc/p3scan/
# rm p3scan.mail
# ln -s p3scan-sp.mail p3scan.mail

Configuramos p3scan
# vi /etc/p3scan/p3scan.conf

targetip = 0.0.0.0
targetport = 8110
user = clamav
scannertype = basic
scanner = /usr/bin/clamdscan –no-summary
virusregexp = .*: (.*) FOUND
demime
checkspam
spamcheck = /usr/bin/spamc
subject = [Virus – mi_pasarela] Un mensaje enviado para usted contenia virus:

Hacemos todos los usuarios de los tres grupos aunque en realidad solo utilizamos el usuario clamav
# vi /etc/group

clamav:x:110:spamc,spampd,p3scan
p3scan:x:111:clamav,spamc,spampd
spampd:x:112:clamav,spamc,p3scan

Damos permisos al usuario
# chown clamav:clamav -R /var/spool/p3scan
# chown clamav:clamav -R /var/run/p3scan
# /etc/init.d/p3scan restart
# /etc/init.d/spamassassin restart
# /etc/init.d/spampd restart

Si no arranca p3scan automaticamente:
update-rc.d p3scan defaults

Algunas comprobaciones
# lsof -i | grep LISTEN

p3scan  xxxx clamav    3u  IPv4   xxxx       TCP *:8110 (LISTEN)
sshd    xxxx   root    3u  IPv6   xxxx       TCP *:xxxx (LISTEN)
squid   xxxx  proxy   13u  IPv4   xxxx       TCP *:3128 (LISTEN)
spampd  xxxx clamav    5u  IPv4  xxxxx       TCP localhost:10025 (LISTEN)
spampd  xxxx clamav    5u  IPv4  xxxxx       TCP localhost:10025 (LISTEN)
spampd  xxxx clamav    5u  IPv4  xxxxx       TCP localhost:10025 (LISTEN)
spampd  xxxx clamav    5u  IPv4  xxxxx       TCP localhost:10025 (LISTEN)
spamd   xxxx   root    5u  IPv4  xxxxx       TCP localhost:spamd (LISTEN)
spamd   xxxx clamav    5u  IPv4  xxxxx       TCP localhost:spamd (LISTEN)
spamd   xxxx   root    5u  IPv4  xxxxx       TCP localhost:spamd (LISTEN)

# nmap localhost -p 1-5000,8110,10024-10026

Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2007-01-02 17:12 CET
Interesting ports on localhost (127.0.0.1):
Not shown: 4999 closed ports
PORT      STATE SERVICE
783/tcp   open  spamassassin
xxxx/tcp  open  unknown
3128/tcp  open  squid-http
8110/tcp  open  unknown
10025/tcp open  unknown

Nmap finished: 1 IP address (1 host up) scanned in 0.362 seconds

Si todo parece correcto, enviar mensajes de spam y/o con la firma eicar a cuentas que despues sean accedidas por pop3 desde la intranet. Verificar en las cabeceras que se usa el antispam.

BONO EXTRA – Configuración de OpenVPN
SIN TERMINAR
Instalación básica de OpenVPN basada en clave pre-compartida.

# modprobe tun
# ls /dev/net/tun -l

crw-rw-rw- 1 root root 10, 200 2006-12-30 09:55 /dev/net/tun

# openvpn –genkey –secret /etc/openvpn/key
# vi /etc/openvpn/config.ovpn

dev tap
secret /etc/openvpn/key
ping 10
verb 1
mute 10
ifconfig 10.0.1.1 255.255.255.252
lport 5002

# openvpn –config /etc/openvpn/config.ovpn –log-append /var/log/openvpn.log –daemon

Configuración del cliente
remote the.ip.public.address
rport 5002
dev tap
ifconfig 10.0.1.2 255.255.255.252
secret c:\openvpn\config\key # el mismo fichero key que el servidor
ping 10
verb 1
mute 10
route-gateway 10.0.1.1
redirect-gateway


Responses

  1. […] https://alejandrolaorden.wordpress.com/2006/09/21/firewall-seguro-en-linux/ […]

  2. Gracias por la info!!…

    Supongo que alejandro es tu nombre! :)

    Estoy iniciandome en linux, asi queando recopilando info por todos lados…muchas gracias!…

    SAlutes!!


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Categorías

A %d blogueros les gusta esto: