Cómo instalar y configurar el servidor proxy Squid en Rocky Linux/Alma Linux 9

Un servidor proxy está situado entre dos redes y actúa como puerta de enlace entre un usuario final y un recurso de Internet. A través de un servidor proxy, un usuario final puede filtrar los accesos. Pueden controlar y supervisar el tráfico web con diversos fines, como la privacidad, la seguridad y el almacenamiento en caché.

Squid se utiliza como mecanismo de caché distribuido, al guardar los datos obtenidos de diferentes peticiones, aumentando la velocidad del tráfico cuando se realizan peticiones similares. Si el servidor de caché no tiene los datos almacenados, entonces reenvía la petición al servidor web donde están almacenados los datos.

En este tutorial, aprenderás a instalar y configurar Squid Proxy en un servidor Rocky / Alma Linux 9.

Requisitos previos

  • Un servidor con Rocky Linux 9 o Alma Linux 9.
  • Un usuario no root con privilegios sudo.
  • Asegúrate de que todo está actualizado.
    $ sudo dnf update
    
  • Instala los paquetes de utilidades básicas. Es posible que algunos de ellos ya estén instalados.
    $ sudo dnf install wget curl nano unzip yum-utils -y
    

Paso 1 – Instalar Squid

El repositorio Epel es necesario para instalar Squid. Instala el repositorio Epel.

$ sudo dnf install epel-release

Instala el proxy Squid.

$ sudo dnf install squid

Verifica la instalación.

$ squid --version
Squid Cache: Version 5.2
Service Name: squid

This binary uses OpenSSL 3.0.1 14 Dec 2021..........

Habilita e inicia el servicio Squid.

$ sudo systemctl enable squid --now

Comprueba el estado del servicio.

$ sudo systemctl status squid
? squid.service - Squid caching proxy
     Loaded: loaded (/usr/lib/systemd/system/squid.service; enabled; vendor preset: disabled)
     Active: active (running) since Wed 2022-09-28 11:52:24 UTC; 2min ago
       Docs: man:squid(8)
    Process: 94622 ExecStartPre=/usr/libexec/squid/cache_swap.sh (code=exited, status=0/SUCCESS)
   Main PID: 94624 (squid)
      Tasks: 3 (limit: 5915)
     Memory: 16.3M
        CPU: 4.207s
     CGroup: /system.slice/squid.service
             ??94624 /usr/sbin/squid --foreground -f /etc/squid/squid.conf
             ??94626 "(squid-1)" --kid squid-1 --foreground -f /etc/squid/squid.conf
             ??94627 "(logfile-daemon)" /var/log/squid/access.log

Sep 28 11:52:24 squidproxy systemd[1]: Starting Squid caching proxy...
Sep 28 11:52:24 squidproxy squid[94624]: Squid Parent: will start 1 kids
Sep 28 11:52:24 squidproxy squid[94624]: Squid Parent: (squid-1) process 94626 started
Sep 28 11:52:24 squidproxy systemd[1]: Started Squid caching proxy.

Paso 2 – Configurar el proxy Squid

Squid almacena su configuración en el archivo /etc/squid/squid.conf. Comprueba el contenido del archivo sin los comentarios.

$ sudo grep -vE "^#|^$" /etc/squid/squid.conf

El comando anterior filtra todas las sentencias que empiezan por # que representan comentarios. Obtendrás la siguiente salida.

acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # 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
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all
http_port 3128
coredump_dir /var/spool/squid
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

El primer paso para editar la configuración es hacer una copia de seguridad de la configuración existente.

$ sudo cp /etc/squid/squid.conf{,.bak}

Abre el archivo para editarlo.

$ sudo nano /etc/squid/squid.conf

1. Configurar las políticas de acceso de Squid

La lista de control de acceso (ACL) define quién puede utilizar Squid como proxy en tu red local.

Vamos a añadir hosts en la subred 192.168.204.0/24 definiendo las reglas como se indica a continuación.

acl newlocalnet src 192.168.205.0/24

Esto crea una nueva ACL conocida como newlocalnet con los hosts de la subred.

Para permitir el acceso a esta ACL, añade la siguiente línea debajo de la línea http_access deny all.

http_access allow newlocalnet

Squid lee el archivo de configuración de arriba a abajo.

