Exchange 2016: OPNsense, HAProxy und Let’s Encrypt

OPNSense ist ein Fork der bekannten OpenSource Firewall PFSense, mir persönlich gefällt OPNSense besser, die GUI ist aufgeräumter, es gibt eine REST-Api und die wichtigsten PlugIns sind ebenfalls verfügbar.

Da für OPNSense ein Plugin für HAProxy und auch für Let’s Encrypt existiert, habe ich angefangen diese Kombination in Verbindung mit Exchange 2016 zu testen. OPNSense kann also direkt ein kostenloses Zertifikat von Let’s Encrypt anfordern und kümmert sich dann auch selbstständig um die Erneuerung.

Kostenlose Firewall und kostenlose Zertifikate, hört sich doch gut an. Hier ein erster Test.

Umgebung

Meine Testumgebung ist wie folgt aufgebaut:

OPNsense, HAProxy und Let's Encrypt

Der Internetzugang wird über eine Fritzbox hergestellt. OPNsense stellt die Internetverbindung über die Fritzbox her. Der Exchange Server befindet sich “hinter” der OPNsense VM, hier findet also ein doppeltes NAT statt. Hier die Auflistung der IP-Adressen:

WAN IP Fritzbox 80.153.231.160
LAN IP Fritzbox 192.168.10.1
WAN IP OPNSense 192.168.10.107
LAN IP OPNSense 172.16.14.1
IP Exchange 172.16.14.9

Vorbereitung

Nach der Installation und der Einbindung in mein Netzwerk habe ich zuerst einmal den Port für den Verwaltungswebsite geändert. Die Verwaltungsoberfläche hört in der Standardkonfiguration auf Port 443 (https). Port 443 möchte ich aber für Exchange nutzen. Ich habe mich hier für Port 4444 entschieden.

image

Danach werden die erforderlichen Plugins nachinstalliert. Das Plugin “os-acme-client” ist das Plugin für Let’s Encrypt, “os-haproxy” übernimmt die Veröffentlichung von Exchange. Da es sich in meiner Umgebung um eine VM auf ESXI handelt, habe ich auch die VMware Tools installiert:

image

Neben der entsprechenden Netzwerkkonfiguration waren das schon alle Vorbereitungen.

Firewall

Nachdem OPNsense in mein Netzwerk integriert wurde, habe ich zunächst zwei Firewall Regeln erstellt, die http und https Verkehr auf dem WAN Port zulassen:

image

Für die beiden Regeln wird als Schnittstelle jeweils “WAN” und als Protokoll “TCP” ausgewählt. Als Zielportbereich wird für eine Regel “HTTP” und für die zweite Regel “HTTPS” ausgewählt.

image

Nach dem Anlegen der beiden Regeln sieht es dann so aus:

image

Eine Regel für HTTP und eine Regel für HTTPS. Somit wird schon einmal Traffic von extern erlaubt. Weiter geht es mit HAProxy.

HAProxy

Weiter geht es mit der grundlegenden Konfiguration von HAProxy für Exchange 2016. In den HAProxy Einstellungen wird zunächst der Exchange Server als Real Server angelegt:

image

Ich habe des Exchange Server wie folgt angelegt, die Option “Überprüfen Sie das SSL-Zertifikat” habe ich abgeschaltet, da Exchange ein selbst signiertes Zertifikat verwendet:

image

Sobald der Server angelegt wurde, kann ein BackEnd erstellt werden:

image

Für das Backend werden die folgenden Einstellungen getätigt:

image

Jetzt wird eine ACL angelegt, für diesen Test mache ich es mit einfach und erstelle nur eine ACL:

image

Die folgenden Einstellungen gelten für die ACL:

image

Nachdem die ACL angelegt wurde, wird eine “Aktion” erstellt:

image

Für die Aktion wird folgendes konfiguriert:

image

Zum Schluss wird das Frontend angelegt:

image

Für das FrontEnd werden die folgenden Einstellungen verwendet. Die IP-Adresse 192.168.10.107 ist dabei die WAN IP Adresse der OPNsense Firewall (NAT hinter Fritzbox) plus den HTTPS-Port (443). In diesem Fall also 192.168.10.107:443

Dan noch ein Zertifikat von Let’s Encrypt existiert, verwende ich zunächst das Standard Zertifikat für die Web GUI. So lässt sich die Konfiguration schon einmal testen. Des weiteren wird auch die “X-Forwarded-For-Kopfzeile” aktiviert:

image

In den erweiterten Einstellungen des Frontend sind diese Einstellungen definiert;

image

Danach kann HAProxy aktiviert werden:

image

Falls HAProxy schon aktiviert war, dann am besten einmal neu starten.

Jetzt funktioniert schon einmal OWA, aber da noch kein gültiges Zertifikat vorliegt kommt es natürlich zu Zertifikatswarnungen:

