lunes, 12 de marzo de 2012

Pfsense 2: Configurar squid personalizado.

Modo No Transparente

Pfsense tiene squid que es un excelente o el mejor web-proxy que tenemos de lado de Unix/Linux, pero la configuracion que nos proporciona pfsense no es la mejor, por ello si deseamos sacarle provecho debemos nosotros mismos hacerlo.

Pero la desventaja es que cada que arranca pfsense arranca squid con la configuracion normal, asi que nosotros con la experiencia en Unix sabemos que podemos ejecutar scripts cuando unix arranca(pfsense).

En modo transparente, que es lo mas comun y comodo pfsense se encarga de habilitar las reglas en el firewall, pero si leen el foro tiene sus limitantes ya que el puerto 443 no cruza por squid, por ello yo prefiero hacer esto para controlar squid.

NOTA: Por nada del mundo, ni aunque les paguen 5 millones de dolares, graven algo en /var/squid/, cuando arranca pfsense borra todo lo que ahi se encuentre, yo hago un folder el /usr/local/etc/squid llamado acl y ahi meto todas mis acl.

Una vez configurado atraves del GUI squid en modo no transparente, creamos las siguientes reglas en el firewall para nuestra LAN, recordar que nadie va a salir sin no es atraves del proxy.

Reglas Default para Squid
Como podran observar, yo necesito minimo las primeras 3 reglas, el resto uso protocolos que no son afectados por squid.

Mi LAN solo puede hacer querys a mi dns(pfsense)
Mi LAN solo puede accesar a mi proxy(squid) que corre en mi propio pfsense.
Mi LAN puede accesar a cualquier servidor FTP.

Todo lo demas esta bloqueado, si algun chistoso quiere brincarse el proxy y eliminar la configuracion de su navegador se va a topar con pared, ya que no existe regla que permita a mis clientes pegarle a el puerto 80/443.

Squid en modo transparente de pfsense tiene este defecto, por ello hago yo todo este rollo.

Ya que hicimos lo anterior y nuestros clientes pueden navegar sin problemas, es hora de ensuciarnos las manos para cerrar todas las puertas y asegurar nuestra red.

1) Squid esta en /usr/local/etc/squid/
cd  /usr/local/etc/squid/

2) Creamos el folder de nombre acl
mkdir acl

3) Copeamos el archivo de configguracion y le ponemos squid-custom, estamos tomando el archivo  original que nos da pfsense como plantilla.
cp squid.conf squid-custom

4) Editamos squid-custom y lo dejamos asi:

######################################################################
# Do not edit manually !
http_port 192.168.50.1:3128
icp_port 0

pid_filename /var/run/squid.pid
cache_effective_user proxy
cache_effective_group proxy
error_directory /usr/local/etc/squid/errors/English
icon_directory /usr/local/etc/squid/icons
visible_hostname localhost
cache_mgr postmaster@localhost

access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log
cache_store_log none
logfile_rotate 0
shutdown_lifetime 3 seconds
# Allow local network(s) on interface(s)
acl localnet src  192.168.50.0/255.255.255.0
httpd_suppress_version_string on
uri_whitespace strip

#########custom options
check_hostnames off
log_fqdn off

cache_mem 8 MB
maximum_object_size_in_memory 32 KB
memory_replacement_policy heap GDSF
cache_replacement_policy heap LFUDA
cache_dir null /tmp
minimum_object_size 0 KB
maximum_object_size 10 KB
offline_mode off

# No redirector configured
# Setup some default acls
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl safeports port 21 70 80 210 280 443 488 563 591 631 777 901 249 3128 1025-65535
acl sslports port 443 563 249
acl manager proto cache_object
acl purge method PURGE
acl connect method CONNECT
acl dynamic urlpath_regex cgi-bin \?
acl unrestricted_hosts src "/usr/local/etc/squid/acl/unrestricted_hosts.acl"
acl blacklist dstdom_regex -i "/usr/local/etc/squid/acl/blacklist.acl"
cache deny dynamic
http_access allow manager localhost

######################################################################
###                     Opciones Personalzadas                     ###
######################################################################
###Servidores Ubuntu de la Red.
acl UBUNTU_LAN src "/usr/local/etc/squid/acl/UBUNTU_LAN.acl"
###Servidores de actualizacion para Ubuntu
acl UBUNTU_UP_SERVERS dstdomain "/usr/local/etc/squid/acl/UBUNTU_UP_SERVERS.acl"
###             Fin de acl's personalizadas                        ###

