Chapter 6. Configuring the Squid caching proxy server


To reduce bandwidth and quickly load web pages, use Squid. It is a caching proxy server that can act as a proxy for HTTP, HTTPS, and FTP protocols, and allows access authentication and restrictions. For details, see the configuration parameters at /usr/share/doc/squid/squid.conf.documented.

To simplify access for users while improving bandwidth efficiency and response time by using the content caching, configure Squid as a caching proxy without authentication. You need to limit access to the proxy, based on IP ranges only.

Prerequisites

  • The squid package includes the /etc/squid/squid.conf file. If you edited this file before, remove and reinstall the package.

Procedure

  1. Install the squid package:

    # dnf install squid
  2. Edit the /etc/squid/squid.conf file:

    # vi /etc/squid/squid.conf
    1. Adapt the localnet access control lists (ACL) to match the allowed IP ranges that can access the proxy:

      acl localnet src 192.0.2.0/24
      acl localnet 2001:db8:1::/64

      By default, the /etc/squid/squid.conf file includes the http_access allow localnet rule. This rule uses the proxy from all IP ranges specified in localnet ACLs. You must specify all localnet ACLs before the http_access allow localnet rule.

      Important

      Remove all existing acl localnet entries that do not match your environment.

    2. To grant users to use the HTTPS protocol on other ports, add an ACL for each of these ports:

      acl SSL_ports port port_number

      The following ACL exists in the default configuration and defines 443 as a port that uses the HTTPS protocol:

      acl SSL_ports port 443
    3. Update the list of acl Safe_ports rules to configure to which ports Squid can establish a connection:

      acl Safe_ports port 21
      acl Safe_ports port 80
      acl Safe_ports port 443

      For example, to configure that clients can only access resources on ports 21 (FTP), 80 (HTTP), and 443 (HTTPS) over the proxy, keep only the following acl Safe_ports statements in the configuration file. By default, the configuration file includes the http_access deny !Safe_ports rule that defines access denial to ports that are not defined in Safe_ports ACLs.

    4. Configure the cache type, the path to the cache directory, the cache size, and further cache type-specific settings in the cache_dir parameter:

      cache_dir ufs /var/spool/squid 10000 16 256

      With these settings:

      • Squid uses the ufs cache type.
      • Squid stores its cache in the /var/spool/squid/ directory.
      • The cache grows up to 10000 MB.
      • Squid creates 16 level-1 sub-directories in the /var/spool/squid/ directory.
      • Squid creates 256 sub-directories in each level-1 directory.

        If you do not set a cache_dir directive, Squid stores the cache in memory.

  3. If you set a different cache directory than /var/spool/squid/ in the cache_dir parameter:

    1. Create the cache directory:

      # mkdir -p <path_to_cache_directory>
    2. Configure the permissions for the cache directory:

      # chown squid:squid <path_to_cache_directory>
    3. If the semanage utility is not available, install the policycoreutils-python-utils package:

      # dnf install policycoreutils-python-utils
    4. Set the squid_cache_t context for the cache directory if SELinux is in the enforcing mode:

      # semanage fcontext -a -t squid_cache_t "<path_to_cache_directory>(/.)?"*
      # restorecon -Rv <path_to_cache_directory>
  4. Open the 3128 port in the firewall:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  5. Enable and start the squid service:

    # systemctl enable --now squid

Verification

  • Download a web page by using the curl utility to verify that the proxy works correctly:

    # curl -O -L "https://www.redhat.com/index.html" -x "proxy.example.com:3128"

    If curl does not display any error and the index.html file gets downloaded to the current directory, the proxy works.

To allow only authenticated users to use the proxy, configure Squid as a caching proxy with the Lightweight Directory Access Protocol (LDAP) authentication.

Prerequisites

  • You have installed the squid package.
  • The squid package includes the /etc/squid/squid.conf file. If you edited this file before, remove and reinstall the package.
  • A service user, such as uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com exists in the LDAP directory. Squid uses this account only to search for the authenticating user. If the authenticating user exists, Squid binds this user to the directory to verify the authentication.

