Aktionen

Apache2 als Reverse Proxy für Exchange 2010 2013 2016 2019 inklusive Outlook Anywhere RPC over http

Aus znilwiki

Important.png
Hinweis: Es funktioniert zur Zeit mit Exchange 2016 und Outlook ab 2013, das /RPC Verzeichnis wird dabei nicht gebraucht (und die Outlook Anywhere Unterstützung)


Nachfolgend beschreibe ich wie

  • ein Webserver mit
  • mehreren Servern dahinter
  • sich eine externe IP teilen und
  • je nach DNS-Name / Subdomain die Anfragen zu den einzelnen Servern weiter geleitet werden
  • inklusive eines Exchange-Server mit OWA, ActiveSync und(!) Outlook Anywhere (RPC over http)


ChangeLog:

  • 20.11.2014: Eintrag in Konfigurationsdatei hinzugefügt damit AutoDiscover funktioniert - hatte Probleme bei der Authentifizierung
  • 20.11.2014: Expectation Failed Apache 417 - Fehler behoben! Der Remote Connectivity Analyzer meldet keine Fehler bei AutoDiscover und ActiveSync mehr!!!
  • 20.11.2014: Und noch den letzten Fehler gefunden - der Zugriff auf den /ews Teil scheiterte an der Authentifizierungsmethode NTLM - geht durch den Apache nicht Fehlerfrei durch, Workaoround gebaut
  • 21.11.2014: Text zu den notwendigen Subdomains und den Zertifikaten noch etwas weiter ausgeführt
  • 18.12.2014: a2enmod headers hinzugefügt, ist nicht unbedingt ab Werk aktiv
  • 17.12.2015: Ergänzungen zum OAB Modul (Offline Address Book) - Dank an T. Andreas
  • 21.04.2016: Ergänzung zum Anhang versenden per Active Sync - Danke an RWambacher
  • 24.03.2019: Anpassung des Artikels an Ubuntu 18.04 und Exchange 2016
  • 24.04.2019: Neue Version mit Exchange 2016
  • 08.05.2019: aktive Konfiguration wie ich diese zur Zeit im Live-Betrieb habe



1 Ausgangslage

Ich habe einen ESXi-Server im Internet stehen. Auf diesem laufen

  • pfSense 2.4.4 als zentrale Firewall
  • ein WEBSERVER mit dieser und anderen Webseiten (Ubuntu 18.04.x LTS / Apache2 / MySQL) mit ISPConfig zur Verwaltung
  • ein ZABBIX Server (Zabbix 4.0.x auf Ubuntu 18.04.x LTS / Apache2 / MySQL)
  • ein SEAFILE Server (Seafile 6.3.4 auf Ubuntu 16.04.x LTS / Apache2 / MySQL)
  • ein EXCHANGE Server (Exchange 2016 auf Windows Server 2016)


Diesen Server habe ich bei Kimsufi SoYouStart OVH gemietet - die sind sehr günstig - aber bieten auch nur eine einzige externe IP-Adresse.
Die IPv4 liegt an der pfSense Firewall extern an. Nun wollte ich das je nach Subdomain die entsprechende Webseite bzw. der entsprechende Server angesprochen wird.
Exchange-Apache-Proxy-001.png

