OpenBSD, Proxy Transparente utilizando Squid

OpenBSD, Secure by default Squid, Proxy web-caché

Lizardo Desilos
OpenBSD México
lizardo@OpenBSD.Org.MX


Licencia

Copyright (c) 2003, Lizardo Desilos, lizardo@openbsd.org.mx
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

Introducción

OpenBSD, claro está, es nuestro Sistema Operativo ULTRA-Seguro.

Squid es el servidor Proxy más popular y extendido entre los sistemas operativos basados sobre UNIX®. Squid es: confiable, robusto y versátil. Al ser software libre, además de estar disponible el código fuente, está libre de costosas licencias por uso o con restricción a un uso con determinado número de usuarios (LIBERTAD).

Entre otras cosas, Squid puede hacer Proxy y cache con los protocolos HTTP, FTP, GOPHER y WAIS, Proxy transparente, cache transparente, WWCP, aceleración HTTP, cache de consultas DNS y más.

Este documento sigue el procedimiento de instalación de todo el software vía ports de OpenBSD, aunque opcionalmente puede utilizar packages[1]; también se toma en cuenta de que se tienen actualizados los ports[2].

[1] http://www.openbsd.org/es/ports.html
[2] http://www.openbsd.org/es/anoncvs.html


Software requerido

Para poder llevar la cabo los procedimientos descritos en este documentos, necesitará tener instalado al menos lo siguiente:


Instalación del software necesario

El procedimiento de instalación es secillo, bastará ejecutar como superusario:

# cd /usr/ports/www/squid
# make install

Metaauto y autoconf son dependencias del port de squid en OpenBSD así que no hay que preocuparse por instalarlos después de realizado lo anterior.


Configuración básica

Squid utiliza el fichero de configuración localizado en /etc/squid/squid.conf, y podrá trabajar sobre este utilizando su editor de texto preferido. Existen un gran número de parámetros, de los cuales se recomienda configurar los siguientes:


Parámetro http_port: ¿Que puerto utilizar para Squid?

Squid por defecto utilizará el puerto 3128 para atender peticiones, sin embargo se puede especificar que lo haga en cualquier otro puerto o bien que lo haga en varios puertos a la vez.

En el caso de un Proxy Transparente, regularmente se utilizará el re-direccionamiento de peticiones de modo tal que no habrá necesidad alguna de modificar la configuración de los navegadores Web para utilizar el servidor Proxy, bastará con utilizar como puerta de enlace al servidor. Es importante recordar que los servidores Web, como Apache, también utilizan dicho puerto, por lo que será necesario reconfigurar el servidor Web para utiliza otro puerto disponible, o bien desinstalar o deshabilitar el servidor Web.

Localice la sección de definición de http_port, y especifíque:

#
# You may specify multiple socket addresses on multiple lines.
#
# Default: http_port 3128
http_port 3128


Parámetro cache_mem

El parámetro cache_mem establece la cantidad ideal de memoria para lo siguiente:

Los datos de estos objetos se almacenan en bloques de 4 Kb. El parámetro cache_mem especifica un límite máximo en el tamaño total de bloques acomodados, donde los objetos en tránsito tiene mayor prioridad. Sin embargo los objetos Hot y aquellos negativamente almacenados en el caché podrán utilizar la memoria no utilizada hasta que esta sea requerida. De ser necesario, si un objeto en tránsito es mayor a la cantidad de memoria especificada, Squid excederá lo que sea necesario para satisfacer la petición.

Por defecto se establecen 8 MB. Puede especificarse una cantidad mayor si así se considera necesario, dependiendo esto de los hábitos de los usuarios o necesidades establecidas por el administrador.

Si se posee un servidor con al menos 128 MB de RAM, establezca 16 MB como valor para este parámetro:

cache_mem 16 MB


Parámetro cache_dir: ¿Cuanto desea almacenar de Internet en el disco duro?

Este parámetro se utiliza para establecer que tamaño se desea que tenga el cache en el disco duro para Squid. Para entender esto un poco mejor, responda a esta pregunta: ¿Cuanto desea almacenar de Internet en el disco duro? Por defecto Squid utilizará un cache de 100 MB, de modo tal que encontrará la siguiente línea:

cache_dir ufs /var/spool/squid 100 16 256

Se puede incrementar el tamaño del cache hasta donde lo desee el administrador. Mientras más grande el cache, más objetos se almacenarán en éste y por lo tanto se utilizará menos el ancho de banda. La siguiente línea establece un cache de 700 MB:

cache_dir ufs /var/spool/squid 700 16 256

Los números 16 y 256 significan que el directorio del cache contendrá 16 subdirectorios con 256 niveles cada uno. No modifique esto números, no hay necesidad de hacerlo.

Es muy importante considerar que si se especifica un determinado tamaño de cache y este excede al espacio real disponible en el disco duro, Squid se bloqueará inevitablemente. Sea cauteloso con el tamaño de cache especificado.


Parámetro ftp_user