Procedure

  1. Edit the /etc/squid/squid.conf file:

    1. To configure the basic_ldap_auth helper utility, add the following configuration entry to the top of /etc/squid/squid.conf:

      auth_param basic program /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
      • -b base_DN sets the LDAP search base.
      • -D proxy_service_user_DN sets the distinguished name (DN) of the account Squid uses to search for the authenticating user in the directory.
      • -W path_to_password_file sets the path to the file that has the password of the proxy service user. Using a password file prevents that the password is visible in the operating system’s process list.
      • -f LDAP_filter specifies the LDAP search filter. Squid replaces the %s variable with the user name provided by the authenticating user.

        The (&(objectClass=person)(uid=%s)) filter in the example defines that the user name must match the value set in the uid attribute and that the directory entry includes the person object class.

      • -ZZ enforces a TLS-encrypted connection over the LDAP protocol using the STARTTLS command. Omit the -ZZ in the following situations:

        • The LDAP server does not support encrypted connections.
        • The port specified in the URL uses the Lightweight Directory Access Protocol Secure (LDAPS) protocol.
      • The -H LDAP_URL parameter specifies the protocol, the hostname or IP address, and the port of the LDAP server in URL format.
    2. Add the following Access Control List (ACL) and rule to configure that Squid allows only authenticated users to use the proxy:

      acl ldap-auth proxy_auth REQUIRED
      http_access allow ldap-auth
      Important

      Specify these settings before the http_access deny all rule.

    3. Remove the following rule to disable bypassing the proxy authentication from IP ranges specified in localnet ACLs:

      http_access allow localnet
    4. Add an ACL for each of these ports so that users can use the HTTPS protocol on other ports:

      acl SSL_ports port port_number

      For example, the following ACL exists in the default configuration and defines 443 as a port that uses the HTTPS protocol:

      acl SSL_ports port 443
    5. Update the list of acl Safe_ports rules to configure to which ports Squid can establish a connection:

      acl Safe_ports port 21
      acl Safe_ports port 80
      acl Safe_ports port 443

      By default, the configuration has the http_access deny !Safe_ports rule that defines access denial to ports that are not defined in Safe_ports ACLs. For example, to configure that clients allowed to use the proxy can only access resources on port 21 (FTP), 80 (HTTP), and 443 (HTTPS), keep only the following acl Safe_ports statements in the configuration.

    6. Configure the cache type, the path to the cache directory, the cache size, and further cache type-specific settings in the cache_dir parameter:

      cache_dir ufs /var/spool/squid 10000 16 256

      With these settings:

      • Squid uses the ufs cache type.
      • Squid stores its cache in the /var/spool/squid/ directory.
      • The cache grows up to 10000 MB.
      • Squid creates 16 level-1 sub-directories in the /var/spool/squid/ directory.
      • Squid creates 256 sub-directories in each level-1 directory.

        If you do not set a cache_dir directive, Squid stores the cache in memory.

  2. If you set a different cache directory than /var/spool/squid/ in the cache_dir parameter:

    1. Create the cache directory:

      # mkdir -p path_to_cache_directory
    2. Configure the permissions for the cache directory:

      # chown squid:squid path_to_cache_directory
    3. If you run SELinux in enforcing mode, set the squid_cache_t context for the cache directory:

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      If the semanage utility is not available on your system, install the policycoreutils-python-utils package.

  3. Store the password of the LDAP service user in the /etc/squid/ldap_password file, and set appropriate permissions for the file:

    # echo "password" > /etc/squid/ldap_password
    # chown root:squid /etc/squid/ldap_password
    # chmod 640 /etc/squid/ldap_password
  4. Open the 3128 port in the firewall:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  5. Enable and start the squid service:

    # systemctl enable --now squid

Verification

  • To verify that the proxy works correctly, download a web page:

    # curl -O -L "https://www.redhat.com/index.html" -x "user_name:password@proxy.example.com:3128"

    If curl does not display any error and the index.html file was downloaded to the current directory, the proxy works.

Troubleshooting

  1. To verify that the helper utility works correctly:

    1. Manually start the helper utility with the same settings you used in the auth_param parameter:

      # /usr/lib64/squid/basic_ldap_auth -b "cn=users,cn=accounts,dc=example,dc=com" -D "uid=proxy_user,cn=users,cn=accounts,dc=example,dc=com" -W /etc/squid/ldap_password -f "(&(objectClass=person)(uid=%s))" -ZZ -H ldap://ldap_server.example.com:389
    2. Enter a valid user name and password, and press Enter:

      user_name password

      If the helper utility returns OK, authentication succeeded.

To authenticate users to an Active Directory (AD) by using Kerberos, configure Squid as a caching proxy. Only authenticated users can use the proxy.

Prerequisites

  • The squid package includes the /etc/squid/squid.conf file. If you edited this file before, remove and reinstall the package.
  • The server on which you want to install Squid is a member of the AD domain.

