dani
Goto Top

Squid 2.x als Reverse Proxy für Exchange 2010

Hallo zusammen,
nachdem Microsoft Forefront TMG und weitere Produkte abgekündigt hat, stellt sich die Frage welche Programme in Zukunft für OWA, ActiveSync und/oder Outlook Anywhere (RPC over HTTPS) in Frage kommen. Für die beiden ersten Anwendungen gibt es meiner Ansicht nach genügend Alternativen. Bei Outlook Anywhere wirds schon sehr sehr schwer. Zwar bleibt Forefront UAG bis auf Weiteres erhalten, aber man muss trotzdem migrieren. Absehen von den Lizenzkosten...

Da wir einen größeren TMG Cluster betreiben, haben wir uns nach Alternativen umgesehen und haben Squid als Reverse Proxy für WebApp (OWA), ActiveSync und Outlook Anywhere (RPC over Https) in unserem TestLab installiert. Bisher waren alle Test erfolgreich. Da in letzter Zeit auch hier vermehrt Fragen aufkamen, habe ich mich entschlossen eine kleine Anleitung zu schreiben.

Wir setzen bei uns produktiv für diesen Service in Zukunft Debian 6.0.6, 64Bit ein. Meiner Ansicht nach ist Debian für Server einfach stabil, auch wenn es in der Aktualität der Programme hinterherhinkt.


Standardmäßig wird über die Paketverwaltung (apt-get) Squid ohne OpenSSL Unterstützung installier. Da aber die Exchange-Dienste nicht unverschlüsselt übertragen werden sollten, muss zu erst das Squid DEB-Paket angepasst werden. Warum kompliere ich nicht einfach den Source-Code? Ganz einfach, weil wir Squid nicht auf 1-2 Servern ausrollen sondern auf ein paar mehr. face-smile

back-to-topDEB-Pakete modifizieren

Am Besten Debian in einem Virtualisierungsprogramm (ich nutze VMWare Workstation) minimal installieren. Darauf gehe ich nicht weiter ein. Somit kann man vor Beginn einen Snapshot erzeugen und sollte was schief gehen, etc... einfach wieder auf die Musterinstallation zurückgehen - ohne großen Aufwand. Los geht's...

Nachinstallation von OpenSSH und vim, falls noch nicht geschehen beim Setup.
apt-get install openssh-server vim

Schön finde ich auch immer das Syntax highlighting. Macht eine Konfigratuion einfach übersichtlicher. Eingeschaltet werden kann es in der Datei "/etc/vim/vimrc", Zeile 20. Dort am Zeilenanfang das Anführungszeichen entfernen. Genau das macht der untenstehende Befehl. Davor wird noch ein Backup der Datei angelegt.
cp /etc/vim/vimrc /etc/vim/vimrc.orginal
sed -i 's/"syntax on/syntax on/g' /etc/vim/vimrc  

Nun wechseln wir in das Verzeichnis /tmp. Achtung: Dieses Verzeichnis wird bei einem Neustart von Debian geleert!
cd /tmp

Zu aller erst wird das Squid-Source-Paket heruntergeladen:
apt-get install dpkg-dev
apt-get source squid

Danach werden die Abhängigkeiten von Squid heruntergeladen:
apt-get build-dep squid

Das Gleiche machen wir nun für den OpenSSH-Server:
apt-get build-dep openssh

Damit die SSL-Untestützung implementiert werden kann, ist das Paket OpenSSL erforderlich:
apt-get build-dep openssl libcurl4-openSSL-dev

Zum Schluss benötigen wir noch diveres Tools für das Erzeugen des DEB-Paktes:
apt-get install devscripts build-essential fakeroot gawk

Es folgt der eigentliche Prozess. Als nächstes wechseln wir in das Squid Source-Verzeichnis:
cd squid-2.7.STABLE9
Falls du dir nicht sicher bist, einfach mit "ls -lsa" nochmal nachschauen.

So aktivieren wir die SSL-Modul im Squid. Dazu editieren wir die Datei "debian/rules".
vim debian/rules
.

