Apartamento En Familia

Apartamento En Familia
Apartamento de playa para vacaciones. http://www.apartamentoenfamilia.es. Número registro HUTT-005768

jueves, 14 de marzo de 2013

Instalar Squid (proxy) en Ubuntu 12.10 (+OpenLDAP)

Squid es un popular programa de software libre que implementa un servidor proxy y un dominio para caché de páginas web, publicado bajo licencia GPL. Tiene una amplia variedad de utilidades, desde acelerar un servidor web, guardando en caché peticiones repetidas a DNS y otras búsquedas para un grupo de gente que comparte recursos de la red, hasta caché de web, además de añadir seguridad filtrando el tráfico. Está especialmente diseñado para ejecutarse bajo entornos tipo Unix.
Squid ha sido desarrollado durante muchos años y se le considera muy completo y robusto. Aunque orientado principalmente a HTTP y FTP es compatible con otros protocolos como Internet Gopher. Implementa varias modalidades de cifrado como TLS, SSL, y HTTPS.

(Fuente Wikipedia)

Instalación

La instalación de squid3 se puede hacer fácilmente desde el repositorio de Ubuntu. Para ello, como es habitual:

apt-get update
apt-get upgrade
apt-get install squid

squid es un paquete de transición (un enlace) a la última versión de squid. En el momento de redactar estas lineas era squid3.

Configuración 

La configuración de squid se encuentra en la carpeta /etc/squid3.

Los archivos que nos encontramos son:
  • errorpage.css: Hoja de estilos para las páginas que queremos mostrar los errores (de acceso a páginas no permitidas, etc)
  • msntauth.conf: Para autenticación MSNT.
  • squid.conf: El archivo de configuración general de squid.

Así pues, vamos a centrarnos en su archivo de configuración general. De todas maneras, posiblemente, sin tocar nada el equipo ya esté funcionando como proxy. Probadlo. En muchos casos la configuración por defecto ya es más que suficiente.

squid.conf

En este archivo, de inicio, encontraremos un 90% de comentarios y el resto de configuración. Esto va genial para poder entender que hace cada opción de squid, si bien, para configurarlo podemos querer tenerlo más 'limpio'. Para ello podemos limpiarlo siguiendo el artículo "Cómo crear un archivo de configuración limpio de comentarios" .

Una vez limpio de comentarios, os pongo un ejemplo y vamos comentando las diferentes opciones. No obstante, podréis encontrar la información más completa en http://www.squid-cache.org/Doc/config/:

auth_param

Este parámetro sirve para especificar la autenticación a nuestro proxy. En nuestro caso la autentificación la haremos contra un servidor OpenLDAP.

auth_param basic program /usr/lib/squid3/squid_ldap_auth -b "dc=dominio,dc=es" -f "uid=%s" servidor_ldap.dominio.es
auth_param basic realm Empresa Proxy Cache
auth_param basic credentialsttl 10 second
auth_param basic children 5

acl

Este parámetro sirve para definir las 'Access List', o listas de acceso. Siempre tiene la forma siguiente:
acl nombre_identificativo tipo_acl argument
Aquí no digo si deniego o accedo. Simplemente doy nombre a las cosas. A una parte de la red le puedo llamar, por ejemplo, Empresa_LAN y a otra parte de la red le llamo proxy_empresarial. Seria como inicializar unas variables que luego haré servir para dar o no acceso al proxy (o requerir contraseña, etc). También puedo definir puertos.

acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl Empresa_LAN src 192.168.1.0/24

acl proxy_empresarial src 192.168.22.0/24
acl password proxy_auth REQUIRED
acl SSL_ports port 443
acl Safe_ports port 80        # http
acl Safe_ports port 21        # ftp
acl Safe_ports port 443        # https
acl Safe_ports port 70        # gopher
acl Safe_ports port 210        # wais
acl Safe_ports port 1025-65535    # unregistered ports
acl Safe_ports port 280        # http-mgmt
acl Safe_ports port 488        # gss-http
acl Safe_ports port 591        # filemaker
acl Safe_ports port 777        # multiling http
acl CONNECT method CONNECT

acl local-servers dstdomain .potito.uk
acl local-servers2 dstdomain 141.69.0.0/16

http_access

Con las acl decía que identificaba puertos o segmentos de la red dándoles nombre pero que no permitia o denegaba acceso. Bien, con http_access si. Una vez tenemos una acl, con http_access decimos allow o deny para permitir o denegar respectivamente.

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow Empresa_LAN
http_access allow proxy_empresarial
http_access allow password
http_access deny all


http_reply_access

Como complemento a http_access tenemos este parámetro. Nos sirve para dar acceso o no a las respuestas de servidor hacia los clientes.