http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !safeports
http_access deny CONNECT !sslports

# Always allow localhost connections
http_access allow localhost

request_body_max_size 0 KB
reply_body_max_size 0 deny all
delay_pools 1
delay_class 1 2
delay_parameters 1 -1/-1 -1/-1
delay_initial_bucket_level 100
delay_access 1 allow all

######################################################################
###                     Opciones Personalzadas                     ###
######################################################################
###                  Nuestras ACL's en operacion.                  ###
### ACL sin restricciones
http_access allow unrestricted_hosts
http_access deny unrestricted_hosts

### ACL para que mis ubuntu's puedan actualizarse.
http_access allow UBUNTU_LAN UBUNTU_UP_SERVERS
http_access deny UBUNTU_LAN
###                     Fin de mis ACL's                           ###
######################################################################

# Setup allowed acls
# Allow local network(s) on interface(s)
#http_access allow localnet
# Default block all to be sure
### Siempre debemos acabar con esta restriccion
### bloquea todo lo no declarado
http_access deny all

######################################################################

Como podran ver, marque los puntos donde debemos poner atencion:

access_log /var/squid/logs/access.log ==> Donde almacena squid sus logs para obtener los reportes y saber cuando algo nos esta bloqueado aqui debemos revisar primero.


cache_log /var/squid/logs/cache.log ==> Donde almacen squid el cache.



logfile_rotate 0 ==> Cada cuanto squid rota sus logs, por que 0? Yo me encargo de ello para mayor control, no uso el lightsquid, uso sarg, en otro post de mi blog viene.




cache_dir null /tmp ==> Recordar que este servidor corre la version nano, asi que yo quiero bloquear no cachear, asi que pfsense sabe y por ello el mismo lo configura, recordar que podemos cachear o solo bloquear.


acl unrestricted_hosts src "/usr/local/etc/squid/acl/unrestricted_hosts.acl" ==> Aqui colocamos las IP's o usuarios que no tiene restricciones, como nuestros equipos y los de los jefes.
 
acl blacklist dstdom_regex -i "/usr/local/etc/squid/acl/blacklist.acl" ==> Por default aqui van todos los sitios que nadie puede usar, como faceboook, youtube, etc, etc, si vamos a controlar todo, aqui ponemos '.' y bloquea todo, ya con las ACL abrimos las paginas de cada grupo, es poderoso squid.

acl UBUNTU_LAN src "/usr/local/etc/squid/acl/UBUNTU_LAN.acl" ==> Aqui estoy declarando que este acl tiene los IP's de mis servidores ubuntu que desean actualizarse.

acl UBUNTU_UP_SERVERS dstdomain "/usr/local/etc/squid/acl/UBUNTU_UP_SERVERS.acl" ==> Este acl le indico a squid que deseo manejar aqui los sitios externos para que mis servidores ubuntu puedan instalar, actualizarse, etc.

http_access allow unrestricted_hosts ==> acl's en operacion, iniciamos por permitir a mis jefes el acceso sin restricciones, siempre como regla de oro, una vez que permitimos algo debemos enseguida bloquearlo, asi trabaja squid.

 
http_access deny unrestricted_hosts ==> regla de oro.


http_access allow UBUNTU_LAN UBUNTU_UP_SERVERS ==> Uniendo acl's, aqui le indico que lo que esta dado de alta en UBUNTU_LAN puede accesar UBUNTU_UP_SERVERS asi de simple.

http_access deny UBUNTU_LAN ==> Regla de Oro.

http_access deny all ==> Regla de Oro general, una vez que terminamos de configurar los accesos a nuestras acl's debemos bloquear todo.


5) Llenar de datos nuestras acl:


Contenido de unrestricted_hosts.acl:
192.168.50.100/32


Contenido de blacklist.acl:
.


Contenido de UBUNTU_LAN.acl:
192.168.50.101/32


Contenido de UBUNTU_UP_SERVERS.acl:

.ubuntu.com
.canonical.com



6) Copeamos el contenido de squid-custom a squid.conf
cp squid-custom squid.conf

7) Validamos la configuracion de squid, no deben dar ningun error de lo contrario debemos reparar antes de continuar, por lo regular son errores de escritura.

squid -k parse
Si no hay problemas no sale nada en pantalla.

8) Le pedimos a squid que levante nuestra nueva configuración:


squid -k reconfigure