Dort findet einen diesen Abschnitt:
# Configure the package.
config.status:

        rm cfgaux/config.sub cfgaux/config.guess
        ln -s /usr/share/misc/config.sub cfgaux/
        ln -s /usr/share/misc/config.guess cfgaux/

        $(opt_ac_cv_func_setresuid) \
        ./configure \
        --prefix=/usr \
        --exec_prefix=/usr \
        --bindir=/usr/sbin --sbindir=/usr/sbin \
        --libexecdir=/usr/lib/squid \
        --sysconfdir=$(sysconfdir) \
        --localstatedir=/var/spool/squid \
        --datadir=/usr/share/squid \
        $(with_pthreads) \
        $(with_netfilter) \
        $(with_arp_acl) \
        $(with_epoll) \
        --enable-removal-policies=lru,heap \
        --enable-snmp \
        --enable-delay-pools \
        --enable-htcp \
        --enable-cache-digests \
        --enable-underscores \
        --enable-referer-log \
        --enable-useragent-log \
        --enable-auth="basic,digest,ntlm,negotiate" \  
        --enable-negotiate-auth-helpers=squid_kerb_auth \
        --enable-carp \
        --enable-follow-x-forwarded-for \
        --with-large-files \
        --with-maxfd=65536 \
        $(DEB_HOST_ARCH_CPU)-debian-$(DEB_HOST_ARCH_OS)
Diesen ergänzen wir einfach um die Zeile "-–enable-ssl". So sieht dieser Anschnitt aus:
# Configure the package.
config.status:

        rm cfgaux/config.sub cfgaux/config.guess
        ln -s /usr/share/misc/config.sub cfgaux/
        ln -s /usr/share/misc/config.guess cfgaux/

        $(opt_ac_cv_func_setresuid) \
        ./configure \
        --prefix=/usr \
        --exec_prefix=/usr \
        --bindir=/usr/sbin --sbindir=/usr/sbin \
        --libexecdir=/usr/lib/squid \
        --sysconfdir=$(sysconfdir) \
        --localstatedir=/var/spool/squid \
        --datadir=/usr/share/squid \
        $(with_pthreads) \
        $(with_netfilter) \
        $(with_arp_acl) \
        $(with_epoll) \
        --enable-removal-policies=lru,heap \
        --enable-snmp \
        --enable-delay-pools \
        --enable-htcp \
        --enable-cache-digests \
        --enable-underscores \
        --enable-referer-log \
        --enable-useragent-log \
        --enable-auth="basic,digest,ntlm,negotiate" \  
        --enable-negotiate-auth-helpers=squid_kerb_auth \
        --enable-carp \
        --enable-follow-x-forwarded-for \
        --with-large-files \
        --with-maxfd=65536 \
        --enable-ssl \
        $(DEB_HOST_ARCH_CPU)-debian-$(DEB_HOST_ARCH_OS)
Die Datei wirde mit dem Befehl ":wq" gespeichert und geschlossen.

Damit die Änderung auch wirksam werden führen wir im Verzeichnis selber folgenden Befehl aus:
./configure

Zum Schluss wird die Paketdatei erzeugt:
debuild -us -uc -b
Dies kann je nach Systemleistung bis zu 5 Minuten gehen. Nicht in Panik ausbrechen... face-smile

Die Paketdateien (squid_2.7.STABLE9-2.1_amd64.deb, squid-common_2.7.STABLE9-2.1_all.deb)befinden sich direkt unter "/tmp" und können via WinSCP heruntergeladen werden.
cd /tmp


back-to-topSquid installieren


Entweder setzt ihr von euerer VM den Snapshot zurück oder wechselt auf eine andere Maschine (z.B. Produktivsystem). Dort installieren wir erstmal den Editor, Task-Manager und Squid nach.
apt-get install vim htop squid
Nach erfolgreicher Installation aktivieren wir wieder das Syntax highlighting (siehe oben).
Squid wird bereits laufen. Das ist aber nicht weiters schlimm.

Die beiden DEB-Pakete einfach wieder mit Hilfe von WinSCP auf den Server im Verzeichnis "/tmp" hochladen.

Damit der modifizierte Squid aktiv wird, muss einfach folgender Befehl abgesetzt werden:
dpkg -i squid_2.7.STABLE9-2.1_amd64.deb squid-common_2.7.STABLE9-2.1_all.deb