Die Schwierigkeit lag nun darin das ich diverse Domänen haben - und hinter diesen verschieden Subdomains, teils mit http, teils mit https
Trotzdem sollte sich alles eine gemeinsame externe IP-Adresse teilen. Ich hätte ja auch nur den Port 443 an den Exchange weiterleiten (NAT) können - aber dann hätte ich keine anderen
Webseiten mit https absichern können ... und das in der heutigen Zeit
Bei Webseiten ist dies nicht weiter schwierig - je nachdem mit welchem DNS-Namen man von extern kommt serviert Apache die entsprechende Webseite.
Dies habe ich mit einer Apache-VirtualHost (vhost) Konfiguration gelöst: http://httpd.apache.org/docs/2.4/vhosts/examples.html
Da es einfacher zu verwalten ist nutze ich ISPConfig ( http://www.ispconfig.de/ ) zur Konfiguration.
Im Verzeichnis

/etc/apache2/sites-available

liegt dazu für jede Webseite / Subdomain eine passende Datei mit der Konfiguration eben dieser Domain / Subdomain.

# ls -l /etc/apache2/sites-available
drwxr-xr-x 2 root root 4096 Okt 31 19:34 ./
drwxr-xr-x 8 root root 4096 Okt 14 23:35 ../
-rw-r--r-- 1 root root 6437 Jan  7  2014 default-ssl.conf
-rw-r--r-- 1 root root 1622 Okt 31 08:44 ispconfig.conf
-rw-r--r-- 1 root root 2023 Okt 31 08:44 ispconfig.vhost
-rw-r--r-- 1 root root 3601 Nov  2 12:09 mail.linz.email.vhost
-rw-r--r-- 1 root root  922 Okt 31 19:57 seafile.znil.net.vhost
-rw-r--r-- 1 root root 3357 Okt 25 20:57 support.znil.net.vhost
-rw-r--r-- 1 root root  945 Okt 25 22:57 zabbix.znil.net.vhost
-rw-r--r-- 1 root root 3361 Okt 24 23:58 znil.de.vhost
-rw-r--r-- 1 root root 2923 Okt 25 00:01 znil.net.vhost

usw.
Jede Datei besitzt einen symbolischen link in das Verzeichnis

/etc/apache2/sites-enabled

es ist also beides die jeweils gleiche Datei.
Durch direktes Bearbeiten dieser Dateien kann man nun steuern wo etwas landen soll. Habt Ihr keine vhost Konfiguration und gibt es nur eine Datei in diesen Verzeichnissen so müsst Ihr einfach eine neue Datei anlegen. In diesem Fall aktiviert Ihr die Datei mit

a2ensite [name_der_datei]

Die Datei wird dann nach

/etc/apache2/sites-enabled

verlinkt (und was Apache sonst noch machen muss).



2 Apache Module nachinstallieren / aktiviern

Um den Apache auch als Reverse Proxy nutzen zu können brauch es ein paar Module die erst noch aktiviert werden müssen:

a2enmod headers
a2enmod rewrite
a2enmod proxy_http
a2enmod ssl

Im Anschluss ein

systemctl restart apache2.service

und es kann losgehen.



3 Domänen / Subdomains anlegen

Ihr müsst bei eurem Provider / Hoster der Domänen die folgenden Subdomains anlegen:

  • wenn eure Domäne linz.email heisst dann die Subdomains
    • mail.znil.org <- da lassen wir den MX-Record drauf zeigen
    • autodiscover.mail.znil.org <- brauchen wir damit Autodiscover funktioniert

Beide Einträge sollten dann auf die externe IP-Adresse eures Apache-Servers zeigen.

Diese Domänen brauchen wir dann auch auf eurem Server mit Apache. Falls ihr ISPConfig nutzt legt bitte nur die mail.domäne.suffix dort an - die andere Subdomain autodiscover.domäne.suffix schreiben wir direkt in die Konfigurationsdatei.

Wenn Ihr das von Hand machen wollt legt eine Datei im Verzeichnis /etc/apache2/sites-available, das kann auch gleich die weiter unten aufgeführte Datei sein.


4 Port Weiterleitung / Port Forwarding / NAT

Egal ob wie hier eine pfSense-Maschine oder eine Fritzbox - leitet die externen Ports

80
443

an euren internen Webserver weiter (also den Server auf dem der Apache Reverse Proxy läuft).
Brauchen eure anderen Server noch weitere Ports wie bei mir (siehe Zeichnung oben) so leitet die entsprechenden Ports dann direkt an die jeweiligen Server weiter,
bei mir z.B. den Port 25 für SMTP an den Exchange Server oder den Port 10051 an den Zabbix-Server.



5 Apache Reverse Proxy

Nachdem wir die Domänen angelegt haben und es für jede dieser Domänen eine eigene .vhost Datei unter

/etc/apache2/sites-available

und deren Verlinkung unter

/etc/apache2/sites-enabled

gibt bearbeiten wir diese für die verschiedenen Subdomains.
Bearbeitet immer die Version unter sites-available.



6 Zabbix-Server (zum Aufwärmen)

Bevor wir mit der "dicken" Konfigurationsdatei für Exchange anfangen eine kleinere, leichtere zum Einstieg und zum Verständnis.
Mein Zabbix-Server soll extern über die Subdomain

zabbix.znil.net

erreichbar sein.
In ISPConfig habe ich diese Subdomäne als Host angelegt und habe somit auch eine Datei

/etc/apache2/sites-available/zabbix.znil.net.vhost

Intern hat der Zabbix-Server die IP-Adresse

192.168.200.20

Wir bearbeiten nun also die Datei:

nano /etc/apache2/sites-available/zabbix.znil.net.vhost

Löschen den gesamten Inhalt (bei nano mal F9 probieren!) und ersetzen diesen durch den folgenden:

<VirtualHost 192.168.200.10:80>
               ServerName zabbix.znil.net
               ServerAdmin webmaster@znil.net
               ProxyPass / http://192.168.200.20/
               ProxyPassReverse / http://192.168.200.20/
</VirtualHost>

<VirtualHost 192.168.200.10:443>
               ServerName zabbix.znil.net
               ServerAdmin webmaster@znil.net
               SSLEngine on
               SSLCertificateFile /var/www/zabbix.znil.net/ssl/zabbix.znil.net.crt
               SSLCertificateKeyFile /var/www/zabbix.znil.net/ssl/zabbix.znil.net.key
               ProxyPass / http://192.168.200.20/
               ProxyPassReverse / http://192.168.200.20/
</VirtualHost>

Wie Ihr seht gibt es jeweils eine http (Port 80) und https (Port 443) Konfiguration. Braucht ihr eines von beiden nicht so lasst es weg.

Erklärungen:

<VirtualHost 192.168.200.10:80>             : Die 192.168.200.10 ist die interne IP-Adresse unseres Webservers.
                                              Auf diese IP werden per NAT von extern die Ports 80 und 443 weiter geleitet.
                                              Steht euer Webserver direkt im Internet wäre dies die öffentliche IP des Servers
                                              Der Port ist hier 80 (hhtp) oder 443 (https)

ServerName zabbix.znil.net                  : Die Subdomäne / Domäne für welche die Einstellungen gelten sollen

ServerAdmin webmaster@znil.net              : Email-Adresse an die sich bei Problemen gewandt werden soll

ProxyPass / http://192.168.200.20/          : leitet alle Anfragen an die Subdomain an diese (interne) IP-Adresse weiter.
                                              Man könnte auch einen DNS-Namen nehmen

ProxyPassReverse / http://192.168.200.20/   : Der Rückweg zur vorherigen Regel

Bei der SSL Konfiguration steht zusätzlich noch

SSLEngine on
SSLCertificateFile /var/www/zabbix.znil.net/ssl/zabbix.znil.net.crt
SSLCertificateKeyFile /var/www/zabbix.znil.net/ssl/zabbix.znil.net.key

Hier wird also ein SSL Zertifikat verwendet - die Kommunikation nach extern(!) findet also verschlüsselt statt! Intern ist die Weiterleitung aber per http:, intern wird also unverschlüsselt Kommuniziert.
Soll/Muss intern der Datenverkehr auch verschlüsselt stattfinden so gebt einfach die https-Adressen an.
Man kann auch noch "Rewrite" Regeln angeben - das ist eine Text-Ersetzung die stattfindet.
Wenn Ihr im Teil für Port 80 so ändert:

 <VirtualHost 192.168.200.10:80>
               ServerName zabbix.znil.net
               ServerAdmin webmaster@znil.net
               RewriteEngine On
               RewriteCond %{HTTPS} off
               RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </VirtualHost>
</VirtualHost>

Würde ein http: Aufruf auf https: umgeleitet.
Von den Rewrites macht gleich die Exchange-Lösung massiv gebrauch.



7 Exchange-Server

Die Exchange-Version ist etwas umfangreicher ...


7.1 Outlook Anywhere Unterstützung nachinstallieren

Seit Ubuntu 14.04 geht das einfach mit

apt install libapache2-mod-proxy-msrpc

Nach der Installation funktioniert der Eintrag

OutlookAnywherePassthrough On

ohne Installation wird Apache meckern und nicht starten.


7.2 Zertifikate

Im Moment nutze ich für den Apache2 ein Lets Encrypt Zertifikat welches immer automatisch erneuert wird.
In der nachfolgenden Konfiguration wird ein Zertifikat für

mail.znil.org
autodiscover.znil.org

benötigt. Das könnt Ihr auf dem Linux-Server wie folgt anfordern:

systemctl stop apache2
certbot certonly --standalone --preferred-challenges http --rsa-key-size 4096 -d mail.znil.org -d autodiscover.znil.org
systemctl start apache2

Damit wird der Apache-Webserver gestoppt, das Zertifikat angefordert und der Apache wieder gestartet.
Werden weitere DNS-Namen benötigt so fügt einfach weitere -d Einträge hinzu - und unten in der Konfiguration weitere ServerAlias-Einträge

So ein Lets Encrypt Zertifikat läuft nach 3 Monaten ab und muss dann erneuert werden.
Die Erneuerung funktioniert nach dieser Methode:

Lets Encrypte Zertifikate erneuern mit Apache Reverse Proxy

Dabei halte ich den Apache Dienst im Falle einer Erneuerung immer kurz an. Da dieses nur selten vorkommt (bei meinen 30 Subdomänen so alle 3 Tage mal für eine Minute) kann ich damit gut leben.
Auf dem Exchange 2016 nutze ich eine selbstsigniertes Zertifikat welches ich einfach über das Management erstellt habe

Server => Zertifikate => +
ClipCapIt-190424-115141.PNG

Dieses ist 5 Jahre gültig bei mir - sollte erst einmal ausreichen. Auch in diesem Zertifikat sollten aber alle DNS-Namen vorhandenen sein die genutzt werden (und das Lets Encrypt Zertifikat hat)
In der Apache2 Konfiguration oben sind alle Prüfungen ausgeschaltet - solange also nur über den Apache-Proxy zugegriffen wird gibt es keine Probleme.

Zusammengefasst:

  • nach extern wird ein kostenloses "Lets Encrypt" Zertifikat genutzt und automatisch erneuert
  • intern nutzt der Exchange-Server ein selbst signiertes Zertifikat welches länger gültig ist und deshalb nicht erneuert werden muss.



7.3 Konfigurationsdatei

Die nachfolgende Version funktioniert bei mir Einwandfrei mit Exchange 2016 auf Windows Server 2016.

<VirtualHost 10.100.12.10:80>
        ServerName mail.znil.org
        ServerAlias autodiscover.znil.org
        ServerAdmin webmaster@znil.org

        ErrorLog /var/log/apache2/error.log
        # Nachfolgende Zeile loggt jeden Zugriff, alternativ den Zeile darunter verwenden, dann werden die Logs verworfen
        CustomLog /var/log/apache2/access.log combined
        #CustomLog /dev/null common

        Header always set X-Frame-Options SAMEORIGIN
        Header set Server Apache
        RequestHeader unset Expect early
        Header unset X-AspNet-Version
        Header unset X-OWA-Version
        Header unset X-Powered-By

        ProxyRequests Off
        RewriteEngine On
        RewriteCond %{HTTPS} !=on
        RewriteRule ^/owa(.*) https://mail.znil.org/owa$1 [R,L]
        RewriteRule ^/ecp(.*) https://mail.znil.org/ecp$1 [R,L]
        RewriteRule ^/Microsoft-Server-ActiveSync(.*) https://mail.znil.org/Microsoft-Server-ActiveSync$1 [R,L]

        DocumentRoot /var/www/mail.znil.org/web

        <Directory />
            Order deny,allow
            Deny from all
        </Directory>

        <Directory /var/www/mail.znil.org/web>
            DirectoryIndex index.php index.html
            Options -Indexes +FollowSymLinks
            Order allow,deny
            Allow from all
        </Directory>

        <Proxy *>
                Order deny,allow
                Allow from all
        </Proxy>
</VirtualHost>

<VirtualHost 10.100.12.10:443>
        DocumentRoot /var/www/mail.znil.org/web

        ServerName mail.znil.org
        ServerAlias autodiscover.znil.org
        ServerAdmin webmaster@znil.org

        ErrorLog /var/log/apache2/error.log
        # Nachfolgende Zeile loggt jeden Zugriff, alternativ den Zeile darunter verwenden, dann werden die Logs verworfen
        CustomLog /var/log/apache2/access.log combined
        #CustomLog /dev/null common

        Header always set X-Frame-Options SAMEORIGIN
        Header set Server Apache
        Header unset X-AspNet-Version
        Header unset X-OWA-Version
        Header unset X-Powered-By

        RequestHeader unset Expect early

        SetEnvIf User-Agent ".*MSIE.*" value BrowserMSIE
        Header unset WWW-Authenticate
        Header add WWW-Authenticate "Basic realm=mail.znil.org"
        ProxyRequests Off
        ProxyPreserveHost On

        #abgeschaut von https://github.com/phr0gz/Apache-reverse-proxy-for-Exchange-2010-2013-2016/blob/master/webmail.conf
        ProxyVia Full
        RequestHeader edit Transfer-Encoding Chunked chunked early
        RequestHeader unset Accept-Encoding
        TimeOut 1800
        # Ende abgeschaut

        SSLProxyEngine On
        # Problemen mit Kommunikation zwischen Apache-Proxy und Exchange-Server aus dem Wege gehen
        # Alle SSL Prüfungen werden damit ausgeschaltet. So kann z.B. auch intern ein Selbstsigniertes Zertifikat verwendet werden
        SSLProxyVerify none
        SSLProxyCheckPeerCN off
        SSLProxyCheckPeerName off
        SSLProxyCheckPeerExpire off

        #Nachfolgende Zeile bewirkt das ein Aufruf von nur https://sub.name.suffix auf https://sub.name.suffix/owa weiter geleitet wird.
        Redirect / /owa/

        # owa
        ProxyPass /owa https://10.100.12.81/owa
        ProxyPassReverse /owa https://10.100.12.81/owa
        ProxyPass /OWA https://10.100.12.81/OWA
        ProxyPassReverse /OWA https://10.100.12.81/OWA
        ProxyPass /Owa https://10.100.12.81/Owa
        ProxyPassReverse /Owa https://10.100.12.81/Owa

        # ecp = Adminoberfläche - falls Zugriff nicht gewünscht einfach auskommentieren!
        ProxyPass /ecp https://10.100.12.81/ecp
        ProxyPassReverse /ecp https://10.100.12.81/ecp
        ProxyPass /ECP https://10.100.12.81/ECP
        ProxyPassReverse /ECP https://10.100.12.81/ECP
        ProxyPass /Ecp https://10.100.12.81/Ecp
        ProxyPassReverse /Ecp https://10.100.12.81/Ecp

        # mapi
        ProxyPass /mapi https://10.100.12.81/mapi
        ProxyPassReverse /mapi https://10.100.12.81/mapi

        # ews -> Exchange Web Services
        ProxyPass /ews https://10.100.12.81/ews
        ProxyPassReverse /ews https://10.100.12.81/ews
        ProxyPass /EWS https://10.100.12.81/EWS
        ProxyPassReverse /EWS https://10.100.12.81/EWS
        ProxyPass /Ews https://10.100.12.81/Ews
        ProxyPassReverse /Ews https://10.100.12.81/Ews
        ProxyPass /exchange https://10.100.12.81/exchange
        ProxyPassReverse /exchange https://10.100.12.81/exchange
        ProxyPass /Exchange https://10.100.12.81/Exchange
        ProxyPassReverse /Exchange https://10.100.12.81/Exchange
        ProxyPass /exchweb https://10.100.12.81/exchweb
        ProxyPassReverse /exchweb https://10.100.12.81/exchweb
        ProxyPass /public https://10.100.12.81/public
        ProxyPassReverse /public https://10.100.12.81/public

        # oab (Offline Address Book)
        ProxyPass /oab https://10.100.12.81/oab
        ProxyPassReverse /oab https://10.100.12.81/oab
        ProxyPass /OAB https://10.100.12.81/OAB
        ProxyPassReverse /OAB https://10.100.12.81/OAB

        # RPC over http(s) / Outlook Anywhere
        OutlookAnywherePassthrough On
        ProxyPass /rpc https://10.100.12.81/rpc
        ProxyPassReverse /rpc https://10.100.12.81/rpc
        ProxyPass /Rpc https://10.100.12.81/Rpc
        ProxyPassReverse /Rpc https://10.100.12.81/Rpc

        # Microsoft-Server-ActiveSync
        ProxyPass /Microsoft-Server-ActiveSync https://10.100.12.81/Microsoft-Server-ActiveSync connectiontimeout=900
        ProxyPassReverse /Microsoft-Server-ActiveSync https://10.100.12.81/Microsoft-Server-ActiveSync

        # Problem mit dem Versenden von Dateianhängen > 128KByte per ActiceSync umgehen (neuer Wert 30MByte)
        <Directory /Microsoft-Server-ActiveSync>
                SSLRenegBufferSize 31457280
        </Directory>

        # AutoDiscover  -> Autodiscover for non-AD integrated Clients (Mac, eg.)
        ProxyPass /autodiscover https://10.100.12.81/autodiscover
        ProxyPassReverse /autodiscover https://10.100.12.81/autodiscover
        ProxyPass /Autodiscover https://10.100.12.81/Autodiscover
        ProxyPassReverse /Autodiscover https://10.100.12.81/Autodiscover
        ProxyPass /AutoDiscover https://10.100.12.81/AutoDiscover
        ProxyPassReverse /AutoDiscover https://10.100.12.81/AutoDiscover

        # Zeichensatz spezifieren fuer Umlaute
        AddDefaultCharset ISO-8859-1

        <Directory />
                Order deny,allow
                Deny from all
        </Directory>

        <Directory /var/www/mail.znil.org/web>
                DirectoryIndex index.php index.html
                 Options -Indexes +FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

        <Proxy *>
                SetEnv proxy-nokeepalive 1
                SetEnv force-proxy-request-1.0 1
                Order deny,allow
                Allow from all
        </Proxy>

        # Nach extern ein Lets Encrypt Zertifikat nutzen:
        SSLEngine on
        SSLProtocol All -SSLv2 -SSLv3
        SSLHonorCipherOrder     on
        SSLCertificateFile /etc/letsencrypt/live/mail.znil.org/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/mail.znil.org/privkey.pem
        SSLCertificateChainFile /etc/letsencrypt/live/mail.znil.org/chain.pem

        BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>



Der Port 80 Teil ist nicht viel mehr als eine http zu https Umleitung.
Ihr müsst alle folgenden Einträge mindestens anpassen

  • IP-Adresse 10.100.12.10 an eure IP-Adresse des Webservers
  • IP-Adresse 10.100.12.81 an eure IP-Adresse des Exchange-Server
  • mail.znil.org ändern zu eurem externen DNS-Namen
  • autodiscover.znil.org ändern zu eurem externen DNS-Namen.


Ausserdem müsst Ihr ein externes Zertifikat erstellen und angeben - das kann das vom Exchange-Server exportierte sein - oder aber ein anderes, selbst erstelltes.
Wie man das vom Exchange-Server verwendet steht im nächsten Abschnitt.

Vergesst nicht den Apache neu zu starten nach Änderungen in der Datei!

systemctl restart apache2.service




7.4 Basic Auth / Standardauthentifizierung für Exchange aktivieren

Damit auch das Programm Outlook funktioniert müsst Ihr für Outlook Anywhere die Standardauthentifizierung aktivieren:

ClipCapIt-190508-133613.PNG


Wenn Ihr bis hierhin gekommen seit läuft schon mal vieles scheinbar schön schnucklig.
Das Autodiscover funktioniert - sofern es die Subdomain "autodiscover.euredomain.suffix" gibt und ihr diese brav als Alias mit in der Apache-Konfig Datei habt.

Wenn Ihr wie ich Outlook Anywhere nutzt wird euch aber nach einer Weile auffallen das der Abwesenheitsassistent z.B. nicht funktioniert.
Und bei jeder neuen Email steht oben eine Hinweis:

Exchange-Apache-Reverse-Proxy-004.png


Nach einigen Stunden(!) Tests - in denen ich mich langsam an das Problem herangetastet habe - fand ich endlich den Grund des Übels:
Die Verbindung dafür geht über

https://externe-adresse-exchange/ews

und an dieser Stelle scheitert die Authentifizierung - weil hier nur NTLM zugelassen ist.
NTLM geht aber durch den Apache nicht sauber durch.
Deshalb gibt es in der Konfig oben die Zeilen:

Header unset WWW-Authenticate
Header add WWW-Authenticate "Basic realm=mail.znil.org"

Welche auf die Basic Auth umschalten - dadurch funktioniert dann nämlich Autodiscover.
Nun akptzeptiert aber der /ews Pfad Basic Auth bzw. Standardauthentifizierung nicht.

Das müssen wir auf dem Exchange-Server ändern das er dies auch dafür zulässt:

Öffnet auf dem Exchange-Server den

Internetinformationsdienste (IIS)-Manager

den Ihr in der Verwaltung findet.
Navigiert euch durch bis Ihr links EWS markiert habt und klickt dann rechts auf Authentifizierung:

Exchange-Apache-Reverse-Proxy-001.png


Markiert in der neuen Auswahl den Eintrag Standardauthentifizierung und dann oben rechts auf Aktivieren:

Exchange-Apache-Reverse-Proxy-002.png


Exchange-Apache-Reverse-Proxy-003.png



Und schon klappt es auch mit dem Abwesenheitsassistenten etc. und es gibt keine Warnungen mehr beim Email-Schreiben.

Bleibt noch das Offline Address Buch, hier gibt es das gleiche Problem, also noch mal das gleiche:

Exchange-Apache-Reverse-Proxy-011.png


Exchange-Apache-Reverse-Proxy-012.png




8 Ergebnisse des "Microsoft Remote Connectivity Analyzer"

Findet Ihr unter: https://testconnectivity.microsoft.com/

Ergebnisse gemäß den vorstehenden Konfigurationsschritte bei mir: (Bilder anklicken zum vergrößern)

Exchange-Webdienste: Synchronisierung, Benachrichtigung, Verfügbarkeit und automatische Antworten:

Exchange-Apache-Reverse-Proxy-005.png


Exchange ActiveSync-AutoErmittlung:

Exchange-Apache-Reverse-Proxy-006.png


Exchange ActiveSync:

Exchange-Apache-Reverse-Proxy-007.png




9 Kommentare


kay.urbach@gmx.de

54 Monaten zuvor
Punktzahl 0++

Killer. Das Tutorial ist einfach nur der Killer. Hab mich vor langer, langer Zeit mal damit rumgeschlagen, aber jetzt wird's wieder mal aktuell. Werd dich gern auf dem laufenden halten. Geplantes Setup: FW mit SSL-VPN, Reverse-Proxy, Exchange 2013, OWA, RPC, ActiveSync - bin noch am überlegen aber ich denke, der RP steht wie der "normale" Proxy und das Mail GW in der DMZ - alles andere wird dann ins LAN geroutet. Ich plane mit Brocade Vyatta (die Router und ggf. Radius+L2TP-GW), PfSense/clearOS/endian (noch unklar - als FW/SSL-VPN Endpoint) Squid als Proxy, Apache als Reverse Proxy, postfix als Mail-GW.

Greetz

cyprian@urbaniaks.de

54 Monaten zuvor
Punktzahl 0++

Super Anleitung, bräuchte jedoch ein wenig hilfe... Welche Debian/Ubuntu version wurde hier verwendet und welche apache2 Version aus welchem repository wurde verwendet? Habe schon zig VMs am Laufen und dieses RPC over https bringt mich um den Verstand :-( Danke im Voraus!

cyprian

BLinz

54 Monaten zuvor
Punktzahl 0++

Das ganez läuft bei mir auf Ubuntu 14.04. LTS. Ich habe keine extra Apache Version etc, es ist die aus dem Standard Repository (Version 2.4.7 zur Zeit). Ein Kollege hatte zunächst auch probleme und es lag an den "Basics"

Schritt 1: Subdomain anlegen und testen ob die Standardseite von Apache kommt

Schritt 2: Umbau auf SSL und wieder testen on es geht (Zertifikat vom Exchange)

Schritt 3: JETZT erst veruschen wir den Reverse Proxy einzurichten!

Bernhard

BLinz

54 Monaten zuvor
Punktzahl 0++
Man, ich brauche eine neue Tastatur ... wie die alte die Buchstaben durcheinander würfelt ....

BLinz

54 Monaten zuvor
Punktzahl 0++
Nachtrag: Und die Musterdatei genau durchschauen - ob die Pfade passen!

Timo

53 Monaten zuvor
Punktzahl 0++

Bei dem Kollegen läuft es jetzt auch ;-) Also wenn man sich genau an die Anleitung hält klappt es. Habe bei mir mal das libapache2-mod-proxy-msrpc ausprobiert, was es fertig kompiliert in den Repos gibt. Funktioniert auch 1A.

Gruß

Timo

Michael

49 Monaten zuvor
Punktzahl 0++

Hallo zusammen hab da mal ne Frage: Soweit läuft alles super aber wenn ich meinen server testen will bei ssl labs dann bekomme ich folgende Meldung: (No secure protocols supported)

Obwohl er ja SSL macht ... weiss jmd wieso =???

stefan@skittel.de

48 Monaten zuvor
Punktzahl 0++

Hallo, Gibt es eine Möglichkeit Fail2Ban einzubinden? Viele Grüße

Stefan Kittel

nnithaz@gmail.com

45 Monaten zuvor
Punktzahl 0++

Hallo,

kann mir einer sagen, wie es aussieht, wenn ich mehrere Exchange server habe. Kann ich den Apache dann als LoadBalaner konfigurieren?

Boyz

BLinz

45 Monaten zuvor
Punktzahl 0++
Also mehrere CAS-HUB? Da alles nur über 443 geht sollte das prinzipiell gehen. Müsste ich aber auch erst erforschen.

Mr. White

44 Monaten zuvor
Punktzahl 0++

Funzt bestens. Mein erster Reverse Proxy und alles klappt inkl. Outlook Anyhwere, der Hammer!!! Habe auch libapache2-mod-proxy-msrpc verwendet.

Daumen hoch

Manule

42 Monaten zuvor
Punktzahl 0++

Hallo zusammen, habe die Anleitung vor einiger Zeit gefunden und einen Reverse Proxy aufgesetzt der für OwnCloud und Exchange 2010 vermittelt. Hat alles auf anhieb Problemlos funktioniert. Aber mit einer Besonderheit kämpfe ich nun schon eine Weile ohne Erfolg. Der Exchange 2010 läuft auf einem SBS2011, dieser Wiederrum bringt eine Remote Webseite (Web Workplace) mit die leider auch 443 nutzt. Der Aufruf erfolgt wie bei OWA TLD/owa über TLD/remote. Die Einrichtung einer Subdomain remote.TLD und Umleitung über den Proxy hat leider nicht funktioniert, an den Authentifizierungen habe ich im IIS auch schon mein möglichstes Probiert... Leider ohne Erfolg.

Vllt. liest dies hier jemand und hat einen Tipp für mich?

Michael

40 Monaten zuvor
Punktzahl 0++

Hallo zusammen funktioniert alles soweit bei mir allerding bekomme ich im Error Log vom Apache folgende Meldungen:

[proxy_http:error] [pid 1084] (70007)The timeout specified has expired: [client XX.XX.XX.XX:53195] AH01102: error reading status line from remote server XX.XX.XX.XX:443

[Sun Jan 24 11:54:39.659453 2016] [proxy:error] [pid 1084] [client XX.XX.XX:XX:53195] AH00898: Error reading from remote server returned by /Microsoft-Server-ActiveSync

Kann das noch jmd beobachten?

Micha

36 Monaten zuvor
Punktzahl 0++
Hat keiner eine Idee dazu hab das Prob nach wie vor

BLinz

36 Monaten zuvor
Punktzahl 0++

Solange alles funktioniert ist das eben kein Problem.

Warscheinlich liegt das am "Push" Trick von Exchange. Push ist ja die Einstellung zum Beispiel auf dem Smartfone das neue Emails unmittelbar ankommen. Der Trick ist das vom Smartfone eine Anfrage an den Exchange geöffnet wird ... und diese wird 10 Minuten oder länger offen gehalten. Sprich es kann sein das der Exchange erst nach 9 Minuten auf die Anfrage antwortet mit "Mail da".

Wenn aber in der Zeit einer der beiden schon Aufgeben hat - der Exchange nicht mehr auf die offene Anfrage antwortet oder das Smartfone nicht mehr horcht gibt es halt einen Fehler. Nicht schlimm, die nächste Anfrage kommt bestimmt.

Betrifft nicht nur Smartfone sondern alles was ActiveSync oder Outlook Anywhere macht.

Micha

36 Monaten zuvor
Punktzahl 0++

Okay danke schonmal für die Erklärung na ja soweit funzt alles aber meine Outlook clients trennen sich sporadisch und verbinden sich direkt wieder neu .

Ich weiss nicht ob es mit disem Error zu tun hat aber sonst finde ich keine Unregelmäßigkeiten.

olebole@t-link.de

38 Monaten zuvor
Punktzahl 0++

Ich bekomme leider SSL-Fehler. Ein wget https://dns.…exchange/owa geht, aber der Apache sagt: [Wed Mar 23 13:16:00.619733 2016] [proxy:error] [pid 4990:tid 140640265840384] (502)Unknown error 502: [client 192.168.xx.xx:57828] AH01084: pass request body failed to 192.168.yy.yy:443 (dns.des.internen.exchange) [Wed Mar 23 13:16:00.619839 2016] [proxy:error] [pid 4990:tid 140640265840384] [client 192.168.xx.xx:57828] AH00898: Error during SSL Handshake with remote server returned by /owa/ [Wed Mar 23 13:16:00.619848 2016] [proxy_http:error] [pid 4990:tid 140640265840384] [client 192.168.xx.xx:57828] AH01097: pass request body failed to 192.168.yy.yy:443 (dns.des.internen.exchange) from 192.168.xx.xx ()


Was kann ich tun?

BLinz

38 Monaten zuvor
Punktzahl 0++

kannst du denn von intern über die externe Seite nach intern zugreifen? und wennes ein selbstsigniertes Zertifikat ist wäre ein Fehler nicht ungewöhnlich. Nimm doch mal den Browser statt wget In der Konfigurationsdatei nutze ich nur IP Adressen.

im schlimsten Fall noch mal nach Anleitung von vorne, ich konnte es mehrfach nach meiner eigenen Anleitung erfolgreich einrichten

olebole@t-link.de

38 Monaten zuvor
Punktzahl 0++

Es funktioniert nun, nachdem ich folgendes der config hinzugefügt habe:

SSLProxyVerify none SSLProxyCheckPeerCN off SSLProxyCheckPeerName off

SSLProxyCheckPeerExpire off

BLinz

38 Monaten zuvor
Punktzahl 0++
Gute Idee, ich habe es nun oben mit eingebaut - obwohl es bisher bei mir immer ohne diese Zeilen ging. Ich habe das aber schon an anderer Stelle genutzt um extern ein anderes Zertifikat als intern zu nutzen.

RWambacher

37 Monaten zuvor
Punktzahl 0++

Danke für die tolle Anleitung.

Ich hatte noch ein Problem auf mobilen Endgeräten beim Versenden von Emails mit Attachments größer als ca. 128 KB über ActiveSync.

Es stellt sich raus, dass der SSL Puffer des Apache Proxy mit 128KB Default Wert schuld war. Nachdem ich die Konfiguration auf folgendes geändert hatte funktionierte es problemlos:

ProxyPass https://192.…r-ActiveSync connectiontimeout=600 ProxyPassReverse https://192.…r-ActiveSync

  1. Puffer auf 30 MB setzen

SSLRenegBufferSize 31457280


Dies könnte auch für andere Pfade relevant sein (/rpc, /OAB ?)

BLinz

37 Monaten zuvor
Punktzahl 0++
Danke für den Hinweis, ich habe es oben eingebaut

BLinz

29 Monaten zuvor
Punktzahl 0++

Bei Exchange 2010 muss ggf. der Wert in Exchange selbst auch noch angepasst werden:

https://www.…ngen-werden/

RWambacher

37 Monaten zuvor
Punktzahl 0++
Sorry, das XML Fragment hat wohl im Kommentar nicht wie gewünscht funktioniert

Flo

37 Monaten zuvor
Punktzahl 0++
Kennst jemand das Phänomen, dass gewisse Funktionen (Regeln, Gelöschte Mails wiederherstellen) bei MAPI OVER HTTP in einem Outlook 2016 Client nicht funktionieren? Er meldet dann "Netzwerkprobleme" oder stürzt ab. Zudem geht der Fehlercounter im Outlook Verbindungsstatus um 1 nach oben - bei allen Verbindungenen..... Irgendwelche Ideen? Konfiguriert ist das ganze wie auf die dieser Seite beschrieben.

Jimmy

37 Monaten zuvor
Punktzahl 0++

Hallo @ll, super Howto, hat alles funktioniert und nun endlich nach vielen Howto's auch mein Outlook Client. Ich habe nur eine Frage, gibt es die Möglichkeit einer automatischen Weiterleitung von http Anfragen auf https?

Vielen Dank für eure Antworten.

BLinz

37 Monaten zuvor
Punktzahl 0++
Wenn du es nach dieser Ableitung gemacht hast ist das schon drin. Musst mail.linz.email an deine Domäne anpassen

Jimmy

37 Monaten zuvor
Punktzahl 0++

Hi, Danke für die schnelle Antwort. Leider klappt das so nicht bei http outlook.kress.me kommt eine 403 bei https nicht sieht aber so aus als ob die 403

von dem IIS kommt. hmm komisch.

Jimmy

37 Monaten zuvor
Punktzahl 0++

Hi, Danke nochmal für deine Hilfe und die geniale Howto :-). Alles funzt nun super, hätte nochmal die Firewall prüfen sollen die hat den Port 80 direkt durchgeschleift.

