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:
- Configuración del proxy en todo el sistema
- Utilizando el servidor Squid como puerta de enlace
- 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.
Haz clic en el botón Añadir para añadir la URL del proxy.
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.
La pantalla debería ser como la siguiente.
Visita la URL https://whatismyip.com
para comprobar si el proxy funciona.
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.