Movimiento Libre

Plataforma de divulgación de conocimiento

Instalación de Fedora Server 28, parte 5, proxy Squid

Vamos a configurar un proxy con Squid.

24 June 2018

Squid - archivos de configuración

Instale Squid...

# dnf install squid

En el directorio /etc/squid se deben de encontrar los archivos de configuración.

# cd /etc/squid

Ahí debe estar el archivo squid.conf. Éste puede cargar otros archivos conf, txt, css, etc.

Como puede ser muy extensa la configuración de Squid, vamos a dividir la configuración de squid.conf en archivos según su propósito. Comienze por el principal que cargará los demás...

# nano squid.conf

Con este contenido...

# Correo electronico
cache_mgr webmaster@miredlocal.lan

# Nombre de este servidor
visible_hostname miproxy

# Archivos separados de configuracion
include "/etc/squid/squid-01-declaraciones.conf"
include "/etc/squid/squid-02-accesos.conf"
include "/etc/squid/squid-03-opciones.conf"
include "/etc/squid/squid-04-balanceo.conf"

Squid - declaraciones

Cree squid-01-declaraciones.conf...

# nano squid-01-declaraciones.conf

Ajuste el contenido de acuerdo a sus necesidades...

# Puerto para permitir https
acl SSLPorts  port  443        # https
acl SSLPorts  port 5222        # .whatsapp.com, .whatsapp.net
acl SSLPorts  port 5228        # mtalk.google.com

# Puertos que se pueden usar
acl SafePorts port   21        # ftp
acl SafePorts port   70        # gopher
acl SafePorts port   80        # http
acl SafePorts port  443        # https
acl SafePorts port 1025-65535  # unregistered ports

# Declaración connect
acl CONNECT method CONNECT

# Desde y hacia Localhost
acl DesdeLocalhost    src        127.0.0.0/8
acl HaciaLocalhost    dst        127.0.0.0/8

# Desde y hacia LAN
acl DesdeLAN          src        192.168.4.0/24
acl HaciaLAN          dst        192.168.4.0/24

# Definiciones de sitios
acl SitiosPermitidos  dstdomain  "/etc/squid/sitios-permitidos.txt"
acl SitiosProhibidos  dstdomain  "/etc/squid/sitios-prohibidos.txt"

# Definiciones de expresiones regulares sobre publicidad
acl RegExpPublicidad  dstdom_regex -i "/etc/squid/regexp-publicidad.txt"

# Audio MP3
acl AudioMP3Mime      rep_mime_type  audio/mpeg
acl AudioMP3RegExp    urlpath_regex  \.mp3$

# Video MPEG4 (MPG4)
acl VideoMP4Mime      rep_mime_type  video/mp4 video/x-mp4
acl VideoMP4RegExp    urlpath_regex  \.mp4$

# Flash Video Format (FLV)
acl FlashVideoMime    rep_mime_type  video/flv video/x-flv
acl FlashVideoRegExp  urlpath_regex  \.flv$

# Flash General Media Scripts (SWF)
acl FlashMime         rep_mime_type  application/x-shockwave-flash
acl FlashRegExp       urlpath_regex  \.swf$

Squid - accesos

Cree squid-02-accesos.conf...

# nano squid-02-accesos.conf

Ajuste el contenido de acuerdo a sus necesidades...

# El administrador del cache 'manager' solo lo hará localhost
http_access         allow  DesdeLocalhost manager
http_access         deny                  manager

# NEGAR solicitudes por los puertos NO seguros
http_access         deny   !SafePorts

# NEGAR CONNECT a otros puertos NO SSL seguros
http_access         deny   CONNECT !SSLPorts

# Es recomendable negar conexiones a 127.0.0.1, éstas deben hacerce fuera del proxy
http_access         deny   HaciaLocalhost

# NEGAR Adobe Flash
http_access         deny   FlashRegExp

# Permitir sitios permitidos
http_access         allow  SitiosPermitidos

# NEGAR prohibidos y publicidad
http_access         deny   SitiosProhibidos
http_access         deny   RegExpPublicidad

# Permitir todo lo demás a localhost
http_access         allow  DesdeLocalhost

# Permitir equipos LAN
http_access         allow  DesdeLAN

# NEGAR TODO a todos los demás
http_access         deny   all

Squid - opciones

Cree squid-03-opciones.conf...

# nano squid-03-opciones.conf

Ajuste el contenido de acuerdo a sus necesidades...

# Puerto
http_port 3128

# Disk cache directory
# - ufs es el sistema de almacenamiento propio de Squid
# - /var/cache/squid es la ruta
# - 8192 es la cantidad en MB, debe tener como maximo 20% menos del tamano de la particion
#        la partición /var tiene 16 GB, así que 8 GB es la mitad
# -   64 es L1, el numero de subdirectorios de primer nivel
# -  256 es L2, el numero de subdirectorios de segundo nivel
cache_dir ufs /var/cache/squid 8192 64 256

# Tamano maximo por objeto
maximum_object_size 128 MB

# Cantidad de Memoria RAM que se usara antes de escribir en el disco
cache_mem 256 MB
cache_replacement_policy heap LFUDA

# Patrones de archivos y sus tiempos de permanencia en el cache
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

# Leave coredumps in the first cache dir
coredump_dir /var/cache/squid

# Tiempo de espera de cierre de conexiones
# al disminuirlo el apagado sera mas breve
shutdown_lifetime 12 seconds

Squid - balanceo

Cree squid-04-balanceo.conf...

# nano squid-04-balanceo.conf

Ajuste el contenido de acuerdo a sus necesidades...

# Se usaran esta cantidad de cubos
delay_pools 2

