SafeChildren Banner

Havoc Oracle Solaris Experts

lunes, 17 de agosto de 2009

Instalar squid en Solaris 10 - Parte 1

Introducción
Squid es un proxy http que nos permite acelerar la navegación y disminuir el consumo de ancho de banda de nuestra conexión a internet. Una de las razones de instalar squid es eliminar la necesidad de bajar repetidas veces el mismo contenido de internet y por lo tanto, es algo muy recomendable cuando hablamos de una lan.

En esta primera parte veremos cómo instalar squid de forma simple, en las siguientes entregas veremos cómo instalar squid como proxy transparente y por último veremos cómo utilizar squid para acelerar nuestras páginas web instalandolo como proxy reverso.

Existe mucha literatura sobre la conveniencia o no de un proxy, la mayoría de lo escrito no es cierto ya que se basan en que Internet es dinámico, y lo es, pero no es tan dinámico como ellos quieren hacernos creer. Un proxy bien instalado es una gran ayuda y ventaja para los usuarios, uno mal instalado es un incordio, sin embargo, esto no difiere en nada a otra aplicación. Una de las quejas sobre el uso de los proxys radica en que el contenido está desfasado, bien, eso puede ser cierto (o no) en función de cómo se configure, además, las páginas no cambian cada microsegundo (normalmente).

Vamos a ver cómo configurar squid-cache para que nos permita tener el contenido fresco y, a su vez, nos permita ahorrarnos ancho de banda.

Compilación de squid-cache
Primero deberemos comprobar si tenemos un compilador de C/C++ disponible en el sistema, si hemos instalado Solaris completo plus OEM, entonces tendremos el compilar gcc en /usr/sfw/bin/gcc en OpenSolaris, tenemos un link en /usr/gnu/bin/cc a /usr/sfw/bin/gcc
root@opensolaris:/ # which cc
/usr/gnu/bin/cc
Lo primero que haremos será descargarnos el código fuente de squid-cache desde su página oficial http://www.squid-cache.org.
$ mkdir ~/squid
$ cd ~/squid
$ wget http://www.squid-cache.org/Versions/v2/2.7/squid-2.7.STABLE6.tar.gz
$ gzip -dc squid-2.7.STABLE5.tar.gz | tar xvpf -
Configuración Compilación
Vamos a configurar la compilación de squid para tener algunas opciones que por defecto no se activan. Simplemente comentaremos algunas de las opciones que hemos activado y, por qué.
  • --enable-cache-digest habilita el hashing de la caché
  • --enable-delay-pools habilita la configuración de anchos de banda
  • --enable-http-violations habilita las violaciones del protocolo HTTP
  • --enable-store-io habilita modos de almacenamiento UFS y DISKD
Si quieres saber más de las opciones de compilación, puedes utilizar el siguiente comando.
$ ./configure --help
Una vez decidido el tipo de configuración, lanzaremos el comando configure y posteriormente el make
$ cd squid-2.7.STABLE6
$ ./configure \
--with-large-files \
--with-pthreads \
--enable-follow-x-forwarded-for \
--enable-default-err-language=Spanish \
--enable-cache-digests \
--enable-delay-pools \
--enable-http-violations \
--prefix=/usr/local/squid \
--enable-x-accelerator-vary \
--with-maxfd=8192 \
--enable-storeio=ufs,diskd
Una vez configurada la instalación, lanzaremos el comando make para proceder a la compilación
$ make
Si todo ha ido bien, ya tenemos compilado nuestro squid, el siguiente paso será instalarlo.

Instalación de squid-cache
En función de si hemos hecho la compilación con root o no, lo instalaremos de la siguiente forma:

Si lo hemos compilado como root o con un usuario que tenga permisos de escritura en el directorio definido en --prefix