2. Bloqueo de sitios web

Crea un archivo para almacenar los dominios a bloquear.

$ sudo nano /etc/squid/blocked-sites

Añade los sitios web a bloquear. Por ejemplo,

example.com
example.net
example.org

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Abre el archivo de configuración de Squid.

$ sudo nano /etc/squid/squid.conf

Añade las siguientes líneas.

acl blocked_sites dstdomain "/etc/squid/blocked-sites"
http_access deny blocked_sites

3. Bloquear la descarga de determinados archivos

También puedes bloquear la descarga de archivos con extensiones específicas. Crea un archivo para almacenar las extensiones que quieras bloquear.

$ sudo nano /etc/squid/blocked-filextensions

Pega las siguientes extensiones de archivo en el formato especificado.

\.exe(\?.*)?$
\.bat(\?.*)?$
\.tar(\?.*)?$
\.mp3(\?.*)?$
\.mp4(\?.*)?$

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Pega el siguiente código en el archivo de configuración de Squid.

acl blockfiles urlpath_regex -i "/etc/squid/blocked-filextensions"
http_access deny blockfiles

4. Bloquear sitios web con palabras clave

Crea un archivo de configuración para las palabras clave a bloquear.

$ sudo nano /etc/squid/banned-keywords

Pega las siguientes palabras clave.

porn
gamble
ads
movie

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Realiza los siguientes cambios en el archivo de configuración de Squid.

acl keyword-ban url_regex "/etc/squid/banned-keywords"
http_access deny keyword-ban

5. Enmascarar la dirección IP del Cliente

Puedes anonimizar el tráfico no exponiendo las direcciones IP del cliente añadiendo las siguientes líneas en el archivo de configuración de Squid.

# Anonymize Traffic
via off
forwarded_for off
request_header_access Allow allow all
request_header_access Authorization allow all
request_header_access WWW-Authenticate allow all
request_header_access Proxy-Authorization allow all
request_header_access Proxy-Authenticate allow all
request_header_access Cache-Control allow all
request_header_access Content-Encoding allow all
request_header_access Content-Length allow all
request_header_access Content-Type allow all
request_header_access Date allow all
request_header_access Expires allow all
request_header_access Host allow all
request_header_access If-Modified-Since allow all
request_header_access Last-Modified allow all
request_header_access Location allow all
request_header_access Pragma allow all
request_header_access Accept allow all
request_header_access Accept-Charset allow all
request_header_access Accept-Encoding allow all
request_header_access Accept-Language allow all
request_header_access Content-Language allow all
request_header_access Mime-Version allow all
request_header_access Retry-After allow all
request_header_access Title allow all
request_header_access Connection allow all
request_header_access Proxy-Connection allow all
request_header_access User-Agent allow all
request_header_access Cookie allow all
request_header_access All deny all

6. Cambiar el puerto proxy de Squid

Por defecto, el servidor proxy Squid escucha en el puerto 3128. Para cambiarlo, debes comentar la línea http_port 3128 en el archivo de configuración de Squid y cambiarla de la siguiente manera.

# Squid normally listens to port 3128
# http_port 3128
http_port 7035

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Valida la configuración.

$ sudo squid -k parse

Obtendrás la siguiente salida.

