Apache Restricted Proxy

Apache Restricted Proxy


A restricted proxy server, one that only allows access to a tight subset of websites. Apache is the logical choice for such an endeavor, but configuration is not terribly straightforward. After numerous attempts, I settled on something like the below. I found that a ProxyAllow directive would have fit the bill perfectly, but is curiously lacking.

Configuration

This Apache 2.0 configuration will test the HTTP_HOST variable against a very short list of allowed domains, after fully-qualifying any non-FQDNs to the local domain. If it does not match any of the domains, the rewrite rule's [F] flag returns a 403. Other options would be using an external rewrite map for more flexibility on the list of allowed domains.

<VirtualHost *:80>
        ServerName restproxy.example.com
        ServerAlias restproxy
        DocumentRoot /var/www/html/restproxy
        ErrorDocument 403 "This web site is forbidden.  Please contact Big Brother if you have any questions."

        ProxyRequests On
        ProxyVia On
        <Proxy *>
                Order Deny,Allow
                Allow from 192.168
                Deny from all
        </Proxy>

        RewriteEngine On
        RewriteLog      /var/log/httpd/restproxy_rewrite_log
        RewriteLogLevel 1

        # If no dot in hostname, fully-qualify with .example.com
        RewriteMap      lowercase                       int:tolower
        RewriteCond     ${lowercase:%{HTTP_HOST}}       ^([^:]*).*$
        RewriteCond     %1              !\.                                             [NC]
        RewriteRule     ^.*/(.*)        http://%1.example.com:%{SERVER_PORT}/$1         [L,R]

        # Damn it would be nice to have a ProxyAllow directive
        RewriteMap      lowercase                       int:tolower
        RewriteCond     ${lowercase:%{HTTP_HOST}}       ^([^:]*).*$
        RewriteCond     %1                              !.*example.com$
        RewriteCond     %1                              !.*google.com$
        RewriteCond     %1                              !.*cnn.com$
        RewriteRule     ^proxy:         -                                               [F]
</VirtualHost>