Anleitung: Squid3 mit SSL als Reverse Proxy Debian 7 / 8

Heute gibt es mal wieder eine Anleitung zu einem Thema was mich selbst gerade beschäftigt hat. Ein Reverse Proxy um die Last von den Webservern zu nehmen und dadurch einiges an Performance zu gewinnen.

Aber was ist ein Reverse Proxy eigentlich?

Ich versuche es mal so einfach wie möglich auszudrücken.

Ein Reverse Proxy ist eine Schnittstelle die mit dem Internet verbunden ist wie ein Webserver. Der Unterschied ist, dass die Anfragen (sofern der Proxy keinen Cache hat) an einen anderen Server weitergeleitet werden der keine öffentliche IP benötigt. Das kann also durchaus ein privater Server in einem privaten Netzwerk oder einem VPN Netzwerk sein. Dabei kann der Proxy die Anfragen auf mehrere Server verteilen. Man kann also hinter einer Domain auch 20 Server haben die alle Anfragen bedienen. Vorausgesetzt es ist auch auf allen Servern der gleiche Inhalt vorhanden.

reverse-proxy
Funktionsweise zeichnerisch dargestellt

Und wozu macht man sich den Spaß?

Ganz einfach, Zahlen und Fakten belegen, dass ein Webserver der bei 500 Anfragen eine Auslastung von 100% hat und ein Proxy bei gleichen Usern bei unter 2% Auslastung liegt.

Squid3 startet eben nicht für jede Anfrage einen Prozess und fängt dann erst mal mit der PHP Engine an die Seite zusammen zu bauen. Nein, Squid geht einfach mit einem Hascode seine Cache Dateien durch und liefert alles aus was er bereits mal geladen hat und das um ein vielfaches schneller als jeder Webserver!

Welche Software? Squid3, nGinx, Lighthttp oder doch Apache?

Ich habe mit allen möglichen System mal rum probiert und finde derzeit Squid3 am besten. Squid ist sehr flexibel, schnell, stabil verbraucht kaum Ressourcen, unterstützt SSL, kann neben http auch noch andere Protokolle wie FTP, Mail Protokolle usw. , hat eine super Cache Engine und ist „relativ“ einfach zu konfigurieren.

Auf alle Anwendungen und Konfigurationsmöglichkeiten gehe ich hier aber nicht weiter ein. Es geht hier rein um einen Reverse Proxy mit Squid.

Kommen wir also zum eingemachten. Unter Debian gibt es derzeit keinerlei fertige Pakete die Squid mit einer SSL Unterstützung anbieten. Es bleibt also nicht weiter übrig als sich eine eigene Version zu erstellen.

Keine Panik, ist einfacher als man denkt 😉 

Aber jetzt gehts direkt mit Squid3 und der SSL config los!

Zuerst fügen wir in der /etc/apt/sources.list die Source Quellen hinzu. Die brauchen wir gleich.

Ihr nehmt also einfach alle Einträge die dort drin stehen und kopiert diese ein zweites mal rein aber hinter die „deb“ setzt Ihr nun noch ein „-src“. Die doppelten Zeilen müssen also mit „deb-src“ anfangen.

Als nächstes einfach ein