# cd squid-2.7.STABLE6
# make && make install
Si lo hemos compilado con otro usuario (ya que no tendrá permisos para crear el directorio que tengamos definido en --prefix)
$ cd squid-2.7.STABLE6
$ make
$ su -
# cd squid-2.7.STABLE6
# make install
Una vez compilado he instalado, crearemos el grupo y usuario encargado de ejecutar squid, en nuestro caso utilizaremos squid como nombre de grupo y usuario.
# groupadd squid
# useradd -g squid -s /bin/false -d /dev/null squid
# passwd -l squid
A continuación vamos a editar el archivo de configuración de squid que se encuentra en $SQUID_HOME/etc/squid.conf los principales parámetros de configuración son los siguientes:

  • visible_hostname nombre_que_queremos_para_el_proxy
  • cache_effective_user _nombre_de_usuario_dueño_del_proceso_
  • cache_effective_group _grupo_del_dueño_del_proceso_
  • http_port _puerto_de_squid_
  • cache_dir _tipo_almacenamiento_ _ubicación_ _tamaño_cache_ 16 256
  • strip_query_terms _guardar_log_sin_parametros_
Además, la definición de los acl se basan en acl _nombre_ opciones según en el siguiente ejemplo, si queremos permitir el acceso a la caché de los equipos de nuestra lan y denegar todo los demás, haremos,
acl ALL src 0.0.0.0/0.0.0.0
acl LAN src 192.168.1.0/255.255.255.0
http_access allow LAN
http_access deny ALL
Este nos permite definir varias reglas de control, sin embargo, si necesitamos incluir muchas cadenas o configuraciones más extensas entonces, squid nos permite definir un acl como una entrada de fichero utilizando la siguiente configuración (Esta configuración tiene la definición de un conjunto de IPs en el archivo bloqued_ips.acl)
acl blacklist src "/usr/local/squid/etc/acls/bloqued_ips.acl"
http_access deny blacklist
    Y el contenido de /usr/local/squid/etc/acls/bloqued_ips.acl es el siguiente
    # cat /usr/local/squid/etc/acls/bloqued_ips.acl
    192.168.1.30
    192.168.1.31
    192.168.1.32
    A continuación está el archivo de configuración completo de squid con varios sistemas de control para impedir el acceso a webs p2p, messenger, etc. Puede encontrar más información sobre la configuración de acls en la documentación oficial de squid-cache http://wiki.squid-cache.org/SquidFaq/SquidAcl
    # vi /usr/local/squid/etc/squid.conf

    ############################################
    ## SQUID.CONF
    ##
    ## Description:
    ## - definicion de confiruacion de SQUID 2.7.x
    ############################################

    ############################################
    ## PARAMETROS ADMINISTRATIVOS
    ############################################
    visible_hostname proxy
    cache_effective_user squid
    cache_effective_group squid
    httpd_suppress_version_string on
    strip_query_terms false

    ############################################
    ## PARAMETROS DE RED
    ############################################
    http_port 3128

    ############################################
    ## PARAMETROS CACHE
    ############################################
    cache_dir ufs /usr/local/squid/var/cache 64000 16 256
    coredump_dir /usr/local/squid/var/run
    pid_filename /usr/local/squid/var/run/squid.pid
    cache_log /dev/null
    cache_store_log /dev/null
    cache_access_log /usr/local/squid/var/logs/access.log
    emulate_httpd_log on
    log_ip_on_direct on

    hierarchy_stoplist cgi-bin ?
    debug_options ALL, 2

    ############################################
    ## PARAMETRIZACION DE LA CACHE MEMORIA
    ############################################
    memory_replacement_policy lru

    ############################################
    ## PARAMETROS TAMA!NO CACHE
    ############################################
    cache_mem 2048 MB
    cache_swap_low 98
    cache_swap_high 99
    maximum_object_size 2048 MB
    maximum_object_size_in_memory 128 KB

    ############################################
    # FTP
    ############################################
    ftp_user anonymous@sfchildren.com


    ############################################
    ## PARAMETRIZACION ERRORES
    ############################################
    error_directory /usr/local/squid/share/errors/Spanish
    err_html_text support@sfchildren.com


    ############################################
    ## REFRESH PATTERN
    ############################################
    # Debian
    refresh_pattern -i \.deb$ 129600 100% 129600
    refresh_pattern -i \.gz$ 129600 100% 129600
    refresh_pattern -i \.bz2$ 129600 100% 129600

    # Imagenes
    refresh_pattern -i \.gif$ 14400 80% 43200
    refresh_pattern -i \.tiff?$ 14400 80% 43200
    refresh_pattern -i \.bmp$ 14400 80% 43200
    refresh_pattern -i \.jp?g$ 14400 80% 43200
    refresh_pattern -i \.xbm$ 14400 80% 43200
    refresh_pattern -i \.png$ 14400 80% 43200
    refresh_pattern -i \.wrl$ 14400 80% 43200
    refresh_pattern -i \.ico$ 14400 80% 43200
    refresh_pattern -i \.pnm$ 14400 80% 43200
    refresh_pattern -i \.pbm$ 14400 80% 43200
    refresh_pattern -i \.pgm$ 14400 80% 43200
    refresh_pattern -i \.ppm$ 14400 80% 43200
    refresh_pattern -i \.rgb$ 14400 80% 43200
    refresh_pattern -i \.ppm$ 14400 80% 43200
    refresh_pattern -i \.rgb$ 14400 80% 43200
    refresh_pattern -i \.xpm$ 14400 80% 43200
    refresh_pattern -i \.xwd$ 14400 80% 43200
    refresh_pattern -i \.pict?$ 14400 80% 43200

    # Movies
    refresh_pattern -i \.mov$ 14400 80% 43200
    refresh_pattern -i \.mp?g?$ 14400 80% 43200
    refresh_pattern -i \.avi$ 14400 80% 43200
    refresh_pattern -i \.qtm?$ 14400 80% 43200
    refresh_pattern -i \.viv$ 14400 80% 43200
    refresh_pattern -i \.swf$ 14400 80% 43200

    # Sounds
    refresh_pattern -i \.wav$ 14400 80% 43200
    refresh_pattern -i \.aiff?$ 14400 80% 43200
    refresh_pattern -i \.au$ 14400 80% 43200
    refresh_pattern -i \.ram?$ 14400 80% 43200
    refresh_pattern -i \.snd$ 14400 80% 43200
    refresh_pattern -i \.mid$ 14400 80% 43200
    refresh_pattern -i \.mp2$ 14400 80% 43200
    refresh_pattern -i \.mp3$ 14400 80% 43200

    # Archives
    refresh_pattern -i \.sit$ 14400 80% 43200
    refresh_pattern -i \.zip$ 14400 80% 43200
    refresh_pattern -i \.hqx$ 14400 80% 43200
    refresh_pattern -i \.exe$ 14400 80% 43200
    refresh_pattern -i \.arj$ 14400 80% 43200
    refresh_pattern -i \.lzh$ 14400 80% 43200
    refresh_pattern -i \.lha$ 14400 80% 43200
    refresh_pattern -i \.cab$ 14400 80% 43200
    refresh_pattern -i \.rar$ 14400 80% 43200
    refresh_pattern -i \.tar$ 14400 80% 43200
    refresh_pattern -i \.gz$ 14400 80% 43200
    refresh_pattern -i \.z$ 14400 80% 43200
    refresh_pattern -i \.a[0-9][0-9]$ 14400 80% 43200
    refresh_pattern -i \.r[0-9][0-9]$ 14400 80% 43200

    # Data files
    refresh_pattern -i \.txt$ 14400 80% 43200
    refresh_pattern -i \.pdf$ 14400 80% 43200
    refresh_pattern -i \.doc$ 14400 80% 43200
    refresh_pattern -i \.rtf$ 14400 80% 43200
    refresh_pattern -i \.tex$ 14400 80% 43200
    refresh_pattern -i \.latex$ 14400 80% 43200

    # Java-type objects
    refresh_pattern -i \.class$ 14400 80% 43200
    refresh_pattern -i \.js$ 14400 80% 43200
    refresh_pattern -i \.class$ 14400 80% 43200

    # Web-type objects
    refresh_pattern -i \.css$ 10 20% 4320
    refresh_pattern -i \.html?$ 10 20% 4320
    refresh_pattern \/$ 10 20% 4320


    # Para evitar problemas con scripts .do
    refresh_pattern -i \.do$ 0 0% 1440

    # Default
    refresh_pattern . 0 20% 4320


    ############################################
    ## CONFIGURACIONES ACLs
    ############################################
    acl all src 0.0.0.0/0.0.0.0

    ############################################
    ## LAN
    ############################################
    acl lan-isp src 192.168.1.0/255.255.255.0

    ############################################
    ## ACCESO LOCALHOST
    ############################################
    acl localhost src 127.0.0.1/255.255.255.255
    acl to_localhost dst 127.0.0.0/8


    ############################################
    ## NO CACHE QUERYs
    ############################################
    acl QUERY urlpath_regex cgi-bin \?
    acl QUERY urlpath_regex gateway.dll \?
    acl QUERY urlpath_regex gateway \?
    # No cachemaos los cgi
    no_cache deny QUERY

    ############################################
    ## ACCESO AL SISTEMA DE CONFIGURACION
    ############################################
    acl manager proto cache_object

    ############################################
    ## DIRECCIONES IP BLOQUEADAS POR ENCIMA DE
    ## LO GENERAL
    ############################################
    acl blacklist src "/usr/local/squid/etc/acls/bloqued_ips.acl"
    acl blacklisturl url_regex -i "/usr/local/squid/etc/acls/bloqued_url.acl"

    http_access deny blacklisturl
    http_access deny blacklist

    ############################################
    ## URL SIN CACHE
    ###########################################
    acl urlnocache url_regex -i "/usr/local/squid/etc/acls/no_cache.acl"
    no_cache deny urlnocache

    ##############################################
    # URL PROHIBIDAS P2P
    ##############################################
    acl bad_url_p2p url_regex -i "/usr/local/squid/etc/acls/webs_p2p.acl"
    http_access deny bad_url_p2p

    ##############################################
    # EXEPCIONES URLS PROHIBIDAS
    ##############################################
    acl bad_url_exceptions url_regex -i "/usr/local/squid/etc/acls/bad_url_exceptions.acl"
    http_access allow bad_url_exceptions

    ##############################################
    ## URL DENEGADAS
    ##############################################
    acl bad_url url_regex -i "/usr/local/squid/etc/acls/bad_url.acl"
    http_access deny bad_url

    ##############################################
    ## EXECEPCIONES PALABRAS PROHIBIDAS
    ##############################################
    acl bad_query_exceptions urlpath_regex -i "/usr/local/squid/etc/acls/bad_words_exceptions.acl"
    http_access allow bad_query_exceptions

    ##############################################
    # PALABRAS PROHIBIDAS
    ##############################################
    acl bad_query urlpath_regex -i "/usr/local/squid/etc/acls/bad_words.acl"
    http_access deny bad_query

    ##############################################
    # DOMINIOS PROHIBIDAS
    ##############################################
    acl bad_domain dstdom_regex -i "/usr/local/squid/etc/acls/bad_domains.acl"
    http_access deny bad_domain


    ##############################################
    # Puertos Seguros
    ##############################################
    acl SSL_ports port 443-563 # SSL
    acl Safe_ports port 80 # http
    acl Safe_ports port 20 21 # ftp
    acl Safe_ports port 1025-65535 # unregistered ports


    # Permitimos utilizar el CONNECT a puertos seguros, hemos deshabilitado el acces
    # para POP y SMTP puesto que nos pueden ocasionar fallos de seguridad, ademas, nos
    # pueden utilizar como SPAMMER's
    acl CONNECT method CONNECT

    # Permitimos acceder al sistema de configuracion solo desde LOCALHOST
    http_access allow manager localhost
    http_access deny manager
    # Cualquier llamada a puertos que no sean seguros denegada
    http_access deny !Safe_ports
    http_access deny CONNECT !Safe_ports

    ##############################################
    # ACCESO A LA CACHE
    ##############################################
    http_access allow lan-isp
    http_access allow localhost
    http_access deny all
    Creación del directorio de swap
    Una vez configurado el sistema, debemos crear el sistema de archivos (swap) para ello deberemos utilizar el argumento -z, pero antes debemos configurar correctamente el sistema de archivos para asignar el usuario y grupo, definidos en cache_efective_user y cache_efective_group
    # cd /usr/local/squid
    # mkdir -p /usr/local/squid/var/cache
    # chown -R squid:squid /usr/local/squid/var/cache
    # cd var
    # mkdir run
    # chown -R squid:squid logs
    # chmod 750 logs
    # /usr/local/squid/sbin/squid -z
    A continuación vamos a verificar que el sistema está correctamente configurado, para ello utilizaremos la opción parse que nos evaluará la estructura del archivo de configuración
    # /usr/local/squid/sbin/squid -k parse
    Iniciar el Servicio de squid
    Ya tenemos todo preparado para poder lanzar nuestro servicio, para ello, utilizaremos el comando RunCache que se encuenta en $SQUID_HOME/bin/RunCache
    # /usr/local/squid/bin/RunCache &
    Verificar Funcionamiento
    Ya podemos verificar el correcto funcionamiento de nuestro servidor proxy, para ello, utilizaremos el comando squidclient que se encuentra en $SQUID_HOME/bin de la siguiente forma:
    $ /usr/local/squid/bin/squidclient -h localhost http://www.sun.com
    Podemos ver cómo en $SQUID_HOME/var/logs/access.log se nos produce una nueva entrada
    # tail -f /usr/local/squid/var/logs/acess.log
    Resumen
    En esta entrega hemos visto cómo configurar squid-cache para que funcione como proxy http de una forma sencilla sobre Solaris 10, en las siguientes entregas entraremos en la configuración con mayor detalle y de cómo podemos sacar el máximo partido a nuestro nuevo proxy.


    Referencias

    2 comentarios:

    1. Hola,
      Tengo un Squid apuntando a un proxy corporativo. Ahora ellos cambiaron ese proxy, por un archivo de conf. automatica (.pac)
      Yo puedo configurar ese .pac en mi squid?

      Gracias!

      Gastón.

      ResponderEliminar
    2. Hola Gastón,

      Me imagino que cuando dices apuntando a un proxy corporativo, es porque tienes configurado tu SQUID algo así:

      cache_peer _proxy_ parent _puerto_ _icp_ proxy-only no-query


      Bien, ahora ellos han cambiado la configuración de SQUID y notifican el acceso a los clientes mediante un archivo de configuración automática PAC. OK, no hay problema ya que los archivos de configuración (PAC) están "pensados" para clientes, y no tienen por qué afectarte.

      Otra cosa es que estén "continuamente" modificando el archivo PAC y te devuelva uno cada vez, entonces, tenemos un problema.

      Respondiendo a tu pregunta, no, no es posible configurar un SQUID para que use un PAC -al menos de forma sencilla- y de forma automática.

      Lo más recomendable es utilizar ICP (Internet Cache Protocol) para que ambos -tu squid y el proxy corporativo- "hablen", si no es posible, tendrás que configurar el valor de cache_peer utilizando el resultado del archivo PAC.

      Por ejemplo, si el archivo PAC te devuelve algo así:

      function FindProxyForURL(url, host){
      return "PROXY proxy1:3128";
      }


      Tu configuración de SQUID será:

      cache_peer proxy1 parent 3128 0 proxy-only no-query


      Espero que te sirva de ayuda,

      Un Saludo,
      Urko

      ResponderEliminar