Kaum macht man es richtig, geht es auch ;-)

tks@ttb-it.de

36 Monaten zuvor
Punktzahl 0++

Hi,

danke für die Anleitung.... Ich hatte bis jetzt immer das Problem mit dem RPCoverHTTPs. Jetzt klappts. *freu*

ich habe bei mir zur Absicherung noch das Apache2 GeoIP Modul aktiviert und lass nur Verbindungen von Deutschland zu. Kommt selten vor, dass ich ausserhalb bin, und so werden alle Robots und Passwortversuche von "unsicheren Herkunftsländern" (*g*) direkt auf meine Webseite mit "HTTP 301 redirect" umgeleitet. Wenn du willst, schreib mir ne Mail, dann schicke ich dir die Konfigurationsschritte, ist n bisschen viel für das Kommentar.

Danke nochmal.

Gruß

Til

Markus

36 Monaten zuvor
Punktzahl 0++

Hallo! Sehr prima deine Tut´s - hat mir schon oft geholfen - - DANKE!

Was ich nicht ganz verstehe - in deiner Grafik ganz oben hast du den Exchange mit 192.168.1.40 aber in der conf leitest du die Exchange dienste auf 192.168.1.80

ist das ein Tippfehler - oder hab ich was nicht ganz gerafft?

Mfg.

