Waarvoor dient een reverse proxy?

Het veilig beheren van webservers of exchange servers stelt netwerkbeheerders voor een probleem: hoewel online diensten zoals websites of e-mail via het publieke netwerk beschikbaar moeten zijn, maakt een directe verbinding met het internet het systeem kwetsbaar voor malware en handmatige aanvallen. Vaak wordt er daarom gebruikgemaakt van een intermediaire netwerkcomponent – een zogenaamde reverse proxy.


Wat is een reverse proxy precies?

In principe is een reverse proxy een server die als communicatie-interface in het netwerk optreedt en aanvragen aanneemt en doorstuurt naar de doelcomputer. Een reverse proxy die dienst doet als server, ook wel een proxyserver genoemd, wordt in bedrijfsnetwerken gebruikt om clientapparaten een controleerbare toegang tot het internet te garanderen. De server die als proxy is geconfigureerd vormt in dit geval de enige verbinding met het publieke netwerk. Dit wordt een forward proxy genoemd.

Een forward proxy kanaliseert alle aanvragen van het interne netwerk en stuurt die met een eigen afzenderadres door naar de doelservers op internet. Antwoorden van de servers bereiken eerst de proxy voor ze worden verspreid naar de diverse clientapparaten. Die blijven daardoor anoniem, tenzij de gebruikte proxy een transparante proxy is. Om bandbreedte te besparen en de webpagina sneller te kunnen laden, worden proxyservers over het algemeen zo geprogrammeerd dat ze regelmatig aangevraagde content tijdelijk opslaan in de cache, zodat die informatie direct beschikbaar is zonder een nieuwe serveraanvraag.

Terwijl een forward proxy clientapparaten in een netwerk beschermt tegen invloeden uit het internet, werkt een reverse proxy, zoals de naam al doet vermoeden, in omgekeerde richting. Zo’n reverse proxyserver doet dienst als een extra veiligheidselement voor een of meerdere webservers door aanvragen van het internet te accepteren en door te sturen naar een backend server op de achtergrond.

Een reverse proxy als server kan als netwerkcommunicatie-interface verschillende functies overnemen die de veiligheid van de backend server waarborgen en het dataverkeer optimaliseren.


Definitie

Een reverse proxy is een extra veiligheidsmaatregel die voor een of meerdere webservers ingeschakeld kan worden. Een webadres wordt in de omgekeerde richting van een gewone proxy omgezet. Een reverse proxy neemt plaatsvervangend de aanvragen van servers aan en leidt ze naar de bijbehorende client. De reverse proxy waarborgt daarbij een of meerdere clients de toegang tot een intern net.


Reverse proxy: werking en toepassing