http_reply_access allow all

icp_access

Basándonos también en las acl declaradas, aquí denegamos o permitimos acceso al ICP Port (Internet Cache Protocol)

icp_access allow proxy_empresarial
icp_access deny all

http_port

Es el puerto de escucha de nuestro servidor proxy. Por defecto escucha por el puerto 3128. Nosotros podemos mirar de cambiárselo para evitar ataques DoS, etc

http_port 4500

include

Esto no es un parámetro en si. Squid nos da la posibilidad de incluir otros archivos a nuestro archivo de configuración de manera que según que parámetros los tengamos separados del squid.conf general. A mi me resulta útil para separar conceptos y no hacer un squid.conf muy grande que dificulte su comprensión. Como mi lista de acl user src y tcp_outgoing (veremos que es este parámetro) era muy larga, he preferido crear unos archivos fuera del squid.conf e incluirlos mediante include.
 
include /etc/squid3/acl_user_src_IP.txt
include /etc/squid3/tcp_outgoing_address.txt

tcp_outgoing_address

Con este parámetro lo que haremos es mapear, asignar, una ip de salida a un usuario o ip origen. Es decir, imaginemos que tenemos 5 usuarios y queremos que cada usuario salga por nuestro proxy con una IP diferente (para ello hemos de disponer de esas IPs, claro está). Pues lo que haremos es primero definir mediante las acl a los usuarios. Por ejemplo:
acl usuari1 src 192.168.1.10
acl usuari2 src
192.168.1.12
acl usuari3 src 192.168.1.13

Esto como hemos visto antes en el 'include' lo tengo en un archivo llamado acl_user_src_IP.txt , pero perfectamente podria estar en el propio squid.conf. Bien, pues una vez hecha la acl (osea, identificado el usuario con su IP), le decimos mediante tcp_outgoing_address por que IP ha de salir:

tcp_outgoing_address 84.80.60.53 usuari1
tcp_outgoing_address 84.80.60.185 usuari2
tcp_outgoing_address 84.80.60.54 usuari3

Con esto lo que hemos hecho es que el usuario que en la red local tiene la IP 192.168.1.10, al salir por el proxy, éste hace que salga a Internet (o otra red) por la IP 84.80.60.53. Y lo mismo con los otros tres.

Yo lo que también hice es meter toda la configuración tcp_outgoing_address en otro archivo e incluirla con el include. Se podía haber dejado en el propio squid.conf.

always_direct

Este parámetro nos permitirá permitir o denegar conexiones directas a un destino sin usar caché. No significa que hagamos un bypass del proxy, sino que si hacemos una petición podemos hacer que haga una redirección directa, no cacheada. Para ello, usaremos una acl creada.

always_direct allow local-servers
always_direct allow local-servers2

cache_mem y cache_dir

cache_mem nos permite especificar la cantidad de memoria que puede dedicar a la cache (no al squid). cache_dir nos permite especificar donde y que sistema usar para los archivos de la cache. 
cache_mem 100 MB
cache_dir ufs /var/spool/squid3 100 16 256

refresh_pattern

Es para discernir si lo que hay en la cache ha expirado ya o no para según patrones (explicados mediante expresiones regulares regex). Los estados de un objeto en cache son FRESH o STALE (fresco o viciado).
 
refresh_pattern ^ftp:        1440    20%    10080
refresh_pattern ^gopher:    1440    0%    1440
refresh_pattern -i (/cgi-bin/|\?) 0    0%    0
refresh_pattern (Release|Packages(.gz)*)$      0       20%     2880
refresh_pattern .        0    20%    4320

read_timeout

Es el tiempo de espera que queremos para cuando una conexión que ha sido satisfactoria y no nos devuelve ningún tipo de datos.

read_timeout 400 minutes

visible_hostname

Nombre visible con el que queremos que se vea nuestro proxy.

visible_hostname proxy_empresa

forwarded_for

Esto es por si queremos que en las peticiones HTTP se incluya la IP del cliente. Las opciones son on o off. Sería del tipo X-Forwarded-For: IP-Cliente  si lo ponemos a on y X-Forwarded-For: unknown si lo ponemos a off.

forwarded_for off

header_access

Esta opcion viola los estandares de HTTP. Se suele usar para crear un proxy anónimo. Nosotros simplemente denegaremos los X-Forwarded-For ya que los desactivé en una opción anterior.
 
header_access Via deny all
header_access X-Forwarded-For deny all
Con estas opciones (o muchas menos si no tenéis una red muy compleja) podéis hacer funcionar un proxy fácilmente. 

Links de interés 

http://www.squid-cache.org/

That u don't know what you've got 'til it's gone