Markus

36 Monaten zuvor
Punktzahl 0++
Sorry jetzt mein Fehler - natürlich 192.168.200.40 und 192.168.200.80

Miekesch

29 Monaten zuvor
Punktzahl 0++
Ja, glaube das ist ein Tippfehler, denn ich habe es geändert auf die Addresse meines EX2010!

Mario

33 Monaten zuvor
Punktzahl 0++

Hallo

super Anleitung. Bin nicht der Linux Experte, benötige allerdings genau dieses Setup. Gibt es eine vor konfigurierte VM irgendwo, damit man nicht von vorne beginnen muss?

Viele Grüße

Mario

Michael

30 Monaten zuvor
Punktzahl 0++
Hallo zusammen läuft das ganze auch mit Exchange 2016 hat das schon jmd am laufen?

Torsten

28 Monaten zuvor
Punktzahl 0++
Hi, läuft auch mit Exchange 2016 CU4 einwandfrei ...

Miekesch

29 Monaten zuvor
Punktzahl 0++

Coole Anleitung@BLinz!

Ich habe da dennoch eine Frage!

Ich habe deine Anleitung etwas modifiziert, damit es mit meiner Dyndns Lösung Funzt! Der Exchange Funktionierte sofort, überraschend ;) aber meine Cloud auf dem anderen Server wird nicht angezeigt. Port 80 Funktioniert, aber 443 nicht, dort erhalte ich einen Internal Server Error.