Si revisamos nuestra cache.log vamos ver esto:

2012/03/11 22:41:35| Reconfiguring Squid Cache (version 2.7.STABLE9)...
2012/03/11 22:41:35| FD 15 Closing HTTP connection
2012/03/11 22:41:35| FD 16 Closing HTCP socket
2012/03/11 22:41:35| FD 18 Closing SNMP socket
2012/03/11 22:41:35| logfileClose: closing log /var/squid/logs/access.log
2012/03/11 22:41:35| Including Configuration File: /usr/local/etc/squid/squid.conf (depth 0)
2012/03/11 22:41:35| Initialising SSL.
2012/03/11 22:41:35| logfileOpen: opening log /var/squid/logs/access.log
2012/03/11 22:41:35| Store logging disabled
2012/03/11 22:41:35| Referer logging is disabled.
2012/03/11 22:41:35| DNS Socket created at 0.0.0.0, port 15972, FD 13
2012/03/11 22:41:35| Adding domain misitio dyndns org from /etc/resolv.conf
2012/03/11 22:41:35| Adding nameserver 127.0.0.1 from /etc/resolv.conf
2012/03/11 22:41:35| Adding nameserver dns1 from /etc/resolv.conf
2012/03/11 22:41:35| Adding nameserver dns2 from /etc/resolv.conf
2012/03/11 22:41:35| Accepting proxy HTTP connections at 192.168.50.1, port 3128, FD 15.
2012/03/11 22:41:35| Accepting HTCP messages on port 4827, FD 16.
2012/03/11 22:41:35| Accepting SNMP messages on port 3401, FD 18.
2012/03/11 22:41:35| WCCP Disabled.
2012/03/11 22:41:35| Loaded Icons.
2012/03/11 22:41:35| Ready to serve requests.


No se observa ningun problema.

9) Prueban con su clientes, no deben tener problemas.

10) Crear batch para que cada que arranque pfsense cargue nuestra configuracion.
Para esto necesitamos crear nuestra batch en /usr/local/etc/rc.d/

Con nuestra editor ingresamos estos datos a el nuevo archivo de nombre zsquid.sh:

#!/bin/sh
#2012-03-11
#Batch para re-cargar la version personalizada de squid
cp /usr/local/etc/squid/squid-custom /usr/local/etc/squid/squid.conf

#Le pedimos a squid que se reconfigure usando nuestra configuracion
/usr/local/sbin/squid -k reconfigure


Modificamos nuestro batch para que tenga el bit de ejecutable:


chmod +x zsquid.sh


Por que z? Recordar que Unix arranca los batches por orden alfabetico, ahi mismo se localiza el batch que arranca squid, y la "S" es antes que la "Z", por ello nos conviene que primero arranque squid con la configuracion normal y despues nuestra configuracion.

11) Por ultimo ya solo para comprobar que todo va a funcionar, debemos reiniciar a pfsense, no debe de haber problemas.


shutdown -r now.


En la consola cuando reinicie aparece algo asi:


Starting /usr/local/etc/rc.d/zsquid.sh...done.

En mi caso es el ultimo servicio en arrancar lo que indica que mis cambios estan operando.


12) Cron para rotar los logs todos los dias.


59 23 * * * /usr/local/sbin/squid -k rotate


Con esto ya no necesitamos que squid rote sus logs, nosotros lo vamos hacer.


13) Listo, ya tenemos una configuracion de squid personalizada y poderosa, ya solo es cuestion que cada quien la configure a sus necesidades.

14) Para la version nano cuando arranca posiblementes les muestre este error en la consola:


Error de arranque squid version nano.
Si observan la figura anterior squid nos manda un error que nos falta un archivo de nombre: unrestricted_host.acl, y apunta a el directorio: /var/squid/acl.

Por que? Bien recordar que pfsense version nano se carga en memoria, entoces muchas particiones como /var su contenido se crea al momento del arranque, por ello cuando squid arranca se crea su folder de 0 y automaticamente todo lo que ahi se localice es sobreescrito.

Aparte como es mas rapido el arranque que la creacion de archivos entonces le esta ganando squid a el arranque de pfsense.

Como podemos atacarlo?

Bien por ahi  encontrado que la manera de hacerlo es editando el archivo principal de squid que ahi nos dice: squid.inc localizado en /usr/local/pkg/squid.inc.

Aparte nos dice que la linea 844 o 848 pero por ahi anda, lo abrimos con el editor y nos vamos a esa linea, vamos a ver algo asi:


