Skip to content

Installation von Squid unter Debian/Ubuntu

Squid

Installation

Zuerst installieren wir Squid aus dem System Paketen.

sudo apt update && sudo apt install squid

Squid wird nach der Installation automatisch als Hintergrunddienst eingerichtet und gestartet. Überprüfen können wir ob der Dienst ordnungsgemäß ausgeführt wird mit folgendem Befehl.

systemctl status squid.service

Konfiguration

Standardmäßig erlaubt Squid keinen Clients, sich von außerhalb des Servers mit ihm zu verbinden. Um dies zu ermöglichen, müssen Sie einige Änderungen an seiner Konfigurationsdatei vornehmen, die in /etc/squid/squid.conf gespeichert ist.

Da die Konfiguration für Squid sehr umfangreich ist, sichern wir uns die Original Konfigurationsdatei und erstellen eine kompakte Konfiguration. Wir verwenden dabei nur die include /etc/squid/conf.d/*.conf Zeile und lagern die komplette Konfiguration nach /etc/squid/conf.d/ aus.

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.dist
grep '^include' /etc/squid/squid.conf.dist | sudo tee /etc/squid/squid.conf

Nun erstellen wir uns die Konfiguration in separaten Konfigurationsdateien, die wir mit einer voranstehenden Nummer benennen. Diese Nummer dient zum einlesen der Konfigurationen in einer gewünschten Reihenfolge.

Zuerst erstellen wir die ACL Konfiguration als Datei /etc/squid/conf.d/01-acl.conf.

cat <<'CONF' | sudo tee /etc/squid/conf.d/01-acl.conf
# ACLs all, manager, localhost, to_localhost, and CONNECT are predefined.
#
#
# Recommended minimum configuration:
#
# Documentation: http://www.squid-cache.org/Doc/config/acl/
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
#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
CONF

In der Datei /etc/squid/conf.d/02-whitelist.conf definieren wir unsere ACLs. ACLs werden wie folgt definiert.

acl <ACLNAME> <ACLTYPE> <ARGUMENT|FILE>

Wir definieren uns nun drei ACL, die auf die weiter unten erstellten Listen verweisen. Eine ACL nennen wir whitelist_ips und mit src verweisen wir auf die Datei die die Liste mit den IP-Adressen die Zugriff auf den Squid erhalten sollen. Eine zweite ACl nennen wir whitelist_user-agents und verweisen mit browser auf die Datei mit den User-Agents, die Zugriff auf den Squid bekommen. Und die dritte nennen wir whitelist_requested-domains und mit dstdomain verweisen wir auf die Datei, in dem wir Domains definieren, die aufgerufen werden können.

cat <<'CONF' | sudo tee /etc/squid/conf.d/02-whitelist.conf
acl whitelist_ips src "/etc/squid/conf.d/whitelist_ips.txt"
acl whitelist_user-agents browser "/etc/squid/conf.d/whitelist_user-agents.txt"
acl whitelist_requested-domains dstdomain "/etc/squid/conf.d/whitelist_requested-domains.txt"
http_access allow whitelist_ips whitelist_user-agents
CONF

In unserem Fall möchten wir eine UND Bedingung, dass beide Bedingungen erfüllt sind, um Zugriff zum Squid zu erhalten. Dazu muss die http_access allow Definition in einer Zeile stehen.

http_access allow <ACL1> <ACL2>

Möchte man eine ODER Bedingung erstellen, führt man die http_access allow Definitionen untereinander auf.

http_access allow <ACL1>
http_access allow <ACL2>

Der http_access Block, wird mit http_access deny all abgeschlossen. Das heißt, alles andere außer unsere ACL werden abgewiesen. Die http_access deny all ist bereits in der /etc/squid/squid.conf definiert, genauso wie localhost als erlaubte ACL dort vordefiniert ist. Somit müssen wir diese Regel nicht in unserer Datei definieren.

Danach benennen wir die schon nach der Installation vorhandene Datei /etc/squid/conf.d/debian.conf in /etc/squid/conf.d/03-debian.conf um.

sudo mv /etc/squid/conf.d/debian.conf /etc/squid/conf.d/03-debian.conf

Damit wir ein etwas besseres Logfile bekommen, definieren wir für unser access.log ein combined LogFormat in der Datei /etc/squid/conf.d/04-logformat.conf.

cat <<'CONF' | sudo tee /etc/squid/conf.d/04-logformat.conf
access_log stdio:/var/log/squid/access.log combined
CONF

Als nächstes definieren wir noch eine Weiterleitung zu einem anderen Proxy-Server <OTHERPOXY>:3128, da unser Squid nur Anfragen entgegen nehmen soll und diese an einem weiteren Proxy-Server weiterreichen soll. Dies machen wir in der Datei /etc/squid/conf.d/05-parent-proxy.conf.

cat <<'CONF' | sudo tee /etc/squid/conf.d/05-parent-proxy.conf
cache_peer sproxy2.example.com parent 3128 7 no-query no-digest no-netdb-exchange
prefer_direct off
never_direct allow all
CONF

Zur Definition der Bind Adresse und des Ports, erstellen wir uns die Datei /etc/squid/conf.d/06-ports.conf. Wir verwenden als <IPADDR> die IP-Adresse des Servers und als Port verwenden wir den Standard Port 3128 des Squid.

In unserem Fall verwenden wir die IPv4 IP-Adresse des Host. Möchten man auch die IPv6 Adresse des Hosts verwenden, hängen wir diese einfach getrennt durch einen Leerzeichen an unsere jetzige Konfiguration an.

cat <<'CONF' | sudo tee /etc/squid/conf.d/ports.conf
http_port <IPADDR>:3128
CONF

Die Anwendung bzw. das Anwenden der definierten ACLs definieren wir in der Datei /etc/squid/conf.d/07-http_access.conf.

cat <<'CONF' | sudo tee /etc/squid/conf.d/07-http_access.conf
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost manager
http_access deny manager
http_access allow localhost
http_access deny all
CONF

Als nächsten Schritt erstellen wir uns die Datei /etc/squid/conf.d/08-coredump.conf um dort die coredump_dir Definition zu definieren.

cat <<'CONF' | sudo tee /etc/squid/conf.d/08-coredump.conf
coredump_dir /var/spool/squid
CONF

Nun fehlt nur noch die Datei /etc/squid/conf.d/09-refresh_pattern.conf wo die Refersh Patterns definiert werden.

cat <<'CONF' | sudo tee /etc/squid/conf.d/09-refresh_pattern.conf
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
CONF

Für Sicherheits Einstellungen erstellen wir die Datei /etc/squid/conf.d/10-security.conf. Dort werden Einstellungen gespeichert um den Squid sicherer zu machen. In unserem Fall unterdrücken wir den X-Forwarded-For und Via Header. Somit arbeitet unserer Squid wie ein Transparenter Proxy.

cat <<'CONF' | sudo tee /etc/squid/conf.d/10-security.conf
httpd_suppress_version_string on
forwarded_for transparent
via off
CONF

Nun definieren wir in der Datei /etc/squid/conf.d/whitelist_ips.txt die IP-Adressen bzw. Netzwerk Adressen, die den Squid verwenden können.

cat <<'CONF' | sudo tee /etc/squid/conf.d/whitelist_ips.txt
192.168.0.0/24
CONF

In unserem Fall, möchten wir den Squid auch auf User-Agents begrenzen, die den Squid nutzen können. Dazu erstellen wir eine Datei /etc/squid/conf.d/whitelist_user-agents.txt welche eine Liste von User-Agents enthält, die Zugriff auf unseren Squid haben.

cat <<'CONF' | sudo tee /etc/squid/conf.d/whitelist_user-agents.txt
curl/7.74.0
TEST
test
^$
CONF

Nun erstellen wir die Datei /etc/squid/conf.d/whitelist_requested-domains.txt mit den erlaubten Domains.

cat <<'CONF' | sudo tee /etc/squid/conf.d/whitelist_requested-domains.txt
google.de
amazon.de
ebay.de
CONF

Nachdem wir nun all diese Änderungen vorgenommen haben, starten wir den Squid neu und testen diesen.

systemctl restart squid.service

Testen

Nun setzen wir die Environment Variablen http_proxy und https_proxy auf unseren neu installierten Squid Proxy und starten mit curl eine Anfrage nach Google. Wir verwenden mit -A einen User-Agent TEST, welchen wir mit curl nicht unbedingt angeben müssen, da in unserem Beispiel auch Curl als erlaubter User-Agent angegeben ist.

export http_proxy="http://<SQUIDHOST>:3128"
export https_proxy="https://<SQUIDHOST>:3128"
curl -I https://www.google.de/ -A TEST

Nimmt man an der Konfiguration Änderung vor, kann man mit folgenden Befehl die Syntax der Konfiguration prüfen.

squid -k parse

Bonus

Als Bonus können wir dieses Skript auch in /usr/local/sbin/squidctl speichern. Dies ist ein Wrapper-Skript für den squid.service. Man kann die Syntax der Squid-Konfiguration auch mit squidctl configtest überprüfen, ähnlich wie mit der Option apache2ctl configtest. Mit squidctl logs wird das access.log angezeigt. Wenn man -f hinzufügt, wird das access.log mit tail -f ausgegeben.

cat <<'SCRIPT' | sudo tee /usr/local/sbin/squidctl
#!/bin/bash
# $File: squidctl $
# $Author: Marko Schulz <info@tuxnet24.de> $
# $Date: Wed Oct 11 10:23:49 AM CEST 2023 $
# $Description: Wrapper script for squid.service and squid binary $
# **************************************************

case "$1" in
    start|stop|status|restart)
        systemctl $1 squid.service
    ;;
    configtest)
        /usr/sbin/squid -k parse
    ;;
    logs)
        if [ -n "$2" ]; then
            if [ "$2" = "-f" ]; then
                tail -f /var/log/squid/access.log
            fi
        else
            less /var/log/squid/access.log
        fi
    ;;
    *)
        echo -e "\aUsage: $0 {start|stop|status|restart|configtest|logs [-f]}"
    ;;
esac

# vim: syntax=bash ts=2 sw=2 sts=2 sr noet
# EOF
SCRIPT

Dann setzen wir noch das Ausführen Bit und können das Skript squidctl nutzen.

sudo chmod ug+x /usr/local/sbin/squidctl