Auf der Cloud ist ein SelfSign Zertifikat installiert, welches ich auch auf dem ReverseProxy hinterlegt habe (wie in deinem Beispiel vom ZABBIX Server) oder habe ich das missinterpretiert?

Ich komme bei den Https Anfragen bis zum ReverseProxy, der mir im Browser auch das Zertifikat der Cloud zurück gibt, welches auf dem ReverseProxy hinterlegt ist, aber er läd nicht das vom eigentlichen Server (Cloud).

Wo ist mein Denkfehler?

Ich danke dir für eine Antwort.

P.S: Frohes neues Jahr 2017

Miekesch

29 Monaten zuvor
Punktzahl 0++

Ich habe den Fehler gefunden. Trotzdem danke für die Großartige Anleitung!

Fehler: ich hatte im ProxyPass https eingeschrieben! Zusätzlich habe ich auf dem Webserver ein neues Zertifikat generiert!

Danke Funzt!

Torsten

28 Monaten zuvor
Punktzahl 0++
Superklasse Anleitung, genau was ich noch brauchte ...

BLinz

28 Monaten zuvor
Punktzahl 0++

Bis auf folgendes Problem - was ich aber nur temporär lösen konnte - läuft das: Über ActiveSync lassen sich keine (größeren) Dateianhänge versenden. Und für Exchange 2016 und Outlook ab 2010 fehlt eigentlich noch das neue "mapi" Verzeichnis. Aber Outlook Anywhere geht.