image

Jetzt kann das Let’s Encrypt Plugin konfiguriert werden.

Let’s Encrypt

Let’s Encrypt bietet die Möglichkeit die Integration über das “Staging Enviroment” zu testen. Für offiziell gültige Zertifikate hat Let’s Encrypt Limitierungen eingebaut, so können zum Beispiel nicht beliebig viele Zertifikate ausgestellt werden. Für Tests bietet es sich also an mit dem Staging Enviroment zu starten und erst auf das “Production Enviroment” umzustellen wenn alles funktioniert.

In diesem Fall wird auch zunächst das Staging Enviroment genutzt:

image

Sobald das PlugIn aktiviert wurde, kann der Account angelegt werden:

image

Für den Account wird nur eine E-Mail Adresse benötigt:

image

Jetzt kann die Überprüfungsmethode konfiguriert werden:

image

Als Überprüfungsmethode habe ich HTTP-01 belassen, außerdem musste ich in meiner Umgebung die WAN IP explizit angegeben, da sonst keine Verbindung aufgebaut werden konnte. Als FrontEnd wird das zuvor erstellte “Exchange_2016_Frontend” ausgewählt:

image

Hinweis: Das Exchange 2016 Frontend wurde nur auf Port 443 (HTTPS) konfiguriert, Let’s Encrypt prüft die Domain mit der Validierungsmethode HTTP-01 allerdings auf Port 80 (HTTP), daher habe ich einen zusätzliches FrontEnd auf Port 80 (HTTP) für Let’s Encrypt erstellt:

image

Für das Let’s Encrypt Frontend wird ebenfalls die IP des WAN Interfaces angegeben, dies mal allerdings mit Port 80. Als Standard Backend wird “acme_challende_backend” ausgewählt, welches durch das Plugin erstellt wurde. Gleiches gilt auch für die Aktion “redirect_acme_challanges”:

image

Zurück zum Let’s Encrypt Plugin, hier kann jetzt das Zertifikat konfiguriert werden:

image

Mein Exchange Server ist hört auf die Namen mail.frankysweb.de für alle Webservices (ActiveSync, Outlook Anywhere, EWS, etc) und autodiscover.frankysweb.de für Autodiscover. Daher gebe ich die folgenden Werte für das Zertifikat an:

image

Nachdem das Zertifikat konfiguriert wurde, steht es im Status “Pending”, daher kann jetzt das Zertifikat ausgewählt und der Button “Zertifikate jetzt ausstellen oder erneuern” geklickt werden:

image

Nach kurzer Zeit ist dann unter “Last Acme Status” der Wer “OK” zu sehen:

image

Jetzt ist das Test-Zertifikat, welches vom Let’s Encrypt Staging Environment ausgestellt wurde, in der Zertifikatsübersicht zu sehen. Ausgestellt wurde es von der da “Fake LE Intermediate X1”:

image

Um nun an ein gültiges Zertifikat zu kommen, kann nun die Let’s Encrypt Umgebung auf “Production Environment” umgestellt werden:

image

Nachdem das “Production Environment” ausgewählt wurde, muss noch das Zertifikat erneut ausgestellt werden:

image

In der Übersicht der Zertifikate ist nun das gültige Zertifikat zu sehen, welches von der CA “Let’s Encrypt Authority X3” ausgestellt wurde:

image

Zum Schluss muss das Zertifikat nur noch dem Exchange Frontend zugewiesen werden:

image

In den Einstellungen zum Frontend kann jetzt das gültige Zertifikat ausgewählt werden:

image

Nun erscheinen auch keine Zertifikatswarnungen mehr:

image

Fazit

Die Konfiguration ist etwas aufwändiger als zunächst gedacht. Während ich diesen Artikel erstellt habe, wurde zwischenzeitlich ein Update für die Plugins HAProxy und Let’s Encrypt veröffentlicht, daher habe ich zwischenzeitlich wieder von vorne angefangen, um es mit der aktuellen Version zu testen.

Diese Konfiguration funktioniert zwar, ist aber alles andere als perfekt. Ich muss mich noch einmal eingehenden mit den ACLs und Aktionen vertraut machen um eine vernünftige Konfiguration zu erstellen. Für einen ersten Test, ist es aber ganz vielversprechend.