Procedure

  1. Install the packages:

    # dnf install squid krb5-workstation
  2. Authenticate as the AD domain administrator:

    # kinit administrator@AD.EXAMPLE.COM
  3. Create a keytab for Squid, store it in the /etc/squid/HTTP.keytab file, and add the HTTP service principal to the keytab:

    # export KRB5_KTNAME=FILE:/etc/squid/HTTP.keytab
    # net ads keytab CREATE -U administrator
    # net ads keytab ADD HTTP -U administrator
  4. Optional: If system is initially joined to the AD domain with realm (through adcli), add HTTP principal and create a keytab file for Squid:

    1. Add the HTTP service principal to the default keytab file /etc/krb5.keytab and verify:

      # adcli update -vvv --domain=ad.example.com --computer-name=PROXY --add-service-principal="HTTP/proxy.ad.example.com" -C
      # klist -kte /etc/krb5.keytab | grep -i HTTP
    2. Load the /etc/krb5.keytab file, remove all service principals except HTTP, and save the remaining principals into the /etc/squid/HTTP.keytab file:

      # ktutil
      ktutil:  rkt /etc/krb5.keytab
      ktutil:  l -e
      slot | KVNO | Principal
      -----------------------------------------------------------------------------
      1 |    2 |            PROXY$@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      2 |    2 |            PROXY$@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      3 |    2 |         host/PROXY@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      4 |    2 |         host/PROXY@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      5 |    2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      6 |    2 | host/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      7 |    2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      8 |    2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)

      In the interactive terminal of ktutil, you can use the different options, until you remove all unwanted principals from the keytab, for example:

      ktutil:  delent 1
      ktutil:  l -e
      
      slot | KVNO | Principal
      -------------------------------------------------------------------------------
      1 |   2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes128-cts-hmac-sha1-96)
      2 |   2 | HTTP/proxy.ad.example.com@AD.EXAMPLE.COM (aes256-cts-hmac-sha1-96)
      
      ktutil:  wkt /etc/squid/HTTP.keytab
      ktutil:  q
      Warning

      The keys in /etc/krb5.keytab might get updated if System Security Services Daemon (SSSD) or Samba/winbind update the machine account password. After the update, the key in /etc/squid/HTTP.keytab can stop working, and you need to perform the ktutil steps again to copy the new keys into the keytab.

  5. Set the owner of the keytab file to the squid user:

    # chown squid /etc/squid/HTTP.keytab
  6. Optional: Verify that the keytab file has the HTTP service principal for the fully-qualified domain name (FQDN) of the proxy server:

    # klist -k /etc/squid/HTTP.keytab
    Keytab name: FILE:/etc/squid/HTTP.keytab
    KVNO   Principal
    ----   -------------------
    ...
       2 HTTP/proxy.ad.example.com@AD.EXAMPLE.COM
    ...
  7. Edit the /etc/squid/squid.conf file:

    1. To configure the negotiate_kerberos_auth helper utility, add the following configuration entry to the top of /etc/squid/squid.conf:

      auth_param negotiate program /usr/lib64/squid/negotiate_kerberos_auth -k /etc/squid/HTTP.keytab -s HTTP/proxy.ad.example.com@AD.EXAMPLE.COM

      The following describes the parameters passed to the negotiate_kerberos_auth helper utility:

      • -k file sets the path to the key tab file. Note that the squid user must have read permissions on this file.
      • -s HTTP/host_name@kerberos_realm sets the Kerberos principal that Squid uses.

        Optionally, you can enable logging by passing one or both of the following parameters to the helper utility:

      • -i logs informational messages, such as the authenticating user.
      • -d enables debug logging.

        Squid logs the debugging information from the helper utility to the /var/log/squid/cache.log file.

    2. Add the following Access Control List (ACL) and rule to configure that Squid allows only authenticated users to use the proxy:

      acl kerb-auth proxy_auth REQUIRED
      http_access allow kerb-auth
      Important

      Specify these settings before the http_access deny all rule.

    3. Remove the following rule to disable bypassing the proxy authentication from IP ranges specified in localnet ACLs:

      http_access allow localnet
    4. If users should be able to use the HTTPS protocol also on other ports, add an ACL for each of these port:

      acl SSL_ports port port_number

      For example, the following ACL exists in the default configuration and defines 443 as a port that uses the HTTPS protocol:

      acl SSL_ports port 443
    5. Update the list of acl Safe_ports rules to configure to which ports Squid can establish a connection. For example, to configure that clients using the proxy can only access resources on port 21 (FTP), 80 (HTTP), and 443 (HTTPS), keep only the following acl Safe_ports statements in the configuration:

      acl Safe_ports port 21
      acl Safe_ports port 80
      acl Safe_ports port 443

      By default, the configuration has the http_access deny !Safe_ports rule that defines access denial to ports that are not defined in Safe_ports ACLs.

    6. Configure the cache type, the path to the cache directory, the cache size, and further cache type-specific settings in the cache_dir parameter:

      cache_dir ufs /var/spool/squid 10000 16 256

      With these settings:

      • Squid uses the ufs cache type.
      • Squid stores its cache in the /var/spool/squid/ directory.
      • The cache grows up to 10000 MB.
      • Squid creates 16 level-1 sub-directories in the /var/spool/squid/ directory.
      • Squid creates 256 sub-directories in each level-1 directory.

        If you do not set a cache_dir directive, Squid stores the cache in memory.

  8. If you set a different cache directory than /var/spool/squid/ in the cache_dir parameter:

    1. Create the cache directory:

      # mkdir -p path_to_cache_directory
    2. Configure the permissions for the cache directory:

      # chown squid:squid path_to_cache_directory
    3. If you run SELinux in enforcing mode, set the squid_cache_t context for the cache directory:

      # semanage fcontext -a -t squid_cache_t "path_to_cache_directory(/.*)?"
      # restorecon -Rv path_to_cache_directory

      If the semanage utility is not available on your system, install the policycoreutils-python-utils package.

  9. Open the 3128 port in the firewall:

    # firewall-cmd --permanent --add-port=3128/tcp
    # firewall-cmd --reload
  10. Enable and start the squid service:

    # systemctl enable --now squid