Die Ausgabe sieht so aus:
root@debian6X64:/tmp# dpkg -i squid_2.7.STABLE9-2.1_amd64.deb squid-common_2.7.STABLE9-2.1_all.deb
(Reading database ... 37829 files and directories currently installed.)
Preparing to replace squid 2.7.STABLE9-2.1 (using squid_2.7.STABLE9-2.1_amd64.deb) ...
Unpacking replacement squid ...
Preparing to replace squid-common 2.7.STABLE9-2.1 (using squid-common_2.7.STABLE9-2.1_all.deb) ...
Unpacking replacement squid-common ...
Setting up squid-common (2.7.STABLE9-2.1) ...
Setting up squid (2.7.STABLE9-2.1) ...
Restarting Squid HTTP proxy: squid.
Processing triggers for man-db ...
Fertisch ist der Squid mit SSL-Unterstützung.

back-to-topSquid-Konfiguration für Exchange 2010


Zuallererst lege ich immer von der Default-Konfigurationdatei eine Kopie an:
cd /etc/squid/
mv squid.conf squid.conf.bak
Ich benenne die Datei extra um, da die neue Konfigurationsdatei keinerlei Ähnlichkeit mehr haben wird.
Mit "vi squid.conf" öffnet sich eine leere Datei. Dort fügen wir folgende Konfiguration ein:
visible_hostname extern.fqdn.de

# Fuer ActiveSync notwendig, behebt Fehler auf https:{{comment_single_line_double_slash:0}}
ignore_expect_100 on

extension_methods RPC_IN_DATA RPC_OUT_DATA
https_port 443 cert=/etc/squid/ssl/EXTERN_SERVERZERTIFIKAT.crt key=/etc/squid/ssl/EXTERN_SERVERZERTIFIKAT.key  defaultsite=extern.fqdn.de

cache_peer EXCHANGESERVERIP parent 443 0 no-query originserver login=PASS ssl sslflags=DONT_VERIFY_PEER sslcert=/etc/squid/ssl/INTERN_SERVERZERTIFIKAT.crt sslkey=/etc/squid/ssl/INTERN_SERVERZERTIFIKAT.key name=ExchangeServer


# Zugriff auf folgende Adressen ist erlaubt
acl EXCH url_regex -i ^https://extern.fqdn.de/owa.*$
acl EXCH url_regex -i ^https://extern.fqdn.de/Microsoft-Server-ActiveSync.*$
acl EXCH url_regex -i ^https://extern.fqdn.de/ews.*$
acl EXCH url_regex -i ^https://extern.fqdn.de/autodiscover.*$
acl EXCH url_regex -i ^https://extern.fqdn.de/rpc/.*$


acl all src all
cache_peer_access ExchangeServer allow EXCH
never_direct allow EXCH
http_access allow EXCH
http_access deny all
miss_access allow EXCH
miss_access deny all

access_log /var/log/squid/access.log squid
extern.fqdn.de = Servername der nach Außen sichtbar ist.

EXTERN_SERVERZERTIFIKAT.crt = Öffentlich gültiges Zertifikat für den Server
EXTERN_SERVERZERTIFIKAT.key = Privater Schlüssel zum Serverzertifikat

EXCHANGESERVERIP = IP-Adresse des Exchange-Servers im LAN (z.B. 10.10.10.10)

INTERN_SERVERZERTIFIKAT.crt = Gültiges Serverzertifkat des Exchanges
INTERN_SERVERZERTIFIKAT.key = Privater Schlüssel zum Serverzertifikat

EXCH = Name der Zugriffsliste
Durch das Auskommentieren von verschiedenen ACL's (Zeile 9-16) können verschiedene Dienste deaktivieren werden, so dass ein Zugriff vom Internet nicht möglich ist. Die Variablen habe ich extra groß geschrieben!

Zu guter Letzt den Squid neustarten:
/etc/init.d/squid stop
/etc/init.d/squid start

back-to-topEinrichtung von Outlook Anywhere und Outlook 2010

Hier könnt ihr nachelesen, wie Outlook Anywhere (RPCoverHTTPS) und Outlook 2010 eingerichtet werden müssen.

back-to-topTesten der Exchangeverbindung

Um die Verbindung zum Exchange zu testen, empfehle ich diese Seite.

Grüße,
Dani

Content-ID: 192704

Url: https://administrator.de/contentid/192704

Ausgedruckt am: 08.11.2024 um 09:11 Uhr