2022/10/04 12:29:25| Startup: Initializing Authentication Schemes ...
2022/10/04 12:29:25| Startup: Initialized Authentication Scheme 'basic'
2022/10/04 12:29:25| Startup: Initialized Authentication Scheme 'digest'
2022/10/04 12:29:25| Startup: Initialized Authentication Scheme 'negotiate'
2022/10/04 12:29:25| Startup: Initialized Authentication Scheme 'ntlm'
2022/10/04 12:29:25| Startup: Initialized Authentication.
2022/10/04 12:29:25| Processing Configuration File: /etc/squid/squid.conf (depth 0)
2022/10/04 12:29:25| Processing: acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
2022/10/04 12:29:25| Processing: acl localnet src 10.0.0.0/8            # RFC 1918 local private network (LAN)
................
2022/10/04 12:29:25| Processing: acl Safe_ports port 777                # multiling http
2022/10/04 12:29:25| Processing: http_access deny !Safe_ports
2022/10/04 12:29:25| Processing: http_access deny CONNECT !SSL_ports
2022/10/04 12:29:25| Processing: http_access allow localhost manager
2022/10/04 12:29:25| Processing: http_access deny manager
2022/10/04 12:29:25| Processing: http_access allow localnet
2022/10/04 12:29:25| Processing: http_access allow localhost
2022/10/04 12:29:25| Processing: http_access deny all
2022/10/04 12:29:25| Processing: http_port 3128
2022/10/04 12:29:25| Processing: coredump_dir /var/spool/squid
2022/10/04 12:29:25| Processing: refresh_pattern ^ftp:          1440    20%     10080
2022/10/04 12:29:25| Processing: refresh_pattern ^gopher:       1440    0%      1440
2022/10/04 12:29:25| Processing: refresh_pattern -i (/cgi-bin/|\?) 0    0%      0
2022/10/04 12:29:25| Processing: refresh_pattern .              0       20%     4320
2022/10/04 12:29:25| Initializing https:// proxy context
2022/10/04 12:29:25| Requiring client certificates.

Reinicia el servidor Squid.

$ sudo systemctl restart squid

Comprueba si Squid está escuchando en el puerto establecido.

$ sudo ss -altnp | grep 8085
LISTEN 0      4096               *:7035            *:*    users:(("squid",pid=94626,fd=11))

7. Configurar el Firewall / SELinux

Si estás utilizando el puerto por defecto, utiliza los siguientes comandos para permitirlo a través del cortafuegos.

$ sudo firewall-cmd --add-service=squid --permanent
$ sudo firewall-cmd --reload

Si has habilitado un puerto personalizado, utiliza los siguientes comandos en su lugar. Sustituye [port_number] por tu número de puerto personalizado.

sudo firewall-cmd --permanent --add-port=[port_number]/tcp
sudo firewall-cmd --reload

También tendrás que habilitar el puerto personalizado mediante SELinux.

sudo semanage port -a -t squid_port_t -p tcp [port_number]

Paso 3 – Configurar la autenticación básica para Squid

Para configurar Squid para que acepte la autenticación, tendremos que utilizar la utilidad htpasswd. Instala el paquete de herramientas de Apache.

$ sudo dnf install httpd-tools

Crea un par de nombre de usuario y contraseña con el siguiente comando.

$ sudo htpasswd -c /etc/squid/squid_passwd username

Se te pedirá que crees una contraseña para el usuario.

Cambia la propiedad del archivo al usuario Squid.

$ sudo chown squid /etc/squid/squid_passwd

Squid se autentifica utilizando un ayudante de autenticación. Nosotros utilizaremos el ayudante ncsa_auth. Comprueba la ubicación del archivo ncsa_auth.

$ sudo rpm -ql squid | grep ncsa_auth
/usr/lib64/squid/basic_ncsa_auth
/usr/share/man/man8/basic_ncsa_auth.8.gz

El primer resultado es la ubicación del archivo.

Pega las siguientes líneas en la configuración de Squid.

auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/squid_passwd
acl ncsa_users proxy_auth REQUIRED
http_access allow ncsa_users

Reinicia Squid para activar la autenticación.

$ sudo systemctl restart squid

Paso 4 – Configurar los clientes proxy de Squid

Necesitas que los clientes se conecten al servidor proxy Squid. Hay tres formas de conectarse al servidor:

  1. Configuración del proxy en todo el sistema
  2. Utilizando el servidor Squid como puerta de enlace
  3. Utilizando un navegador web como cliente

1. Configuración del proxy en todo el sistema

Puedes configurar el proxy Squid para que funcione en todo el sistema creando un archivo /etc/profile.d/squid.sh que defina la configuración del proxy.

$ sudo nano /etc/profile.d/squid.sh

Pega las siguientes líneas.

PROXY_URL="192.168.205.10:7035"
HTTP_PROXY=$PROXY_URL
HTTPS_PROXY=$PROXY_URL
FTP_PROXY=$PROXY_URL
http_proxy=$PROXY_URL
https_proxy=$PROXY_URL
ftp_proxy=$PROXY_URL
export HTTP_PROXY HTTPS_PROXY FTP_PROXY http_proxy https_proxy ftp_proxy

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida. Obtén el archivo.

$ source /etc/profile.d/squid.sh

