Servicio proxy HTTP con Squid

per Victor Carceler darrera modificació 2020-03-25T16:35:32+02:00

Squid, bajo ciertas condiciones, permite que los clientes de la XEiLL accedan mediante los protocolos HTTP/FTP a objetos que se encuentran en Internet.

En la configuración de Squid intervienen:

  • Un directorio (o varios) que sirven para almacenar los objetos de la caché de Squid
  • El fichero de configuración /etc/squid/squid.conf

Normalmente el directorio que se utiliza como caché de objetos es /var/spool/squid, pero para no utilizar la partición en la que está montada la raíz del sistema, en este caso se utilizará /opt/spool/squid. Por lo tanto, el primer paso será construir el nuevo directorio:

[root@localhost ~]# df -h
S.ficheros Tamaño Usado Disp Uso% Montado en
/dev/hda1 16G 1,3G 14G 9% /
/dev/hda5 40G 288K 40G 1% /opt
/dev/hda6 15G 272K 15G 1% /store
[root@localhost ~]# mkdir -p /store/spool/squid
[root@localhost ~]# chown squid.squid /store/spool/squid/
[root@localhost ~]# ll /store/spool
total 0
drwxr-xr-x 2 squid squid 6 abr 15 11:15 squid/
[root@localhost ~]#

El fichero de configuración de Squid es largo y las directivas de configuración tienen comentarios detallados. Sobre el fichero original squid.conf que se obtiene al incluir el servicio, se han realizado los siguientes cambios:

  1. Utilizamos la directiva http_port para indicar que atenderemos peticiones en el puerto 8080 en modo transparente
    #Default:
    # http_port 3128
    http_port 8080 transparent
  2. Fijamos como cache_mem el valor resultante de restar 2GB a la cantidad total de RAM. Si el equipo tuviese 2GB, se utilizará un cache_mem de 512 MB. Se fijará como maximum_object_size_in_memory 128 MB.
  3. Utilizamos la directiva maximum_object_size para indicar un tamaño máximo para los objetos a almacenar en la caché superior al valor por defecto
    #Default:
    # maximum_object_size 4096 KB
    maximum_object_size 10240 MB
  4. Utilizamos la directiva cache_dir para fijar un directorio a utilizar para guardar los objetos de la caché. Se utiliza el tipo de almacenamiento aufs que proporciona un rendimiento superior a ufs. Como tamaño se utilizará el 75% de la capacidad de la partición.
    #Default:
    # cache_dir ufs /var/spool/squid 100 16 256
    cache_dir aufs /store/spool/squid 20000 16 256
  5. Añadimos las ACLs necesarias para permitir que los clientes de la LAN y de la XEiLL puedan navegar utilizando el proxy
    # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS

    # Clientes LAN que pueden navegar
    acl clientes_LAN src 192.168.0.0/255.255.0.0
    http_access allow clientes_LAN

    # Clientes XEILL que pueden navegar
    acl clientes_XEILL src 10.0.0.0/255.0.0.0
    http_access allow clientes_XEILL

  6. Utilizamos la directiva visible_hostname para definir el nombre de host que se presentará en las páginas de información y errores generadas por Squid
    #Default:
    # none
    visible_hostname proxy.ceiprafaelcasanova.xeill.net


Utilizando un redirector con Squid

Si se quiere informar a los clientes de las características y usos de la XEiLL, es posible redirigir la primera petición de cada cliente a una página con información sobre la XEiLL. Una solución sencilla es utilizar un pequeño script que redirige la primera petición de cada cliente a una web informativa. El propio proxy ejecuta el script automáticamente en cada petición. El script WelcomeRedirector necesita un intérprete de Perl instalado en el sistema.

Copiamos el script WelcomeRedirector.pl en el directorio /opt/bin y nos aseguramos de que tiene permiso de ejecución:

[root@localhost bin]# pwd
/opt/bin
[root@localhost bin]# ll
total 4
-rwxr--r-- 1 squid squid 1712 abr 15 16:17 WelcomeRedirector.pl*
[root@localhost bin]#

Modificamos el fichero de configuración de Squid para que utilice el script como redirector:

#  TAG: redirect_program
# Specify the location of the executable for the URL redirector.
# Since they can perform almost any function there isn't one included.
# See the FAQ (section 15) for information on how to write one.
# By default, a redirector is not used.
#
#Default:
# none
redirect_program /opt/bin/WelcomeRedirector.pl

# TAG: redirect_children
# The number of redirector processes to spawn. If you start
# too few Squid will have to wait for them to process a backlog of
# URLs, slowing it down. If you start too many they will use RAM
# and other system resources.
#
#Default:
# redirect_children 5
redirect_children 1


Proxy transparente

Un proxy transparente es aquel que los clientes utilizan sin haberlo configurado de forma explícita, desde el punto de vista de los clientes no existe. El truco está en que la puerta de enlace utilizada por los clientes redirige todo el tráfico HTTP hacia un proxy. En nuestro caso, cada servidor de la XEiLL actúa como puerta de enlace para los clientes WiFi y puede funcionar como proxy transparente para estos.

Es importante observar que el 'truco' del proxy transparente sólo sirve para el protocolo HTTP, no es posible montar un proxy transparente para el protocolo HTTPS, así que los clientes todavía deberán configurar el proxy de forma explícita para acceder a páginas web seguras.

La puesta en marcha del proxy transparente incluye dos acciones:

  1. Configurar Squid para que funcione en modo transparente y sepa manejar adecuadamente peticiones de clientes 'despistados' que creen estar dialogando con el servidor web.
  2. Configurar la puerta de enlace para que redirija las peticiones HTTP de los clientes al proxy.

El primer punto, de la versión 2.6 de Squid en adelante, se consigue añadiendo la palabra reservada 'transparent' a la directiva 'http_port'. Cuando Squid funciona en modo transparente puede seguir gestionando las solicitudes normales, las de los clientes que saben que están hablando con un proxy.

http_port 8080 transparent

La redirección de tráfico se logra mediante unas reglas de Netfilter/iptables para indicar al núcleo que redirija los paquetes hacia el proxy haciendo NAT.

[root@localhost ~]$ iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
[root@localhost ~]$ /etc/init.d/iptables save

Una vez introducida la regla de filtrado, o varias si existen los alias eth1:0, eth1:1 ..., se utilizará el script /etc/init.d/iptables para registrarlas de modo que se carguen automáticamente en cada arranque.