C.R.S.
C.R.S. 13.10.2012 um 05:48:59 Uhr
Goto Top
Danke, das ist sehr nützlich. Wenngleich ich den schon begrabenen Gedanken an Exchange in der eigenen Firma mit dem Wegfall von TMG noch ein wenig tiefer gelegt habe.

Richard
tikayevent
tikayevent 23.11.2012 um 23:14:26 Uhr
Goto Top
Hallo Dani,

auch von mir Danke für die Lösung. Mit einer leichten Modifikation und mit zwei kaskadierten Squids hat man sogar die Möglichkeit über eine Windows-Sicherheitsgruppe zu steuern, wer von außerhalb zugreifen darf.

Gruß Thomas
thommymail
thommymail 26.11.2012 um 17:42:06 Uhr
Goto Top
Könntest du mal kurz beschreiben wie die Änderung aussieht?
Ist es eigentlich möglich das man für OWA ein öffentliches Zertifikat verwendet und für die anderen Dienste wie z.B. Active-Sync eines von der eigenen CA?

Gruß
Thomas
Dani
Dani 26.11.2012 aktualisiert um 17:52:18 Uhr
Goto Top
Moin,
Ist es eigentlich möglich das man für OWA ein öffentliches Zertifikat verwendet und für die anderen Dienste wie z.B. Active-Sync eines von der eigenen CA?
Jein, du kannst mehrere cache_peer anlegen, mit verschiedenen SSL-Zertifikaten. Solange aber OWA / ActiveSync auf dem selben Exchange-Server laufen wird es nicht gehen, da es immer die gleiche IP-Adresse ist.
Aber wenn du für OWA schon ein öff. Zertifikat nutzt, kannst du dieses ebenfalls für AS nutzen!


Grüße,
Dani
Nuern83
Nuern83 25.02.2013 um 10:39:01 Uhr
Goto Top
Moin,

erst einmal vielen Dank für diese sehr gute Anleitung. Das habe ich soweit (auch als "nicht Debian User") alles hinbekommen.

Eine Frage ergibt sich für mich, die aber mit dem Proxy nur wenig zu tun hat:
Ich weiß nicht genau, woher ich die cert-files und die key-files bekomme (oder wie ich sie erstelle). Da hört mein Fachwissen dann leider auf. Um jeden hilfreichen Link wäre ich dankbar.

Gruß
Nuern83
Dani
Dani 25.02.2013 um 11:22:39 Uhr
Goto Top
Moin,
Das sind im Normalfall die Dateien deines öffentlichem Zertifikats.


Grüße,
Dani
Nuern83
Nuern83 25.02.2013 um 11:37:11 Uhr
Goto Top
Zitat von @Dani:
Moin,
Das sind im Normalfall die Dateien deines öffentlichem Zertifikats.


Grüße,
Dani

Hallöchen,

danke für die schnelle Rückmeldung. Mit Zertifikaten habe ich nur im Ausnahmefall zu tun. Deshalb fehlt mir ein wenig Wissen darüber. Aber ich versuche es mal zu erfragen =)

Mir ist nicht klar, ob wir ein öffentliches Zertifikat besitzen, da wir bisher keinen Zugriff von Außen haben.

Wir haben intern (unter anderem) einen DC (2008) und einen Exch (2010). Der DC hat als Rolle eine Zertifizierungsstelle (eine CA, richtig?). Damit müssen wir alle 2 Jahre oder so das Zertifikat auf dem Exch erneuern. Das hat damit vermutlich nichts zu tun.

Auf welchem System erstelle ich die benötigten Zertifikate und Keys für die interne und die externe Kommunikation?

Gruß
Nuern83
Dani
Dani 03.03.2013 um 14:55:54 Uhr
Goto Top
Moin,
Der DC hat als Rolle eine Zertifizierungsstelle (eine CA, richtig?). Damit müssen wir alle 2 Jahre oder so das Zertifikat auf dem Exch erneuern. Das hat damit vermutlich nichts zu tun.
Doch hat es! Das Zertifikat kannst du auf dem Exchangeserver beantragen bzw. ausstellen lassen mit Hilfe des mmc.exe. Falls du nicht weiterkommst, erstell im Forum einen neue Frage.