Reverse proxy’s worden normaal gesproken beveiligd met een firewall in een privénetwerk of een demilitarized zone. De reverse proxy vormt daarbij, net als een forward proxy, de enige verbinding tussen internet en het privénetwerk. Alle aanvragen aan de backend server in de LAN passeren dus dezelfde communicatie-interface voor ze worden doorgestuurd naar de eigenlijke doelsystemen. Met zo’n bundeling is het mogelijk om het inkomende dataverkeer te controleren, meerdere servers onder dezelfde URL beschikbaar te stellen, aanvragen gelijkmatig te verdelen over de verschillende servers en het ophalen van gegevens te versnellen met behulp van caching. Reverse proxy's als server worden gebruikt voor de volgende toepassingen:

  • Anonimisering: als enige toegang tot het interne netwerk vangt een reverse proxy alle aanvragen aan de servers op de achtergrond op en werkt zo dat clientprogramma’s de indruk krijgen dat ze met het eigenlijke doelsysteem te maken hebben. De proxy stuurt de aanvragen aan de doelsystemen in de LAN door, neemt hun antwoorden aan en stuurt die weer naar de clients die de aanvraag hebben gedaan. De feitelijke backend server blijft zodoende anoniem.
  • Bescherming en encryptie: een upstream reverse proxy biedt de mogelijkheid om controlesystemen, zoals virusscanners of packet filters, te installeren die de server op de achtergrond extra beveiligen. Zo vormt de reverse proxy als server een extra schakel in de beveiliging tussen internet en het privénetwerk. Bovendien kunnen reverse proxyservers worden gebruikt voor encryptie. Het uitbesteden van SSL-certificaten op de proxy ontlast de webserver op de achtergrond.
  • Loadbalancing: het gebruik van een upstream reverse proxy maakt het koppelen van een URL met diverse servers in het privénetwerk mogelijk, waardoor inkomende aanvragen over meerdere servers kunnen worden verdeeld: loadbalancing. Dit voorkomt dat afzonderlijke systemen worden overbelast en zorgt dat het systeem blijft werken bij uitval van een of meerdere apparaten. Wanneer een server niet bereikbaar is door hardware- of softwarefouten verdeelt de loadbalancingmodule van de proxy inkomende aanvragen over de resterende servers. Zo kan worden gegarandeerd dat een service altijd beschikbaar is, zelfs als er iets misgaat.
  • Caching: om de service van servers te versnellen, heeft de reverse proxy een functie waarmee antwoorden van servers tijdelijk kunnen worden opgeslagen. Met behulp van caching kan de reverse proxyserver herhaaldelijke aanvragen gedeeltelijk of volledig zelf beantwoorden. Statische content, zoals afbeeldingen of regelmatig opgevraagde dynamische websites worden daarbij in de cache van de proxy opgeslagen, waardoor er geen of veel minder gegevens van de backend server hoeven te worden opgevraagd en de toegang tot webservices aanzienlijk versnelt. Het risico bestaat dat aanvragende clients verouderde informatie krijgen, omdat content snel verandert en niet altijd kan worden gegarandeerd dat de actuele versie in de cache van de proxy is opgeslagen.
  • Compressie: met de juiste software kan een reverse proxy worden gebruikt om inkomende en uitgaande data te comprimeren. Een populair programma voor het comprimeren van websites is gzip dat vaak wordt gebruikt in combinatie met Apache of nginx.

Reverse proxy installeren met Apache

De Apache reverse proxy HTTP-server kan ook worden gebruikt als reverse proxy. De populairste webserver ter wereld beschikt over verschillende extensiemodules voor diverse proxyfuncties en kan worden geconfigureerd met slechts enkele coderegels. In de volgende stap-voor-staphandleiding leggen we uit hoe je een Apache installatie op het besturingssysteem Ubuntu uit kan breiden met de benodigde module en hoe je een configuratiebestand maakt voor een redirect.

De opensource Apache reverse proxy HTTP-server wordt gratis beschikbaar gesteld door de Apache Software Foundation. Een introductie in de webserver software kun je vinden in dit artikel.


Stap 1: installatie van de Apache reverse proxymodule

Om een Apache reverse proxy HTTP-server te kunnen gebruiken als reverse proxy heb je de mod_proxy module nodig. Die voert de kernfuncties uit en kan worden uitgebreid met verschillende aanvullende modules:

  • mod_proxy_http bevat alle proxyfuncties voor HTTP- en HTTPS-aanvragen. De aanvullende module ondersteunt de protocolversies HTTP/0.9, HTTP/1.0 en HTTP/1.1.
  • mod_proxy_ftp is nodig om proxyfuncties te bieden voor FTP-aanvragen.
  • mod_proxy_connect biedt proxyfuncties voor SSL-tunneling.
  • mod_proxy_ajp implementeert het Apache JServ Protocol (AJP). Dit wordt gebruikt in het kader van loadbalancing om aanvragen aan applicatieservers op de achtergrond door te sturen.
  • mod_cache, mod_disk_cache en mod_mem_cache implementeren cachingfuncties waarmee content tijdelijk kan worden opgeslagen op de Apache server.
  • mod_proxy_html maakt rewriting van HTML-links mogelijk.
  • mod_headers maakt manipulatie van HTTP-headergegevens mogelijk.
  • mod_deflate implementeert een compressiefunctie.

Om de module mod_proxy inclusief alle aanvullende modules te installeren, hoef je enkel de volgende commandoregel in te voeren:

sudo apt-get install libapache2-mod-proxy-html

Deze tutorial richt zich op de basisfuncties van de Apache module mod_proxy. Een gedetailleerde beschrijving van de aanvullende modules en alle benodigde directives kun je vinden in de officiële documentatie van het Apache project.