Verification

  • To verify that the proxy works correctly, download a web page using the curl utility:

    # curl -O -L "https://www.redhat.com/index.html" --proxy-negotiate -u : -x "proxy.ad.example.com:3128"

    If curl does not display any error and the index.html file exists in the current directory, the proxy works.

Troubleshooting steps

  1. Obtain a Kerberos ticket for the AD account:

    # kinit user@AD.EXAMPLE.COM
  2. Optional: Display the ticket:

    # klist
  3. Use the negotiate_kerberos_auth_test utility to test the authentication:

    # /usr/lib64/squid/negotiate_kerberos_auth_test proxy.ad.example.com

    If the helper utility returns a token, the authentication succeeded:

    Token: YIIFtAYGKwYBBQUCoIIFqDC...

6.4. Configuring a domain deny list in Squid

To block access to specific domains, configure a domain deny list in Squid. It is useful to block domains that are either malicious or spam.

Prerequisites

  • You have configured Squid as a caching proxy, and users can use the proxy.

Procedure

  1. Edit following settings in the /etc/squid/squid.conf file:

    acl domain_deny_list dstdomain "/etc/squid/domain_deny_list.txt"
    http_access deny all domain_deny_list
    Important

    Add these entries before the first http_access allow statement that allows access to users or clients.

  2. Create the /etc/squid/domain_deny_list.txt file and add the domains you want to block. For example, to block access to example.com including subdomains and to block example.net only, add:

    .example.com
    example.net
    Important

    If you referred to the /etc/squid/domain_deny_list.txt file in the squid configuration, this file must not be empty. If the file is empty, Squid fails to start.

  3. Restart the squid service:

    # systemctl restart squid

To configure the Squid service to listen on a specific port or IP address, edit the /etc/squid/squid.conf file. By default, the Squid proxy service listens on the 3128 port on all network interfaces.

Prerequisites

  • You have installed the squid package.

Procedure

  1. Edit the /etc/squid/squid.conf file:

    • To set the port on which the Squid service listens, set the port number in the http_port parameter. For example, to set the port to 8080, enter:

      http_port 8080
    • To configure on which IP address the Squid service listens, set the IP address and port number in the http_port parameter. For example, to configure that Squid listens only on the 192.0.2.1 IP address on port 3128, enter:

      http_port 192.0.2.1:3128
    • Add multiple http_port parameters to the configuration file to configure that Squid listens on multiple ports and IP addresses:

      http_port 192.0.2.1:3128
      http_port 192.0.2.1:8080
  2. If you configured that Squid uses a different port than the default 3128:

    1. Open the port in the firewall:

      # firewall-cmd --permanent --add-port=port_number/tcp
      # firewall-cmd --reload
    2. Install the policycoreutils-python-utils package to use the semanage utility:

      # dnf install policycoreutils-python-utils
    3. If you run SELinux in enforcing mode, assign the port to the squid_port_t port type definition:

      # semanage port -a -t squid_port_t -p tcp <port_number>
  3. Restart the squid service:

    # systemctl restart squid
Red Hat logoGithubredditYoutubeTwitter

Learn

Try, buy, & sell

Communities

About Red Hat Documentation

We help Red Hat users innovate and achieve their goals with our products and services with content they can trust. Explore our recent updates.

Making open source more inclusive

Red Hat is committed to replacing problematic language in our code, documentation, and web properties. For more details, see the Red Hat Blog.

About Red Hat

We deliver hardened solutions that make it easier for enterprises to work across platforms and environments, from the core datacenter to the network edge.

Theme

© 2026 Red Hat
Back to top