"Leider" hat mein Exchange inzwischen eine eigene, feste IP-Adresse (kosten bei SoYouStart nur einmalig 2,40 Euro) ... so das ich das gar nicht mehr selbst einsetze.

Martin

27 Monaten zuvor
Punktzahl 0++

Starkes Turorial, vielen Dank dafür!

Wir sind jetzt auf Exchange 2013 umgestiegen und hatten über den externen Zugriff Verbindungsprobleme in Outlook (ständig getrennt). Um diese zu lösen habe ich die Authentifizierungseinstellungen im IIS für MAPI angepasst (wie bei ews und oab) und Proxypass Regeln für /mapi im virtual host des Proxy eingetragen (wie bspw. bei /owa). Jetzt scheint es zu funktionieren. Allerdings gab es im IIS den Hinweis, dass für die Mapi Standard-Authentifizierung kein SSL benötigt wird und Daten daher unverschlüsselt gesendet werden. Bedenklich?

Micha

22 Monaten zuvor
Punktzahl 0++

Hi muss ich für Exchange 2016 irgendwas beachten? Über Android meckert er das die Authentifizierung fehl schlägt und Outlook verbindet sich auch nicht. Mit Exch2013 lief alles bestens.

Grüße

BLinz

22 Monaten zuvor
Punktzahl 0++
Öhm mal schauen was der IIS vom Exchange für Seiten hat. Die müssten alle rein. Ich habe inzwischen eine separate IP für den Exchange weshalb ich diesen Ansatz hier nicht weiter verfolge

