Installation von Squid unter Debian/Ubuntu
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