Bienvenid@ a Guimi.Net
 
 Cambiar a versión para impresión

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
 
Creative Commons License 2007 Güimi (http://guimi.net)
Está permitido copiar, distribuir y/o modificar los documentos bajo los términos de la licencia
"Reconocimiento-Compartir bajo la misma licencia 3.0 España" de Creative Commons.
Puede ver una copia de esta licencia completa.

Índice


 

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:

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
 

 

Postinstalación del sistema

Podemos realizar algunos ajustes de postinstalación del sistema que nos resulten interesantes.
 
Para contactar con nosotros escríbe a contacto_ARROBA_guimi.net
Esta página está optimizada para todos los navegadores ;)
Esta página ha sido realizada utilizando CMSXP Valid HTML 4.01!
Estadísticas