Al acceder a un servidor FTP de manera anónima, por defecto Squid enviará como contraseña Squid@. Si se desea que el acceso anónimo a los servidores FTP sea más informativo, o bien si se desea acceder a servidores FTP que validan la autenticidad de la dirección de correo especificada como contraseña, puede especificarse la dirección de correo electrónico que considere pertinente.

ftp_user proxy@su-dominio.com


Parámetro ftp_passive

Si se tiene un muro contrafuegos que no permite acceder a servidores FTP más que de modo pasivo, debe habilitarse ftp_passive con el valor on.

ftp_passive on


Controles de acceso

Es necesario establecer Listas de Control de Acceso(ACL) que definan una red o bien ciertas maquinas en particular. A cada lista se le asignará una Regla de Control de Acceso que permitirá o denegará el acceso a Squid. Procedamos a entender como definir unas y otras.

Listas de control de acceso

Regularmente una lista de control de acceso se establece siguiendo la siguiente sintaxis:

acl [nombre de la lista] src [lo que compone a la lista]

Si uno desea establecer una lista de control de acceso que defina sin mayor trabajo adicional a toda la red local definiendo la IP que corresponde a la red y la máscara de la sub-red. Por ejemplo, si se tienen una red donde las máquinas tienen direcciones IP 192.168.1.n con máscara de sub-red 255.255.255.0, puede utilizar lo siguiente:

acl miredlocal src 192.168.1.0/255.255.255.0

También puede definirse una Lista de Control de Acceso invocando un fichero localizado en cualquier parte del disco duro, y en el cual se en cuenta una lista de direcciones IP. Ejemplo:

acl permitidos "/etc/squid/permitidos"

El fichero /etc/squid/permitidos contendría algo como siguiente:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.15
192.168.1.16
192.168.1.20
192.168.1.40

Lo anterior estaría definiendo que la Lista de Control de Acceso denominada permitidos estaría compuesta por las direcciones IP incluidas en el fichero /etc/squid/permitidos.

Reglas de Control de Acceso

Estas definen si se permite o no el acceso a Squid. Se aplican a las Listas de Control de Acceso. Deben colocarse en la sección de reglas de control de acceso definidas por el administrador, es decir, a partir de donde se localiza la siguiente leyenda:

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#

La sintaxis básica es la siguiente:

http_access [deny o allow] [lista de control de acceso]

En el siguiente ejemplo consideramos una regla que establece acceso permitido a Squid a la Lista de Control de Acceso denominada permitidos:

http_access allow permitidos

También pueden definirse reglas valiéndose de la expresión !, la cual significa excepción. Pueden definirse, por ejemplo, dos listas de control de acceso, una denominada lista1 y otra denominada lista2, en la misma regla de control de acceso, en donde se asigna una expresión a una de estas. La siguiente establece que se permite el acceso a Squid a lo que comprenda lista1 excepto aquello que comprenda lista2:

http_access allow lista1 !lista2

Este tipo de reglas son útiles cuando se tiene un gran grupo de IP dentro de un rango de red al que se debe permitir acceso, y otro grupo dentro de la misma red al que se debe denegar el acceso.


Aplicando Listas y Reglas de control de acceso

Una vez comprendido el funcionamiento de la Listas y las Regla de Control de Acceso, se procedera a determinar cuales utilizar para la configuración.

Caso 1

Considerando como ejemplo que se dispone de una red 192.168.1.0/255.255.255.0, si se desea definir toda la red local, se utilizaría la siguiente línea en la sección de Listas de Control de Acceso:

acl todalared src 192.168.1.0/255.255.255.0

Habiendo hecho lo anterior, la sección de listas de control de acceso debe quedar más o menos del siguiente modo:

Listas de Control de Acceso: definición de una red local completa

#
# Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl todalared src 192.168.1.0/255.255.255.0

A continuación se procede a aplicar la regla de control de acceso:

http_access allow todalared

Habiendo realizado lo anterior, la zona de reglas de control de acceso debería quedar más o menos de este modo:

Reglas de control de acceso: Acceso a una Lista de Control de Acceso

#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
http_access allow localhost
http_access allow todalared
http_access deny all

La regla http_access allow todalared permite el acceso a Squid a la Lista de Control de Acceso denominada todalared, la cual está conformada por 192.168.1.0/255.255.255.0. Esto significa que cualquier máquina desde 192.168.1.1 hasta 192.168.1.254 podrá acceder a Squid.

Caso 2

Si solo se desea permitir el acceso a Squid a ciertas direcciones IP de la red local, se debera crear un fichero que contenga dicha lista. Genere el fichero /etc/squid/lista, dentro del cual se incluirán solo aquellas direcciones IP que desea confirmen la Lista de Control de acceso. Ejemplo:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.15
192.168.1.16
192.168.1.20
192.168.1.40

Se denominara a esta lista de control de acceso como redlocal:

acl redlocal src "/etc/squid/lista"

