Translate - ترجم - Traduire - 翻訳する

viernes, 24 de agosto de 2012

8 Squid3 en Ubuntu/Debian como Proxy transparente

Introducción

Squid3 es una herramienta de filtrado de contenido(Proxy), la cual puede leer las cabeceras de ciertos protocolos dentro de las tramas de una conexión. Antes de llevar acabo esta instalación, debemos cerciorarnos de donde sera instalado, eso es HARDWARE ya que squid3 esta diseñado para trabajar con dos tarjetas de red (ethX, ethX:0), en el caso de no tenerlas, debemos hacer una subinterface de la tarjeta que se tenga en ese momento (lo inverso a suma de puertos [Bonding]). 

Instalación

Debemos asegurarnos de haber hecho una actualización de nuestras maquinas (Linux) con el siguiente comando:
                           
                   $ sudo apt-get update && upgrade
Ahora ya que el sistema tiene la lista de repositorios mas recientes, instalamos “Squid3” (ojo es la nueva versión de Squid, a diferencia de Squid2.9Estable este incluye mas opciones y herramientas para administración del mismo) con el siguiente comando:

                   $ sudo apt-get install squid3
Esto instalara squid3 en nuestras maquinas, ahora lo importante se encuentra en /etc/squid3/ la cual es la carpeta donde se encuentra un archivo de configuración (“squid.conf”), del cual haremos un respaldo en donde queramos, recomiendo el escritorio para rápido acceso ya que incluye todo un manual completo de uso. Ahora después de hecho el respaldo, eliminamos el fichero o modificamos para aquellos temerosos que no viven al limite =D. 

Configuración

Ahora creamos un nuevo archivo de configuración o modificamos el squid.conf y agregamos las lineas que hagan falta obviamente cambiando mis IP por las suyas, lo llenamos con lo siguiente:
        
##Declaracion de Reglas del Squid
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 SSL_ports port 443
acl Safe_ports port 22               # SSH
acl Safe_ports port 80               # http
acl Safe_ports port 21               # ftp
acl Safe_ports port 443 563 1863 # https
acl Safe_ports port 70               # gopher
acl Safe_ports port 210              # wais
acl Safe_ports port 1025-6553    # 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

##Aqui se aplican/ejecutan los parametros definidos en las reglas
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
always_direct allow all         #Esta linea es una caracteristica nueva de squid3
acl hora time MTWHF 10:00-22:00 # horario en el que permite el acceso a internet
acl redLan src 192.168.1.0/27 # acceso de red
acl paginas dstdomain .youtube.com .facebook.com #se definen paginas o listas
#Empezamos con las politicas de acceso
http_access deny !hora   #negamos la hora es decir decimos que nadie se puede conectar en un horario diferente al definido
http_access deny paginas  #El proxy puede bloquear paginas por dominio o ip, aqui se dice que bloqueara lo definido en "paginas"
http_access allow redLan #Aqui definimos que nuestra lan tendra acceso a internet
http_access allow localhost #nos permite que el usuario local pueda trabajar localmente acceso a internet ssh etc
http_access deny all #squid trae unas variables definidas, all es una de ellas y se entiende que lo que no declaramos sera bloqueado.

##Definicion de paginas que no queremos guardar cache
##  ejemplo:
##     hierarchy_stoplist cgi-bin ? hotmail gmail yahoo escuela.factor.com.mx
hierarchy_stoplist cgi-bin ?

##Configuracion estandar para la cache
coredump_dir /var/spool/squid3
refresh_pattern ^ftp:                1440    20%     10080
refresh_pattern ^gopher:     1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0  0%      0
refresh_pattern .            0       20%     4320

##Configuraciones para que sea Transparente, Tenga dominio, las paginas
##de error esten en español, acepte el puerto 3130 y se configura la cache
http_port 3128 transparent #aqui se indica que el proxy sera trasparente y estara escuchando en el puerto 3128
#icp_port 3130
visible_hostname VM_Proxy #el nombre de nuestro proxy
cache_dir ufs /var/spool/squid3 10240 16 256   #Esto nos dice que constara de 10GB en 16 directorios con 256 subdirectorios   
error_directory /usr/share/squid3/errors/Spanish #Esto indica que idioma queremos usar en las paginas de bloqueo u error

  Como podemos ver en el se encuentran declarados puertos, paginas e incluso como debe estar configurado el cache, ahora para que esta configuración tenga efecto debemos reiniciar el servicio para eso tenemos de 3 sopas:

                $ sudo squid3 -k reconfigure
                $ sudo /etc/init.d/squid3 restart
                $ sudo service squid3 restart