# Hay tres tipos de clases
# 1 - Tiene un unico cubo Global
# 2 - Tiene un cubo Global y 256 cubos individuales
# 3 - Tiene un cubo Global, 256 cubos de Red y 65536 individuales
# Declaracion de las clases de los cubos
#   delay_class N clase
delay_class 1 1
delay_class 2 2

# Los tamanos de los cubos son en bytes
# El contrato con Telmex es de hasta 10 Mb/s
# 1250000 bytes/seg =  10.0 Mb/s
#  625000 bytes/seg =   5.0 Mb/s
#  312500 bytes/seg =   2.5 Mb/s
#  250000 bytes/seg =   2.0 Mb/s
#  125000 bytes/seg =   1.0 Mb/s

# Cubo clase 1: 10/5 Mb/s
# Pocos equipos y grandes descargas
delay_parameters 1 1250000/625000

# Cubo clase 2: 10/10 Mb/s y 2/2 Mb/s
# Muchos equipos y carga balanceada
delay_parameters 2 1250000/1250000 250000/250000

# El primer cubo es para localhost
delay_access 1 allow DesdeLocalhost

# El segundo cubo es para la LAN
delay_access 2 allow DesdeLAN

Squid - stios permitidos y prohibidos

Baje las expresiones regulares para bloquear publicidad...

# wget "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=squid-dstdom-regex&showintro=0&mimetype=plaintext" -O regexp-publicidad.txt

Cree su lista de sitios de entera confianza sitios-permitidos.txt...

.wikipedia.org
.mediawiki.org
wikimediafundation.org
.ubuntu.com
.fedoraproject.org
fedoramagazine.org
.github.com
.osuosl.org
.movimientolibre.com

Y su lista negra con sitios prohibidos sitios-prohibidos.txt...

.microsoft.com
.windowsupdate.com
.msftncsi.com

Políticas de SELinux

Prepare el directorio para el caché...

# mkdir /var/cache/squid
# chown squid /var/cache/squid
# squid -z -N -f /etc/squid/squid.conf

Arranque el daemon...

# systemctl start squid.service
# systemctl status squid.service

En mi caso ha fallado porque las política de seguridad SELinux no permiten algunas acciones de Squid. Revise el estatus...

# systemctl status squid

Me reporta este error...

Ipc::Mem::Segment::create failed to shm_open

Al revisar los últimos registros en la bitácora...

# tail /var/log/audit/audit.log

Aparece una negación...

type=AVC msg=audit(1529629815.011:337): avc:  denied  { unlink } for  pid=2086 comm="squid" name="squid-cf__metadata.shm" dev="tmpfs" ino=32961 scontext=system_u:system_r:squid_t:s0 tcontext=unconfined_u:object_r:user_tmp_t:s0 tclass=file permissive=0

Si gusta profundizar en SELinux lea Fedora 22 SELinux User's and Administrator's Guide.

Opción 1:: Crear una nueva política a partir de la bitácora. Instale policycoreutils-python-utils...

# dnf install policycoreutils-python-utils

Como root nos vamos al directorio /root o donde podamos crear archivos...

# cd /root

1) Ejecute audit2allow alimentado por la bitácora audit.log...

# audit2allow -M MYSQUIDPOLICY < /var/log/audit/audit.log

2) Lea el texto de la política creada

# cat MYSQUIDPOLICY.te

3) Cargue la política, note que se usa el archivo pp...

# semodule -i MYSQUIDPOLICY.pp

4) Arranque el daemon...

# systemctl start squid.service
# systemctl status squid.service

5) Vuelva al paso uno si ha fallado el arranque de Squid.

Tuve que repetir siete veces este proceso para dar con la política correcta, que mostrando MYSQUIDPOLICY7.te es...

Opción 2:: Cree la política a partir del archivo de texto.

Instale policycoreutils-devel...

# dnf install policycoreutils-devel

Cree DnsmasqSquidPolicy.te...

# cd /root
# nano DnsmasqSquidPolicy.te

Con este contenido...

module DnsmasqSquidPolicy 1.0;

require {
        type squid_t;
        type dnsmasq_t;
        type user_tmp_t;
        type var_t;
        class capability dac_override;
        class file { append create getattr open read rename unlink write };
}

#============= dnsmasq_t ==============

allow dnsmasq_t self:capability dac_override;

#============= squid_t ==============

allow squid_t user_tmp_t:file unlink;
allow squid_t var_t:file unlink;
allow squid_t var_t:file { append create getattr open read rename write };

Compile e instale...

# checkmodule -M -m -o DnsmasqSquidPolicy.mod DnsmasqSquidPolicy.te
# semodule_package -o DnsmasqSquidPolicy.pp -m DnsmasqSquidPolicy.mod
# semodule -i DnsmasqSquidPolicy.pp

Arranque el daemon...

# systemctl start squid.service
# systemctl status squid.service

Arranque al encender y muro de fuego

Habilite que inicie el daemon al encender...

# systemctl enable squid

Verifique que el muro de fuego tenga abierto el servicio squid en la LAN...

# firewall-cmd --zone=internal --list-services
ssh mdns samba-client dhcpv6-client cockpit dns squid dhcp

Hacer que el servidor YA NO SEA un ruteador

Al estar habilitado el enmascaramiento, cualquier equipo puede acceder a Internet sin pasar por el proxy. Consulte con...

# firewall-cmd --zone=external --query-masquerade

Deshabilite el enmascaramiento con...

# firewall-cmd --zone=external --remove-masquerade

Haga pruebas con su navegador de internet en un equipo en la red local. Si configura sin proxy no debería tener Internet. Luego configure el proxy y pruebe que funcione.

Si tiene éxito, haga los cambios permanantes...

# firewall-cmd --runtime-to-permanent

Continuación...

Vaya a la parte 6, configuración del proxy en los clientes.