[su_note note_color=“#c1c1b6″]

cd /root
apt-get update

[/su_note]

ausführen.

Nun müssen wir noch ein paar Sachen vorher installieren damit wir auch alle Abhängigkeiten haben.

[su_note note_color=“#c1c1b6″]

apt-get install -y openssl devscripts build-essential libssl-dev

[/su_note]

Passt. Nun holen wir uns die Sourcen

[su_note note_color=“#c1c1b6″]

apt-get source -y squid3

[/su_note]

Auch erledigt!

Holen wir alle Pakete die dazu gehören und mit Squid3 installiert werden würden.

[su_note note_color=“#c1c1b6″]

apt-get build-dep -y squid3

[/su_note]

Done!

Soweit so gut.

Es gibt nun einen Ordner mit der entsprechenden Version.

Unter Debian 7 ist es „squid3-3.1.20“

Unter Debian 8 ist es „squid3-3.4.8“

Immer vom aktuellen Stand ausgegangen 😉 

In diesen Wechseln wir nun

[su_note note_color=“#c1c1b6″]

Unter Debian 7

cd squid3-3.1.20

Unter Debian 8

cd squid3-3.4.8

[/su_note]

Mittels Nano oder Vi die Datei „rules“ im Unterordner Debian bearbeiten

[su_note note_color=“#c1c1b6″]

nano debian/rules

[/su_note]

Ab Zeile 44 

[su_note note_color=“#c1c1b6″]

--with-large-files

[/su_note]

mit dem ersetzen

[su_note note_color=“#c1c1b6″]

 --with-large-files \
 --with-default-user=proxy \
 --enable-ssl \
 --with-open-ssl="/etc/ssl/openssl.cnf"

[/su_note]

Wichtig sind die \ und die beiden Minuse am Anfang. Die Datei einfach speichern.

Als nächstes machen wir aus dem Chaos wieder ein installierbares Debian Paket und wechseln anschließend ein Verzeichnis höher.

[su_note note_color=“#c1c1b6″]

debuild -us -uc
cd ..

[/su_note]

Logrotate sollten wir noch installieren

[su_note note_color=“#c1c1b6″]

apt-get install logrotate

[/su_note]

Und nun installieren wir alle Pakete die wir erstellt haben.

[su_note note_color=“#c1c1b6″]

dpkg -i *.deb

[/su_note]

Ganz Wichtig ist anschließend ein

[su_note note_color=“#c1c1b6″]

apt-get install -f

[/su_note]

ausführen um weitere eventuelle Abhängigkeiten aufzulösen und die Installation vollständig zu haben.

Sollte beim erst apt-get update dieses Paket aktualisiert werden, dann einfach erneut alle Pakete mit dpkg -i *.deb installieren. Dann hat auch apt die korrekte Version hinterlegt.

Gibt man nun squid3 -v ein erhält man diese Ausgabe und hat Squid mit SSL kompiliert und installiert.

[su_note note_color=“#c1c1b6″]

root@jessie:~# squid3 -v Squid Cache: Version 3.4.8 configure options: ‚–build=x86_64-linux-gnu‘ ‚–prefix=/usr‘ ‚–includedir=${prefix}/include‘ ‚–mandir=${prefix}/share/man‘ ‚–infodir=${prefix}/share/info‘ ‚–sysconfdir=/etc‘ ‚–localstatedir=/var‘ ‚–libexecdir=${prefix}/lib/squid3‘ ‚–srcdir=.‘ ‚–disable-maintainer-mode‘ ‚–disable-dependency-tracking‘ ‚–disable-silent-rules‘ ‚–datadir=/usr/share/squid3‘ ‚–sysconfdir=/etc/squid3‘ ‚–mandir=/usr/share/man‘ ‚–enable-inline‘ ‚–disable-arch-native‘ ‚–enable-async-io=8‘ ‚–enable-storeio=ufs,aufs,diskd,rock‘ ‚–enable-removal-policies=lru,heap‘ ‚–enable-delay-pools‘ ‚–enable-cache-digests‘ ‚–enable-icap-client‘ ‚–enable-follow-x-forwarded-for‘ ‚–enable-auth-basic=DB,fake,getpwnam,LDAP,MSNT,MSNT-multi-domain,NCSA,NIS,PAM,POP3,RADIUS,SASL,SMB‘ ‚–enable-auth-digest=file,LDAP‘ ‚–enable-auth-negotiate=kerberos,wrapper‘ ‚–enable-auth-ntlm=fake,smb_lm‘ ‚–enable-external-acl-helpers=file_userip,kerberos_ldap_group,LDAP_group,session,SQL_session,unix_group,wbinfo_group‘ ‚–enable-url-rewrite-helpers=fake‘ ‚–enable-eui‘ ‚–enable-esi‘ ‚–enable-icmp‘ ‚–enable-zph-qos‘ ‚–enable-ecap‘ ‚–disable-translation‘ ‚–with-swapdir=/var/spool/squid3‘ ‚–with-logdir=/var/log/squid3‘ ‚–with-pidfile=/var/run/squid3.pid‘ ‚–with-filedescriptors=65536‘ ‚–with-large-files‘ ‚–with-default-user=proxy‘ ‚–enable-ssl‘ ‚–with-open-ssl=/etc/ssl/openssl.cnf‘ ‚–enable-linux-netfilter‘ ‚build_alias=x86_64-linux-gnu‘ ‚CFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wall‘ ‚LDFLAGS=-fPIE -pie -Wl,-z,relro -Wl,-z,now‘ ‚CPPFLAGS=-D_FORTIFY_SOURCE=2‘ ‚CXXFLAGS=-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security‘

[/su_note]  

 

Wer sich das nicht zutraut kann auch einfach die Pakete hier runterladen. Allerdings nur die Debian 7 Pakete. Für Debian 8 war ich mit dem Platt machen zu schnell.

Debian7 Squid3-3.20 mit SSL DEB Paket download

 

Squid3 Konfiguration

Hier gehe ich nicht weiter drauf ein. Die Original ist sehr gut dokumentiert und hier gibt’s ein sehr gutes Squid3 Wiki.

 

Die Datei liegt unter /etc/squid3/squid3.conf

[su_note note_color=“#c1c1b6″]

#Default Public Webserver Ports
http_port 80 accel defaultsite=www.sugar-camp.com vhost
https_port 443 accel defaultsite=www.sugar-camp.com vhost \
cert=/home/squid-ssl/sugar-camp-crt.pem \
key=/home/squid-ssl/sugar-camp-privatekey.pem

# HTTP Backendserver Zuordnung ohne SSL
cache_peer 10.8.0.46 parent 80 0 no-query originserver name=webserver1
cache_peer 10.8.0.45 parent 80 0 no-query originserver name=webserver2

#SSL Backend Server
cache_peer 10.8.0.46 parent 443 0 no-query originserver ssl sslflags=DONT_VERIFY_PEER name=webserver-ssl \
ssl sslcafile=/home/squid-ssl/sugar-camp-cacert.pem

# Zuordnung Website zu einer Gruppe
acl sites_webserver1 dstdomain www.sugar-camp.com # beliebig erweiterbar falls mehrere Domains auf web
acl sites_webserver2 dstdomain www.dl-host.info # server1 liegen
acl sites_webserver-ssl ssl dstdomain www.sugar-camp.com

# Zuordnung von Websites auf Webserver
cache_peer_access webserver1 allow sites_webserver1
cache_peer_access webserver2 allow sites_webserver2
cache_peer_access webbserver-ssl allow sites_webserver-ssl

# In der folgenden Zeile alle Domains rein
acl our_sites dstdomain www.dl-host.info www.sugar-camp.com
acl all src all
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 443 # https
acl CMI_Clients src 185.82.21.96

# Zugriffsregeln und Beschränkungen, wollen ja keinen offenen Proxy betreiben
http_access allow manager localhost
http_access deny !Safe_ports
http_access allow our_sites
http_access deny all

reply_header_access Via deny all
reply_header_access X-Forwarded-for deny all
reply_header_access X-Cache deny all

cache_mgr eure@mail.adresse

# Log Format mit dem auch andere Programme was anfangen können
logformat combined \
%{Host}>h %>a %ui %un %tl „%rm %ru HTTP/%rv“ >Hs %<st „%{Referer}>h“\
„%{User-Agent}>h“ %Ss:%Sh
logformat vcombined \
%{Host}>h %>a %ui %un [%tl] „%rm %ru HTTP/%rv“ >Hs %<st „%{Referer}>h“\
„%{User-Agent}>h“
access_log /var/log/squid3/baccess.log squid
access_log /var/log/squid3/access.log combined
access_log /var/log/squid3/vaccess.log vcombined

# Fine Tuning
cache_mem 800 MB # Wieviel Cache darf im RAM liegen
cache_swap_low 50 # % ab dem langsam geleert wird
cache_swap_high 80 # % für hard Flush
cache_effective_user proxy
cache_effective_group proxy
cache_dir diskd /home/squid-cache 20000 100 200 # Einen Order der chmod 777 hat muss eingetragen werde
minimum_object_size 0 KB # und existieren
maximum_object_size 150 MB
maximum_object_size_in_memory 2 MB
store_avg_object_size 1 MB
request_body_max_size 120 MB
ipcache_size 2048
ipcache_low 90
ipcache_high 95
fqdncache_size 2048
cache_log /var/log/squid3/debug.log
log_mime_hdrs on
log_fqdn on

[/su_note]  

 

Dann ein gepflegten /etc/initd/squid3 restart und es sollte alles laufen.

Zum Testen tragt in eurer lokalen Host Datei einfach folgende Zeile ein

185.82.23.62 www.sugar-camp.com

Die Datei liegt in C:\Windows\System32\drivers\etc\hosts

Alle IP’s und Domains in der Squid3 Konfiguration müsst Ihr natürlich an eure eigenen anpassen!!

 

In Diesem Sinne viel Spaß mit dem Boost 🙂

Die nächsten Tage kommen dann auch noch die Anleitungen für die langsameren und nicht so flexibleren Apache und nginx Reverse Proxys.

 

 

Share it!Share on FacebookEmail this to someoneShare on Google+Tweet about this on Twitter

10 Gedanken zu „Anleitung: Squid3 mit SSL als Reverse Proxy Debian 7 / 8“

  1. In Debian 8 (Jessie) werden zusätzlich nachstehende Pakete benötigt, die vor dem builden installiert werden müssen:
    apt-get install cdbs dh-autoreconf libecap2-dev
    Selbst danach läuft der debuild Befehl noch nicht fehlerfrei durch:
    adaptation/.libs/libadaptation.a(libsquid_ecap_la-Host.o): In function `Adaptation::Ecap::Host::Host()‘:
    /root//squid3-3.4.8/src/adaptation/ecap/Host.cc:34: undefined reference to `libecap::headerTransferEncoding‘
    /root/squid3-3.4.8/src/adaptation/ecap/Host.cc:34: undefined reference to `libecap::Name::assignHostId(int) const‘
    /root/squid3-3.4.8/src/adaptation/ecap/Host.cc:35: undefined reference to `libecap::headerReferer‘

    Getestet auf einem Proxmox 4 Container-System.

    Antworten
    • Hi Dirk,
      wie sieht denn deine debian/rules Datei aus? Hast du da vielleicht irgendwo einen falschen Umbruch? Leerzeichen? Ein Argument doppelt?
      Hab es gerade im Proxmox 4 Container genau nach Anleitung gemacht und ich musste nichts nachinstallieren auf einem frischen Deb8. Alle Abhängigkeiten wurden installiert und der Build lief durch.
      Squid3 4.8-6 Debian 8 Archiv
      Ich habe dir die Debian Pakete auch gleich hochgeladen als Beweis 🙂

      LG
      André

      Antworten
  2. Hey,

    was genau muss man bei „webserver-ssl“ angeben? Den Hostname vom Server selbst, den man zum Reverse Proxy macht? Localhost und 127.0.0.1 geht nicht.

    Antworten
  3. Hey nochmal,

    leider konnte ich das Kommentar nicht noch bearbeiten und habe es verfrüht losgeschickt. Ich nutze auf dem zweiten Server zeitgleich einen Server namens Rocketchat. Dieser funktionierte bisher problemlos. Seitdem Reverse Proxy ist er von außen leider nicht mehr funktionsfähig. Er ist noch erreichbar und man kann sich einloggen (z.b. mit der handy app) aber man erhält keine nachrichten über diese. Eine Idee, was das sein könnte? Fehlt mir vielleicht nur eine Angabe, dass er die Pakete komplett durchlässt?

    Viele Grüße aus Hamburg

    Alex

    Antworten
    • Hi Alex,
      Rocketchat benutzt Default den Port 3000. Wenn die Seite auf dem Handy unter der SSL Domain erreichbar ist, sollte Sie das auch im Browser sein.
      Du musst lediglich dein Rocketchat Server eintragen
      [code]
      cache_peer 10.8.0.45 parent 3000 0 no-query originserver name=webserver2
      [/code]
      und diesen dann mit den ACL Rules freigeben.

      Ich habe leider gerade keine Testmaschine mit Squid da ich mittlerweile nginx und nginx ingress verwende aber falls du weitere Hilfe benötigst, kannst du mir gern eine Mail schreiben. Alternativ kann ich dir auch ein Konto in unserem Rocketchat einrichten oder Telegram anbieten, da ich davon ausgehe das der Chat schon produktiv ist und daher sehr schnell eine Lösung gefunden werden sollte.

      Alles dürfte wohl schneller sein als Kommentare 🙂

      LG
      André

      Antworten
  4. Da nehme ich gerne den Rocketchat. Meine E-Mail hast du ja hier schon. Leider kann ich keine großen Configschnipsel hier rein posten. Erkennt er als Spam an.

    Antworten

Schreibe einen Kommentar