$options = array(       'unrestricted_hosts' => 'src',
                                 'banned_hosts' => 'src',
                                'whitelist' => 'dstdom_regex -i',
                                'blacklist' => 'dstdom_regex -i',
);


Como estamos editando nuestra propia configuracion y nuestros acl se localizan en /usr/local/etc/squid/acl, pues vamos hackeando pfsense y ver como nos va,  comentamos esa linea y la volvemos a crear sin el parametro que nos esta afectando, quedaria asi:


$options = array(       
                                 #'unrestricted_hosts' => 'src',
                                 'banned_hosts' => 'src',
                                'whitelist' => 'dstdom_regex -i',
                                'blacklist' => 'dstdom_regex -i',
);


Salvamos, reiniciamos y vemos si ya no se nos presenta ese mensaje.


15) Fin.


NOTA: Recordar que si van a hacer cambios en la configuracion deben modificar squid-custom y ademas deben respaldar tanto squid-custom y todos los acl's que estan usando.


22 comentarios:

qlaaudio dijo...

Gracias :D
Me ayudaste un monton!

Pedro Moreno dijo...

De nada, un saludo!!!

Anónimo dijo...

hola!! leí todo y no termine de entender mucho... si hago todo esto, el resultado seria usar el proxy pfsense en modo no transparente pero para los usuarios seria como transparente para los puertos 443 y 80?... es que estoy con un problema en mi trabajo y no se como solucionarlo. lo que quiero hacer es colocar un pfsense para que funcione como proxy con filtros pasando por el 3128 si o si y ademas que sea transparente para el usuario porque es para un wifi para el publico entonces no puedo exigirle a la gente que coloque una ip y un puerto en sus navegadores!! seria algo loco!! y estoy buscando por todos lados como hacer eso y no encuentro si me puedes ayudar en algo te lo agradeceria!! xaviermedina@outlook.com

Pedro Moreno dijo...

Si sigues este tutorial busca aqui mismo uno que habla de WPAD, este se usa para enviar los parametros a los navegadores automaticamente, asi te ahorraras el tener que hacerlo manualmente.

Revisa aqui mismo en uno de los tutoriales hacer da wpad, dudas me avisas, sopas!!!

Osvaldo dijo...

Estimado vi tu tutorial y esta excelente, de casualidad has realizado alguna configuracion para que cada que se conecten los usuarios a internet o bien abran su explorador les aparezca la misma pagina a todos, algo asi como la pagina de inicio, pero enviarla desde el pfsense.

Sambo dijo...

Modifique el script "zquid.sh" para que funcione si squid no fue encendido por pfsense por algún motivo, ya que me sucedió que si intento reiniciarlo desde la Web GUI queda apagado el servicio.
El mod está inspirado en el propio script de inicio de squid para pfsense.

###################################
#!/bin/sh
#2012-03-11
#Si no arranco Squid le damos un empujoncito
if [ -z "`ps auxw | grep "[s]quid -D"`" ];
then
/usr/local/sbin/squid -D
cp /usr/local/etc/squid/squid-custom.conf /usr/local/etc/squid/squid.conf
sleep 2
/usr/local/sbin/squid -k reconfigure
else
cp /usr/local/etc/squid/squid-custom.conf /usr/local/etc/squid/squid.conf
/usr/local/sbin/squid -k reconfigure
fi
#Batch para re-cargar la version personalizada de squid
#cp /usr/local/etc/squid/squid-custom.conf /usr/local/etc/squid/squid.conf

#Le pedimos a squid que se reconfigure usando nuestra configuracion
#/usr/local/sbin/squid -k reconfigure

###################################

pozolero dijo...

Que tal periko, soy usuario del foro pfsense y he leido tus excelentes tutoriales.

Tengo un problema, manejo squid + squidguard (a este le active la opción de no dejar navegar a páginas por medio de la ip)

Pero mis usuarios con skype o con alguna página a la que se conectan por ip tienen problemas.

Intenté crear reglas en el firewall con los rangos a manera de CIDR de las páginas que si se pueden accesar por medio de ip, pero tal parece que pfsense lee las restricciones de la siguiente manera: squidguard + squid + firewall.

Entonces por más que abra las páginas en el firewall, squidguard se encarga de detectar las ip y bloquea todo.

