< Blog

Frank, 12/03/2014

Meerdere sites achter een enkel IP adres

Er zijn vaak meerdere redenen om met reverse proxies aan de gang te gaan. Denk aan het gebruik van slechts een enkel SSL certificaat of het feit dat alle poorten 80 en 443 uit het ip subnet al bezet zijn. Ook is Single Sign-On een belangrijke reden om een commercieel product als NetIQ Access Manager in te zetten. De mogelijkheden van dit soort oplossingen zijn eindeloos en lossen vele business vragen op.

Soms wil je het echter wat simpeler. Heb je bijvoorbeeld een goedkoper internet abonnement met slechts 1 ip adres, maar wil je meerdere sites hosten die om wat voor reden op verschillende machines staan, Apache to the rescue! We kennen waarschijnlijk allemaal Apache als webserver, maar ook als reverse proxy zijn de mogelijkheden eindeloos. Omdat ik de volgende keer niet weer het wiel wil uitvinden hier een globaal stappenplan voor het inzetten van Apache als reverse proxy met een wildcard certificaat voor verschillende servers.

De uitgangssituatie is in mijn geval een vers geïnstalleerde Debian 7.4 machine met Apache.
In ports.conf voegen we ook voor ssl de optie ‘NameVirtualHost *:443' toe.

De basis virtual hosts containers zien er als volgt uit:

<VirtualHost *:80>
ServerName www.domein.nl
</VirtualHost>

<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/ssl/certs/wildcard-certificaat.crt
SSLCertificateKeyFile /etc/ssl/private/wildcard-certificaat.key
SSLCertificateChainFile /etc/ssl/certs/AddTrustExternalCARoot.crt
SSLCertificateChainFile /etc/ssl/certs/PositiveSSLCA2.crt
</VirtualHost>

Vervolgens heb ik per reverse proxy een aparte file gemaakt. Hierdoor is het makkelijk om deze snel aan of uit te zetten met bv ‘a2ensite proxy-webmail’ In onderstaand voorbeeld staat een reverse proxy gedefinieerd voor een GroupWise webmail server. Indien je nog een DocumentRoot maakt kan daar nog een redirect naar SSL en /gw worden gemaakt zodat het helemaal makkelijk voor gebruikers wordt.

<VirtualHost *:80>
ServerName webmail.domein.nl
ProxyPass /gw http://interneserver.domein.lokaal/gw
ProxyPassReverse /gw http://interneserver.domein.lokaal/gw
</VirtualHost>

<VirtualHost *:443>
ServerName webmail.domein.nl
SSLEngine on
SSLCertificateFile /etc/ssl/certs/wildcard-certificaat.crt
SSLCertificateKeyFile /etc/ssl/private/wildcard-certificaat.key
SSLCertificateChainFile /etc/ssl/certs/AddTrustExternalCARoot.crt
SSLCertificateChainFile /etc/ssl/certs/PositiveSSLCA2.crt
SSLProxyEngine On
SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire off
ProxyPass /gw https://interneserver.domein.lokaal/gw
ProxyPassReverse /gw https://interneserver.domein.lokaal/gw
</VirtualHost>

De certificaten zouden volgens verschillende hints niet op beide plekken gedefinieerd hoeven worden, maar zonder deze dubbele definities krijg ik eea niet goed aan de praat. Mocht de reverse proxy voor een ActiveSync server staan, zoals bijvoorbeeld GMS, dan is het noodzakelijk extra settings mee te nemen in de config:

ProxyPreserveHost On
ProxyVia Full
RequestHeader edit Transfer-Encoding Chunked chunked early
RequestHeader unset Accept-Encoding
ProxyRequests Off
TimeOut 1800

Tot slot, het is ook mogelijk om de SSL proxy te laten verbinden met een interne server op http. Hierdoor ben je in elk geval buiten veilig voor mee sniffers.