16 Kommentare zu “Exchange 2016: OPNsense, HAProxy und Let’s Encrypt”

  1. Hallo Frank,
    Wie sieht die Situation in Verbindung mit Outlook Anyware aus?
    Ich hatte hier z.b. in Verbindung mit nginx relativ viele Probleme.
    Macht der haproxy einem hier das Leben leichter?
    Grüße Kevin

    1. Hi, habe es bisher nicht mit Outlook Anywhere versucht, sondern nur mit MAPIoverHTTP. Eigentlich hat HAProxy aber kein Problem mit Outlook Anywhere.
      Gruß, Frank

  2. Frank,
    du Unermüdlicher. Immer etwas Neues ;-)
    Wenn du OPNsense mit sophos UTM vergleichst, wie fällt denn dein Fazit aus?

    Grüße
    Martin

    1. Hi Martin,
      das wäre ein Vergleich zwischen Äpfeln und Birnen. Der HAProxy von OPNsense ist in erster Linie ein Loadbalancer und keine Web Application Firewall (Apache ModSecurity) wie von der UTM verwendet. Ein direkter Vergleich ist so also nicht möglich.
      Gruß, Frank

  3. Hi Franky…
    Immer wieder schön was es so gibt. Bin seit etlichen Jahren auf PFSense und schaue mir nun OPN an. Von Sophos habe ich die Finger gelassen weil es nicht wirklich mehr kann als die PFS (bei ca. 450 User, mit „Schnickschnack“). Hat eben ein schönes Interface.. mehr konnte ich aber wirklich nicht feststellen.. Wie sind Deine Erfahrungen?
    Gruss Matze

  4. Hallo Frank,
    zuerst einmal ein großes Lob für deine tolle Website. Sie hat mir schon mehrmals weitergeholfen.
    Aktuell bin ich dabei, für einen Freund in seiner kleinen Firma (3 Leute) einen neuen Windows Server samt Exchange 2016 einzurichten. Speziell bei dem Thema Zertifikate wird es für mich schwierig.

    Ich habe lt. deiner Anleitung „Exchange 2016 – Opnsense -HAProxy und Let´s Encrypt“ versucht, die Zertifikate für extern einzurichten.

    Jetzt habe ich aber noch ein grundsätzlichens Verständnisproblem:
    So weit ich es verstanden habe dient die Anleitung dazu, die Zertifikate für den exteren Zugriff auf die Exchange-URL (mail, autodiscover) einzurichten. So weit so gut.
    Ebenso lt. deinen Anleitungen habe ich die internen Exchange-URLs den externen gleichgesetzt und im DNS erreichbar gemacht (funktioniert). Doch bei den Let´s Encrypt Zertifikaten für intern verstehe ich was nicht:
    1) Ist es richtig, das die Anleitung für „Exchange2016-Opnsense-HAProxy-LetsEncrypt“ nur für externe (von außerhalb der Firma) Aufrufe gilt?
    2) Bei internen Aufrufen (d.h. in der Firma über lokalen DNS) bekomme ich keine Verbindung, da lt. Browser Zertifikate fehlen.
    3) Die Anleitung von Dir für Exchange2016 & Let´s Encrypt für Intern würde ja für die gleichen URLs (mail, autodiscover) nochmals neue Zertifikate anfordern. Frage geht das überhaupt?
    4) Wenn Frage 3 nein, wie bekomme ich dann die Let´s Encrypt Zertifikate von der Opnsense & HAProxy Konfig durch das häufige Renewal automatisch auch intern ins AD oder auf den Exchange?

    Hoffe Ihr könnt mir da etwas Licht in die Sache bringen.
    Recht herzliches Dankeschön mal vorab.

    LG
    Robert

  5. Ich wollte einfach nur Danke sagen :) Danke für die wirklich großartige Arbeit mit den 2 Plugins, für mich fast schon die wichtigsten Tools hinter OPNsense überhaupt.

    DNSresolver + DHCP + HAproxy + LetsEncrypt in der Kombination auf dem Backend vervierfacht den Wert der Gateway Lösung!

    Vielen Dank

  6. Hallo Frank,

    vielen Dank für den großartigen Artikel und deine unermüdliche Bereitschaft, dein Wissen weiterzugeben. Ich lese schon seit 2013 regelmäßig deine Beiträge und muss sagen, durch sie bin ich bisher völlig unproblematisch durch zwei Exchange-Migrationen gekommen!

    Ich habe nun auch ein Setup auf Basis von opnsense und Exchange 2016 am Laufen, dein Artikel war dafür natürlich wieder ein Must-Read :)

    Zu der Frage von Frank bzgl. Zertifikaten bei Zugriff von innen bzw. außen, die Frage kam mir auch sehr schnell auf. Ich habe eine sehr einfache Lösung gefunden:

    Maildomain: „company.de“
    AD-Domain: „intranet.company.de“
    Mail-Server (im AD-DNS): „winsrv-mail.intranet.company.de“ (Bsp.: 10.220.10.20)

    Als Hostnamen für den Zugriff auf Mail soll
    „mail.OFFICE.company.de“
    genutzt werden, hier ist jetzt nur wichtig, dass die Sub-Domain NICHT gleich lautet wie die AD-Domain.

    Nun habe ich in opnsense einfach zwei DNS Host Override (Services -> unbound DNS -> Host override) definiert, damit „mail.office.company.de“ und „autodiscover.company.de“ von intern aufgelöst werden können. Als IP gebe ich dabei aber die interne LAN-IP der OPNSENSE an, bzw. die IP der passenden VLAN-Schnittstelle, an der auch der Mailserver hängt.

    Im öffentlichen DNS des Domain-Hosters wird die feste öffentliche IP eingetragen, unter der die opnsense im Internet zu erreichen ist, einmal für den Namen „mail.office.company.de“ und für „autodiscover.company.de“.

    Das einzigste was jetzt noch zu tun ist: in HAProxy im Exchange-Frontend nicht die IP-Adresse angeben, sondern:

    „mail.office.company.de:443“

    Jetzt tut es sowohl von drinnen als auch von draußen mit demselben, gültigen Zertifikat.

    Ein Hinweis noch zu SAN-Zertifikaten mit LetsEncrypt:
    Jeder der alternativen Namen muss zumindest im öffentlichen DNS des Domain-Hosters auf die Adresse der opnsense zeigen, LetsEncrypt prüft JEDEN Namen ab, der zum Zeitpunkt der Beantragung im Zertifikat steht.

  7. Hallo Frank,
    danke für deine Anleitung ich habe allerdings ein Problem damit ich die Anleitung auf ein wenig angepasst.
    So habe ich z.b in der aktuellen Version vom HAProxy in den ACL nicht /* freigegeben sondern alles bis auf das ECP.

    Es funktioniert auch soweit ich habe nur ein Problem mit ActiveSync auf dem Handy.
    Dort ist es so das ich leider nicht sehe wenn eine Mail eintrifft oder bzw. ich kann keine Mail versenden.

    Muss man über Active Sync noch irgentwas in der Firewall etc. freigeben damit man mit dem Handy darauf zugreifen kann nur dachte ich immer das es genügt wenn ActiveSync von aussen funktioniert den die einrichtung konnte abgeschlossen werden.

    Ich verwende Exchange 2016 mit dem neuen CU.

    OWA usw. funktioniert tatellos. Auch wenn ich die URL von Active Sync aufrufe geht es hast du heissen tip woran das liegen könnte.

    Ich verwende Opensense 1.7.7-8.

  8. Grüße.
    Also ich muß erstmal besten Dank sagen für diese gute Anleitung.
    Ich hatte ein paar Schwierigkeiten beim Einrichten, da sich die Oberfläche des HAproxy im OPNsense geändert hat.

    Jetzt hab ich nur noch eine kleine Thematik….
    Könntest du vielleicht mal beschreiben, wie man das für IMAPs und SMTPs einrichtet.
    Ich bin nach dem gleichen Schema vorgegangen, aber bekomme keine Verbindung.
    Nutze aber keinen Exchange, sondern einen Postfix usw.

  9. Hallo Frank,

    danke für die Erläuterung. Ich habe HA Proxy erfolgreich im Einsatz. Kurz vorher hatte ich bereits dein Popwershell Script für Exchange 2016 durchlaufen lassen.

    Ist es möglich, dass der Exchange über das PoerShell Script ein LetsEncrypt Cert bezieht und HA Proxy auch? Oder kommen sich dann Beide in die Wege. Im Moment läuft es, jedoch würde ich gern wissen, was in 90 Tagen passiert ;)

    Gruß
    Danny

  10. Hallo Frank,

    mittlerweile ist in PFsense acme 2 auch in der Lage, wildcard Zertifikate selbständig zu installieren. Schade das es kein Howto für Pfsense geben wird, auch wenn OpnSense recht ähnlich (Fork) aufgebaut sind. Aber vielleicht reizt es dich ja mal doch, es auf einer Pfsense 2.4.3 zu versuchen. HaProxy ist da ja ebenfalls verfügbar.

    Beste Grüße,
    Falk

  11. Hallo Franky, hast du schon eine Lösung gefunden wie man die ACL etwas besser konfigurieren kann weil /* finde ich persönlich keine gute Idee. Zumal man das von aussen auf die ECP zugreifen kann was mir persönlich nicht so gefällt aus Security-Sicht.

    Mir scheint aber so das opnsense bzw. haproxy sich im Moment schwer tut das die ACL auch wirklich ziehen.

    Es wäre schön wenn du einen Lösungsansatz dafür hättest.

    1. Geht ganz einfach.
      Du kannst die Rule auf host_matches stellen.
      Unten dann genau die Subdomain eintragen die du haben willst.

      Gruß Robert

  12. Hallo Frank,

    ein lesenswerter Artikel, der mir bei einem geplanten Projekt weiterhelfen wird. Könntest Du eventuell ein Update des Artikels machen? Z.B. werden seit Version 18.7.7 Client Zertifikate für HAProxy unterstützt. Damit könnte man den Zugriff auf Exchange doch gut absichern.

    Gruß, Stefan

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.