Entonces pense, si se puede hacer ese bloqueo utilizando squid, es decir, bloquear navegación a páginas por su ip, y manejar una regla que utilice rango CIDR de las páginas que si quiero que deje navegar?

Alguna idea, solución?

Esto es para bloquear definitivamente el uso de ultrasurf, ya que se conecta por medio de ip's, pero sin afectar a los usuarios que necesitan conectarse a páginas sin dominio.

Saludos

Pedro Moreno dijo...

mmm aun no manejo squidguard, con squid no hay problema, dejame lo hecho a volar para entenderlo, me gustaria darte mas info que puede ayudarte pero squidguard estoy novato.

Me imagino que los logs dice que esta bloqueando verdad? Si es correcto muestra la config por fa, saludos!!!

Jan McQuack dijo...

Hola Pedro exelente Blog, muy útil para filtar https, intente hacer como tu lo hiciste, me salio todo. Pero cuando edito con el vi blacklist.acl para bloquear los sitios que quiero que no entren, no pude. Quizás hay algo que doy por echo pero no lo entendí.

Tengo instalado en el PFsense de prueba la versión 2.0.1 con el paquete squid.
Si podes explicarme quizás me salte algo.

Saludos desde Uruguay

Jan McQuack dijo...

Hay algo que no explique, pude editar el blacklist.acl en la carpeta de los acl.
Pero cuando voy a entrar a cualquier sitio bloqueado, me deja entrar igual las paginas con http o https.

Perdon pero me habia explicado antes mal, si esto no se sabia que preguntaba.

Gracias y saludos

Pedro Moreno dijo...

Hola, espero no tengas todos tus clientes bajo unrestricted?

Si es asi nunca tocan el blacklist...

????

Squidblacklist dijo...

Squidblacklist.org is the worlds leading publisher of native acl blacklists tailored specifically for Squid proxy, and alternative formats for all major third party plugins as well as many other platforms. Including SquidGuard, DansGuardian, and ufDBGuard, as well as pfSense and more.

There is room for better blacklists, we intend to fill that gap.

It would be our pleasure to serve you.

Signed,

Benjamin E. Nichols
http://www.squidblacklist.org

Edson Cavides R dijo...

Interesante man, estaba buscando documentacion de Pfsense, y lo mejor que lo hayas hecho desde linea de comandos, exelente 10 pntsss!!!

Pedro Moreno dijo...

No hay nada como la linea de comandos aun, saludos y gracias!!!

Roca Oca dijo...

Hola Pedro, he estado usando el proxy transparente pero me encuentro con el problema de no poder aplicar reglas especificas al firewall sobre mis Vlans (por ejemplo limitar el ancho de banda a algún host en alguna Vlan específica) ya que todo el tráfico del puerto 80 pasa de manera trasparente y lo puedo manejar desde el firewall. ¿Podría de esta forma solucionar mi problema?

Roca Oca dijo...

Hola Pedro, he estado usando el proxy transparente pero me encuentro con el problema de no poder aplicar reglas especificas al firewall sobre mis Vlans (por ejemplo limitar el ancho de banda a algún host en alguna Vlan específica) ya que todo el tráfico del puerto 80 pasa de manera trasparente y No lo puedo manejar desde el firewall. ¿Podría de esta forma solucionar mi problema?

eduardo dijo...

me sale este error cd /usr/local/etc/squid/

no such file or directory

Pedro Moreno dijo...

Recuerda que pfsense ha modificado donde instala los programas, usa el comando find de Unix, saludos.

Unknown dijo...

Hola! amigo
disculpa pero soy nuevo utilizando pfsense, y no comprendo donde debo de insertar esas lineas de codigos.
yo estoy trabajando, desde la pagina de pfsense, ya realice varias reglas y si me funcionan, me bloquean paginas y todo pero no me deja iniciar sesion en skype.

Pedro Moreno dijo...

Skype utiliza un puerto en especifico, creo que por ahi va tu problema, saludos.

Unknown dijo...

tengo una inquietud sitio ejemplo http://xyz/ al iniciar el servicio me bloquea cierto sitio aun lo añado en el whitelist y aun sigue siendo denegado en estos casos como se puede solventar dicha problematica

Leonardo sisi dijo...

Hola, buenas noches. Estoy configurando pfsense con squid no trasparente con autenticacion local pero al poner usuario y contraseña en el navegador del cliente me vuelve a pedir los datos como si estuvieran mal. Despues me muestra el error cache access denied, podrian darme una mano con este problema?