Esto reiniciara el servicio, pero como la configuración para el squid3 es TRANSPARENTE debemos modificar unas cosas en el IPTABLES de Linux, el cual nos permitirá además de dar acceso, controlar las interfaces de entrada, salida e incluso podríamos dejar que el squid3 solo bloquee lo que el IPTABLES filtre (es decir solo sera cache, si queremos el IPTABLES puede ser un Firewall y ademas permitir acceso solo a lo que querramos). Para eso se utilizara el siguiente script, el cual consiste en solo direccionar (NO BLOQUEAR) los puertos de Http hacia el squid3, solo los protocolos reconocidos por el squid3 que se encuentran declarados en el “squid.conf”. El script nos queda de esta manera (ojo se recomienda usar el script con una configuración de IPTABLES básica es decir que no tenga configuraciones anteriores ya que el script reiniciara algunas tablas a tablas básicas para que el script funcione adecuadamente):

#!/bin/sh

# Squid server IP
SQUID_SERVER="172.16.0.12" #ip de la interfaz donde escuchara nuestro proxy

# Interface connected to Internet
INTERNET="eth0"

# Address connected to LAN
LOCAL="192.168.1.0/27" #como declaramos en squid.conf es el rango de ips a escuchar

# Squid port
SQUID_PORT="3128" #el puerto en que escucha el proxy (para redirigir el trafico a el)

Limpiamos firewall anterior
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Se cargan modulos de IPTABLES para NAT e "IP conntrack support"
modprobe ip_conntrack
modprobe ip_conntrack_ftp
# For win xp ftp client
#modprobe ip_nat_ftp

# Habilitamos forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward

# Configuramos una politica de filtrado por defecto
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

# Permitimos el acceso ilimitado al loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Permitimos UDP, DNS y Passive FTP
iptables -A INPUT -i $INTERNET -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s $LOCAL -m state --state ESTABLISHED,RELATED -j ACCEPT

# Esta es la mas importante ya que prepara este systema como router para la LAN
iptables -t nat -A POSTROUTING -o $INTERNET -j MASQUERADE
iptables -A FORWARD -s $LOCAL -j ACCEPT

# Permitimos que la LAN tenga acceso ilimitado
iptables -A INPUT -s $LOCAL -j ACCEPT
iptables -A OUTPUT -s $LOCAL -j ACCEPT

# Redireccionamos (DNAT) las peticiones del puerto 80 de la LAN al squid por el puerto 3128 ($SQUID_PORT) aka transparent proxy
iptables -t nat -A PREROUTING -s $LOCAL -p tcp --dport 80 -j DNAT --to $SQUID_SERVER:$SQUID_PORT
#OJOOOO!!!! el squid3 NO repito NO hace cache de HTTPS (443) en las notas dire por que
#iptables -t nat -A PREROUTING -s $LOCAL -p tcp --dport 443 -j DNAT --to $SQUID_SERVER:$SQUID_PORT

# si son del mismo proxy
iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT
#iptables -t nat -A PREROUTING -i $INTERNET -p tcp --dport 443 -j REDIRECT --to-port $SQUID_PORT

#abrimos los demas puertos desde internet a la lan
iptables -A INPUT -i $INTERNET -j ACCEPT
iptables -A OUTPUT -o $INTERNET  -j ACCEPT

# DROP lo demas y lo agregamos al LOG
iptables -A INPUT -j LOG
iptables -A INPUT -j DROP


Ahora guardamos el script con el nombre que queramos, y lo ejecutamos con el siguiente comando:

                   $ sudo sh squid3script.sh