Habiendo hecho lo anterior, la sección de listas de control de acceso debe quedar más o menos del siguiente modo:

Listas de Control de Acceso: definición de una red local completa
#
# Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl redlocal src "/etc/squid/lista"

A continuación se procede a aplicar la regla de control de acceso:

http_access allow redlocal

Habiendo hecho lo anterior, la zona de reglas de control de acceso debería quedar más o menos de este modo:

Reglas de control de acceso: Acceso a una Lista de Control de Acceso
#
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
#
http_access allow localhost
http_access allow redlocal
http_access deny all

La regla http_access allow redlocal permite el acceso a Squid a la Lista de Control de Acceso denominada redlocal, la cual está conformada por las direcciones IP especificadas en el fichero /etc/squid/lista. Esto significa que cualquier máquina no incluida en /etc/squid/lista no tendrá acceso a Squid.


Parámetro cache_mgr

Por defecto, si algo ocurre con el Cache, como por ejemplo que muera el procesos, se enviará un mensaje de aviso a la cuenta webmaster del servidor. Puede especificarse una distinta si acaso se considera conveniente.

cache_mgr su_usuario@su_dominio.com


Cache con aceleración

Cuando un usuario hace petición hacia un objeto en Internet, este es almacenado en el cache de Squid. Si otro usuario hace petición hacia el mismo objeto, y este no ha sufrido modificación alguna desde que lo accedió el usuario anterior, Squid mostrará el que ya se encuentra en el cache en lugar de volver a descargarlo desde Internet.

Esta función permite navegar rápidamente cuando los objetos ya están en el cache de Squid y además optimiza enormemente la utilización del ancho de banda.

En la sección HTTPD-ACCELERATOR OPTIONS deben habilitarse los siguientes parámetros:

Proxy Acelerado: Opciones para Proxy Convencional
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Por defecto el parámetro httpd_accel_with_proxy viene con el valor off, es importante no olvidar cambiar este valor por on.


Estableciendo el idioma por defecto

Squid incluye traducción a distintos idiomas de las distintas páginas de error e informativas que son desplegadas en un momento dado. Dichas traducciones se pueden encontrar en /usr/local/share/squid/errors/. Para poder hacer uso de las páginas de error traducidas al español, es necesario cambiar el parámetro error_directory localizado en /etc/squid/squid.conf para que apunte hacia /usr/local/share/squid/errors/Spanish en lugar de hacerlo hacia /usr/local/share/squid/errors/English.


Iniciando, reiniciando y añadiendo el servicio al arranque del sistema

Antes de inciar:
Después de realizar la configuración necesaría al archivo /etc/squid/squid.conf y cuando realmente se encuentre convencido de que la configuración es la necesaria, ejecute como superusuario:

# squid -z

Lo anterior es para inicializar el cache indicado con el parametro cache_dir.

Iniciando:
Ejecute como superusuario:
# squid

Reiniciando:
Ejecute los siguientes comandos como superusuario:
# squid -k {reconfigure,rotate,shutdown,interrupt,kill,debug,check,parse}
# squid

Si tiene dudas al respecto no dude en investigar en squid(8).

Añadiendo el servicio al arranque del sistema:
Edite el archivo /etc/rc.local con su editor de texto preferido y agrege las líneas:

if [ -x /usr/local/sbin/squid ]; then
	echo -n ' Squid';	/usr/local/sbin/squid
fi


Aplicando reglas de redireccionamiento

Para realizar esto, debe tener activadas sus reglas de filtrado de paquetes. Si esta en OpenBSD 3.0 o 3.1 edite el archivo /etc/nat.conf de la siguiente manera:

...
# Dirección IP del Proxy
me = 123.45.67.8
# Su interfaz de red
int = fxp0
# Su red
mynet = 10.8.1.0/24
# Redirecciones para Squid
rdr on $int proto tcp from any to any port 80 -> $me port 3128

Si esta en OpenBSD 3.3 u OpenBSD 3.2 realice igualmente lo anterior, pero en el archivo /etc/pf.conf.

¡Y no olvide recargar sus reglas de filtrado de paquetes!

OpenBSD 3.0, 3.1:
# pfctl -R /etc/pf.conf
# pfctl -N /etc/nat.conf

OpenBSD 3.2, 3.3:
# pfctl -f /etc/pf.conf


Otros usos para Squid con OpenBSD

Además de funcionar como Proxy Transparente, puede hacer que Squid sea un filtro de contenido Web. Esto rinde mucho mejor resultado que utilizar WebSense en Windows NT. Para que Squid funcione como filtro de contenido web, le sugiero utilizar SquidGuard o DansGuardian, ambos ports estan disponibles en la sección de ports de Gerardo Santana Gómez Garrido. Para utilizar SquidGuard es necesario actualizar el port de SleepyCat (Berkeley Database) a la versión db-3.3.11. Este port también se encuentra disponible en la misma sección.


$Id: squid.html,v 1.8 2003/08/21 19:13:55 lynx Exp $