Grüße,
Dani
shikka
shikka 02.10.2013 um 16:45:41 Uhr
Goto Top
Hi Thomas,

könntest du die Lösung mit den 2 kaskadierenden Squids vieleicht etwas genauer beschreiben ?

Danke im Voraus.

Grüße shikka
Dani
Dani 06.01.2014 um 13:54:52 Uhr
Goto Top
Hi Thomas,
seit ein paar Tagen hat Kollege @tikayevent eine Anleitung dazu geschrieben.


Grüße,
Dani
spec1re
spec1re 08.03.2021 aktualisiert um 17:41:09 Uhr
Goto Top
Guten Morgen,

aus aktuellem Anlass, wollte ich nur melden das diese Anleitung im groben und ganzen auch noch mit Squid 4.x funktioniert.

Das hier kann man weglassen, da seit Squid 4.x obsolete:
ignore_expect_100 on
extension_methods RPC_IN_DATA RPC_OUT_DATA

Hier meine laufende Config mit pfSense 2.5.0 / Squid 4.13 / Server 2016 (IIS 10.0) / Exchange 2016 CU19
# Reverse Proxy settings

https_port 123.123.123.123:10443 accel cert=/cf/conf/acme/mail.contoso.com.fullchain key=/cf/conf/acme/mail.contoso.com.key tls-dh=prime256v1:/dh-parameters.2048 cipher=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!SHA1:!MD5:!PSK \
 options=NO_SSLv3,CIPHER_SERVER_PREFERENCE,NO_TLSv1,NO_TLSv1_1,SINGLE_DH_USE,SINGLE_ECDH_USE defaultsite=mail.contoso.com vhost

cache_peer 10.0.1.11 parent 443 0 proxy-only no-query no-digest originserver login=PASSTHRU connection-auth=on tls  front-end-https=on name=OWA_HOST_443_1_pfs

acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/owa.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/exchange.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/public.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/exchweb.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/ecp.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/oab.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/Microsoft-Server-ActiveSync.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/rpc/rpcproxy.dll.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/rpcwithcert/rpcproxy.dll.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/mapi.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/EWS.*$
acl OWA_URI_pfs url_regex -i ^https://mail.contoso.com/AutoDiscover/AutoDiscover.xml
acl OWA_URI_pfs url_regex -i ^https://autodiscover.contoso.com/AutoDiscover/AutoDiscover.xml
cache_peer_access OWA_HOST_443_1_pfs allow OWA_URI_pfs
cache_peer_access OWA_HOST_443_1_pfs deny allsrc
# Kein AV auf rpc, behepbt Fehler "Vom RPC-Laufzeitprozess wurde ein RPC-Fehler ausgelöst. Fehler 1818 CallCancelled." 
acl OWA_RPC_pfs url_regex -i ^https://mail.contoso.com/rpc.*$
adaptation_access service_avi_req deny OWA_RPC_pfs
adaptation_access service_avi_resp deny OWA_RPC_pfs
#
never_direct allow OWA_URI_pfs
http_access allow OWA_URI_pfs
forwarded_for on

# Auf Fehler prüfen https://www.testexchangeconnectivity.com 

Mit diesem Addon für den IIS, sieht man anstatt der lokalen Proxy IP in der c-ip Spalte, die X-Forwarded-For IP an dessen stelle.
https://blogs.iis.net/anilr/client-ip-not-logged-on-content-server-when- ...
Installations Anleitung:
https://stackoverflow.com/questions/41174577/how-to-configure-enable-req ...
Das Ganze sollte auch mit Server 2019/ Exchange 2019 funktionieren.

Gruß Spec
Dani
Dani 08.03.2021 um 10:16:26 Uhr
Goto Top
Moin,
Danke für die Überarbeitung.


Gruß,
Dani
147669
147669 08.03.2021 aktualisiert um 10:45:36 Uhr
Goto Top
Moin.
Die Regex-Filter haben mehrfache Fehler, der Punkt ist dort mehrfach nicht maskiert (\.).

Gruß SK.
spec1re
spec1re 08.03.2021 um 11:43:02 Uhr
Goto Top
Für die Squid Config geht das schon in Ordnung. ;)

https://wiki.squid-cache.org/SquidFaq/SquidAcl#How_can_I_allow_a_single_ ...

Gruß Spec