Verifica la configuración ejecutando el comando wget.

$ wget google.com
--2022-10-04 12:15:59--  http://google.com/
Connecting to 192.168.205.10:7035... connected.
Proxy request sent, awaiting response... 301 Moved Permanently
Location: http://www.google.com/ [following]
--2022-10-04 12:15:59--  http://www.google.com/
Reusing existing connection to 192.168.205.10:7035.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html.1’

index.html.1       [ <=>             ]  14.14K  --.-KB/s    in 0s      

2022-10-04 12:15:59 (68.1 MB/s) - ‘index.html.1’ saved [14479]

Para utilizarlo con tu nombre de usuario y contraseña, utiliza el siguiente comando.

$ wget google.com --proxy-user=YOUR-USERNAME-HERE --proxy-password=YOUR-PASSWORD-HERE

Puedes comprobar los registros del servidor Squid.

1664885759.296      0 192.168.205.10 TCP_MEM_HIT/301 750 GET http://google.com/ - HIER_NONE/- text/html
1664885759.351     54 192.168.205.10 TCP_MISS/200 15113 GET http://www.google.com/ - HIER_DIRECT/216.58.208.100 text/html

2. Configuración del proxy en el navegador

Puedes configurar el proxy de Squid para que funcione en el navegador Firefox o Chrome fácilmente. Pero el método por defecto no admite el nombre de usuario y la contraseña. Tendrás que utilizar una extensión de terceros en tu navegador para utilizar el proxy de Squid con autenticación. Utiliza FoxyProxy Standard para el navegador Firefox y Proxy SwitchOmega para Chrome y los navegadores basados en Chrome.

Vamos a probar el uso de la extensión FoxyProxy Standard en Chrome. Instala la extensión utilizando la URL indicada anteriormente. Abre las opciones de la extensión y obtendrás la siguiente pantalla.

Página de inicio de la extensión FoxyProxy

Haz clic en el botón Añadir para añadir la URL del proxy.

FoxyProxy Añadir URL

Introduce los parámetros del proxy, incluyendo un nombre para el servicio, la dirección IP, el número de puerto, el nombre de usuario y la contraseña. Activa la opción No utilizar para localhost y direcciones IP de intranet/privadas.

Haz clic en el botón Guardar para continuar. Selecciona el nombre del proxy en el desplegable de la página siguiente para habilitarlo.

Activar SquidProxy en FoxyProxy

La pantalla debería ser como la siguiente.

Lista de proxies de FoxyProxy

Visita la URL https://whatismyip.com para comprobar si el proxy funciona.

Prueba del navegador SquidProxy

Como hemos enmascarado la IP del cliente, verás la dirección IP del servidor donde está alojado el proxy Squid.

También puedes comprobarlo a través de los registros de Squid.

$ sudo tail -f /var/log/squid/access.log

Obtendrás la siguiente salida.

1664909025.814    251 127.0.0.1 TCP_TUNNEL/200 8662 CONNECT mirrors.rockylinux.org:443 - HIER_DIRECT/2a04:4e42:9::644 -
1664909025.819      3 127.0.0.1 TCP_MISS/200 3347 GET http://mirror.nl.stackscale.com/rocky/9.0/extras/x86_64/os/repodata/repomd.xml - HIER_DIRECT/5.57.230.252 text/xml
1664909026.218    395 127.0.0.1 TCP_TUNNEL/200 8446 CONNECT apprepo.vultr.com:443 - HIER_DIRECT/45.63.19.147 -
1664909027.084      0 223.190.89.32 TCP_DENIED/403 3974 CONNECT www.whatismyip.com:443 - HIER_NONE/- text/html
1664909442.461     73 223.190.89.32 TCP_MISS/200 2362 POST http://ocsp.godaddy.com/ - HIER_DIRECT/192.124.249.41 application/ocsp-response
1664909612.229 171207 223.190.89.32 TCP_TUNNEL/200 6174 CONNECT api.whatismyip.com:443 - HIER_DIRECT/34.98.116.180 -
1664909612.245 172627 223.190.89.32 TCP_TUNNEL/200 67818 CONNECT www.whatismyip.com:443 - HIER_DIRECT/104.21.89.158 -
1664909613.231 171384 223.190.89.32 TCP_TUNNEL/200 3712 CONNECT apiv6.whatismyip.com:443 - HIER_DIRECT/2600:1901:0:e01d:: -
1664910098.088   3098 223.190.89.32 TCP_TUNNEL/200 10403 CONNECT profile.accounts.firefox.com:443 - HIER_DIRECT/52.40.171.113 -
1664910103.232    545 223.190.89.32 TCP_TUNNEL/200 6165 CONNECT safebrowsing.googleapis.com:443 - HIER_DIRECT/172.217.168.234 -