Stap 2: de benodigde modules activeren

Om afzonderlijke modules van de Apache reverse proxyfunctie te activeren gebruik je het commando a2enmod. Modules die al zijn geactiveerd, kunnen met a2dismod worden gedeactiveerd. Voor het maken van een eenvoudige reverse proxy voor een downstream webserver volstaat het om mod_proxy en mod_proxy_http te laden:

sudo a2enmod proxy
sudo a2enmod proxy_http

Nadat de module is geactiveerd, moet de Apache reverse proxy HTTP-server opnieuw worden opgestart:

sudo apache2 reload

Stap 2: de benodigde modules activeren

Om te zorgen dat de reverse proxy aanvragen van internet kan ontvangen en kan doorsturen naar de juiste server in het lokale netwerk moet het configuratiebestand 000-default.conf in de map /etc/apache2/sites-enabled worden gedeactiveerd en worden vervangen door een virtual host bestand, zoals voorbeeld.conf. Het is raadzaam om voor elke doelserver met een eigen IP een apart virtual host bestand te maken volgens onderstaand schema:

<VirtualHost *:80>
ServerName domain.tld
ServerAlias www.domain.tld
ProxyRequests Off
ProxyPass / http://123.456.7.89/
ProxyPassReverse / http://123.456.7.89/
</VirtualHost>

Instructies voor de proxyfunctie worden gedefinieerd binnen de directive <VirtualHost>. De starttag bevat tevens het IP-adres inclusief poortnummer waarop Apache, geconfigureerd als reverse proxy, moet luisteren voor aanvragen. Wanneer alle IP-adressen daarbij zijn betrokken, wordt de tijdelijke aanduiding * zoals in het voorbeeld gebruikt. Aanduidingen binnen de VirtualHost-tags worden tevens aangegeven in de vorm van directives. In tegenstelling tot de VirtualHost-tag specificeren deze argumenten hoe inkomende aanvragen en antwoordpakketten moeten worden bewerkt. Vooral de directives ServerName, ProxyPass en ReversePass zijn daarbij essentieel.

  • ServerName: de directive ServerName definieert onder welke primaire naam een server bereikbaar is op internet. Die moet via DNS of /etc/hosts oplosbaar (resolvable) zijn. In het voorbeeld wordt de Apache server opgedragen om alle aanvragen aan domain.tld te accepteren.
  • ProxyPass: de directive ProxyPass definieert het doeladres voor een redirect. Alle aanvragen die zich richten tot het publieke adres dat onder ServerName is gespecificeerd, worden door de reverse proxy doorgestuurd naar het interne adres dat is gespecificeerd in het argument van de directive ProxyPass. In het voorbeeld zou dat het fictieve IP 123.456.7.89 zijn.
  • ProxyPassReverse: een reverse proxyserver ontvangt niet alleen aanvragen, maar stuurt ook antwoordpakketten door van de backend server naar de clients. Om te voorkomen dat deze antwoorden met verkeerde headerinformatie (namelijk die van de server op de achtergrond) worden afgeleverd, herschrijft de directive ProxyPassReverse de header van de serverantwoorden zo dat ze matchen met de reverse proxyserver. De backend server blijft zodoende anoniem.  

Daarnaast zijn er twee andere directives in het voorbeeld: ServerAlias en ProxyRequests. Deze hebben geen basisfunctie voor de reverse proxyserver en zijn dus optioneel.

  • ServerAlias: met de directive ServerAlias kun je naast de primaire servernaam een alternatieve naam voor de doelserver definiëren.
  • ProxyRequest: de directive ProxyRequests met het argument Off voorkomt dat de Apache reverse proxy HTTP-server wordt gebruikt als forward proxy ter preventie van mogelijk misbruik.

Als de regels voor de proxyfunctie zijn gedefinieerd, moet de configuratie worden geactiveerd via de terminal:

sudo a2ensite voorbeeld.conf

De Apache reverse proxy HTTP-server accepteert nu alle aanvragen aan domain.tld of www.domain.tld en stuurt die door in de vorm van proxy requests aan een backend server met het IP 123.456.7.89/.