Con esto ya se puede usar el squid3 como proxy transparente, es decir simplemente lo ponemos antes de nuestros routers, y dejamos que el trafico pase por ellos, en pocas palabras este sera el gateway de nuestra lan.


       Notas:
           Se debe considerar que por una interfaz entrara el trafico, así que esta
                   NO debe tener gatway, o puerta de enlace predeterminada a internet.
                   La otra interfaz debe estar configurada para permitir el acceso a internet
                   y evitar conexiones provenientes de ella (considerando que no existan IDPS
                   u otro método de verificación y protección).
                   Se debe tener cuidado al agregar mas reglas a la tabla IPTABLE, ya que NO
                   sobreescribe las anteriores. (después posteare una configuración para por así decirlo
                   mejorar el rendimiento de nuestro Proxy ya que genera un Firewall básico.
                   Squid3 no maneja HTTPS el protocolo no esta soportado en la compilacion,
                   sin embargo se puede agregar la bandera al momento de la compilacion para que 
                   use SSL y otras cosillas por ahí con las cuales por cuestiones legales no podemos usar
                   en la institución donde logre esto. Ahora si es posible encontrar estos paquetes en la red.
                   Tener sumo cuidado en el formato en el squid.conf ya que si no se lleva el
                   orden adecuado, este mostrara errores.

8 comentarios:

  1. Gracias Isaac, buen trabajo, tengo una dudilla, hasta donde yo comprobé, te hablo del squid 2 estable en debian, con proxy transparente no filtraba los https, de forma que con pequeños programas tipo ultrasurf era capaz de encriptar toda la navegacion HTTP y meterla como https de forma que el squid se lo saltaba, como crees que se puede solucionar esto en proxy transparente.
    Manu

    ResponderEliminar
  2. Entendi que no quieres que el trafico HTTPS (puerto 443) no salte al proxy. Bueno lamento decirte que Squid3 ni el Squid2 tienen control sobre https ya que seria ilegal o por así decirlo entienden HTTPS, el ya sabe que son conexiones seguras ya están encriptadas y ademas el usuario acepta al momento de entrar a una pagina segura unas firmas digitales "unicas"(key AES RSA etc) ademas de otras cosillas de seguridad, la unica forma que he logrado o encontrado para manejar HTTPS ademas de IPTABLES, es recompilar Squid con unas opciones para manejar HTTPS con OpenSSL, hay documentacion en internet, apenas pueda probar recompilar para manejar https pondre un post, de todas formas te dejare un link con un ejemplo saludos. En este ejemplo el que realizara la conexion segura es el squid es decir el tendra los certificados de esta manera las conexiones https no los altaran espero te ayude http://www.mydlp.com/how-to-configure-squid-3-2-ssl-bumping-dynamic-ssl-certificate-generation/

    ResponderEliminar
  3. Amigo, tienes un error en el script de IPTABLES, cuando habilitas el forwarding:

    echo 1 > /proc/sys/net/ipv4/ip_forward <-- va sin la r al final

    Por lo demás, excelente.

    ResponderEliminar
  4. Es verdad, creo que se me escapo esa letra muchas gracias por la corrección.

    ResponderEliminar
  5. Amigo estoy leyendo tu articulo pero tengo unas dudas... son las siguientes:

    # Squid server IP
    SQUID_SERVER="172.16.0.12" #ip de la interfaz donde escuchara nuestro proxy

    (En la parte anterior es la ip que tiene nuestro servidor Squid cierto?) y tienes otra línea con lo siguiente:

    # Address connected to LAN
    LOCAL="192.168.1.0/27" #como declaramos en squid.conf es el rango de ips a escuchar

    (En la parte anterior se supone que es el segmento de red al cual le aplicaras el proxy no?)

    Entonces no se supone que el Servidor Squid debería de estar en el mismo segmento de red? Se supone que solo tienes dos tarjetas, una eth0 y eth1 supongamos... eth0 conectada a internet y eth1 a la red LAN con ip 192.168.1.0/27... Por que el squid tiene 172.16.0.12?

    Espero tu aclaración amigo muchas gracias.

    ResponderEliminar
  6. Amigo estoy leyendo tu articulo pero tengo unas dudas... son las siguientes:

    # Squid server IP
    SQUID_SERVER="172.16.0.12" #ip de la interfaz donde escuchara nuestro proxy

    (En la parte anterior es la ip que tiene nuestro servidor Squid cierto?) y tienes otra línea con lo siguiente:

    # Address connected to LAN
    LOCAL="192.168.1.0/27" #como declaramos en squid.conf es el rango de ips a escuchar

    (En la parte anterior se supone que es el segmento de red al cual le aplicaras el proxy no?)

    Entonces no se supone que el Servidor Squid debería de estar en el mismo segmento de red? Se supone que solo tienes dos tarjetas, una eth0 y eth1 supongamos... eth0 conectada a internet y eth1 a la red LAN con ip 192.168.1.0/27... Por que el squid tiene 172.16.0.12?

    Espero tu aclaración amigo muchas gracias.

    ResponderEliminar

ask me!!!

 

Just Linovaxion Copyright © 2013 - |- Template created by O Pregador - |- Powered by Blogger Templates