3. Configurar el DNF para utilizar el proxy Squid

El repositorio DNF puede configurarse para utilizar el proxy Squid. Abre el archivo de configuración de DNF.

$ sudo nano /etc/dnf/dnf.conf

Pega las siguientes líneas al final del archivo.

proxy=http://192.168.205.12:8085/
proxy_username=username
proxy_password=password

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.

Comprueba los cambios actualizando el sistema o instalando algún paquete.

$ sudo dnf update

Comprueba los registros.

http://mirror.nl.stackscale.com/rocky/9.0/AppStream/x86_64/os/Packages/t/telnet-0.17-85.el9.x86_64.rpm - HIER_DIRECT/5.57.230.252 application/x-redhat-package-manager
1664896976.909      3 192.168.205.12 TCP_MISS/200 24764 GET http://mirror.nl.stackscale.com/rocky/9.0/AppStream/x86_64/os/Packages/p/perl-HTTP-Date-6.05-7.el9.noarch.rpm - HIER_DIRECT/5.57.230.252 application/x-redhat-package-manager
1664896976.920      8 192.168.205.12 TCP_MISS/200 98591 GET http://mirror.nl.stackscale.com/rocky/9.0/AppStream/x86_64/os/Packages/p/perl-HTTP-Message-6.29-3.el9.noarch.rpm - HIER_DIRECT/5.57.230.252 application/x-redhat-package-manager
1664896976.932      9 192.168.205.12 TCP_MISS/200 32361 GET http://mirror.nl.stackscale.com/rocky/9.0/AppStream/x86_64/os/Packages/p/perl-I18N-Langinfo-0.19-479.el9.x86_64.rpm - HIER_DIRECT/5.57.230.252 application/x-redhat-package-manager
1664896977.024    340 192.168.205.12 TCP_MISS/200 44730 GET http://epel.mirror.constant.com/9/Everything/x86_64/Packages/h/hiredis-1.0.2-1.el9.x86_64.rpm - HIER_DIRECT/108.61.5.85 application/x-redhat-package-manager
1664896977.237    555 192.168.205.12 TCP_MISS/200 272291 GET http://epel.mirror.constant.com/9/Everything/x86_64/Packages/c/coturn-4.6.0-1.el9.x86_64.rpm - HIER_DIRECT/108.61.5.85 application/x-redhat-package-manager

4. Utilizar Squidclient

Como alternativa, puedes utilizar el comando incluido squidclient para hacer pruebas. Este comando da la respuesta a una petición web de forma similar a wget o curl. Pero a diferencia de wget y curl, squidclient se conecta automáticamente a la configuración de proxy por defecto de Squid, localhost:3128.

Ejecuta el siguiente comando para probar.

$ squidclient https://google.com

Obtendrás la siguiente salida.

HTTP/1.1 301 Moved Permanently
Location: https://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 04 Oct 2022 16:35:35 GMT
Expires: Tue, 04 Oct 2022 16:35:35 GMT
Cache-Control: private, max-age=2592000
Server: gws
Content-Length: 220
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: CONSENT=PENDING+669; expires=Thu, 03-Oct-2024 16:35:35 GMT; path=/; domain=.google.com; Secure
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
X-Cache: MISS from squidproxy
X-Cache-Lookup: MISS from squidproxy:3128
Via: 1.1 squidproxy (squid/5.2)
Connection: close

Para ejecutar el comando con una dirección IP y parámetros de autenticación, ejecuta el siguiente comando.

$ squidclient -l 192.168.205.12 -p 7035 -u username -w password https://google.com

Con esto concluye nuestro tutorial sobre la instalación y configuración del servidor proxy Squid en un servidor Rocky Linux / Alma Linux 9.

También te podría gustar...