BLinz

22 Monaten zuvor
Punktzahl 0++
Wobei oben vor 168 Tagen jemand geschrieben hat das es mit 2016 einwandfrei läuft ...

Micha

22 Monaten zuvor
Punktzahl 0++

Also ich bekomm es leider nicht zum laufen mit Exchange 2016

Falls es jemand hin bekommen hat wäre ich über evtl. Tips dankbar

Felix

19 Monaten zuvor
Punktzahl 0++
Hast du Outlook 2016? Der unterstützt kein EAS mehr. vielleicht hat da ja jemand ne lösung.

BLinz

19 Monaten zuvor
Punktzahl 0++

Also, so wie ich das sehe nutzt Outlook 2016 dann ActiveSync.

Und das funktioniert mit der beschriebenen Konfiguration. Outlook 2016 ist aber zickig, das Autodiscover muss funktionieren. Was hauptsächlich auf gültige Zertifikate hinausläuft.

tomascrespogarcia@gmail.com

6 Monaten zuvor
Punktzahl 0++

What a great article!!!

I was fighting with Exchange and Apache Reverse Proxy and I finally though it was imposible.

Lot of thanks
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen. Bei einem Kommentar wird deine IP-Adresse zusammen mit dem Text, den angegebenen Namen bzw. der Email-Adresse in der Datenbank für die Kommentare dauerhaft gespeichert. Genaueres kannst du hier nachlesen: Datenschutzerklärung