CheckVPN
If you want to restrict access to a service to only on-campus / VPN users with a handy error page. The CheckVPN service https://checkvpn.uwaterloo.ca has a callback that keeps the request prams. It can be used with the following configurations:
APACHE2
<Location />
RewriteEngine On
RewriteCond expr "!(-R '127.0.0.0/8' || -R '10.0.0.0/8' || -R '172.16.0.0/12')"
RewriteCond expr "!(-R '129.97.0.0/16' || -R '192.168.0.0/16')"
# TODO: ipv6 rules
RewriteRule ^(.*) https://checkvpn.uwaterloo.ca/?callback=https://{{vars.server_name}}%{REQUEST_URI} [R]
...
</Location>
NGINX
geo $is_local_uw_ip {
default no;
127.0.0.0/8 yes;
10.0.0.0/8 yes;
172.16.0.0/12 yes;
192.168.0.0/16 yes;
129.97.0.0/16 yes;
# TODO: test ipv6 mapping!.
2620:101:F000::/47;
2620:101:f000:700::/56;
fd74:6b6a:8eca:504::/64;
}
server {
...
location / {
if ($is_local_uw_ip = no) {
return 307 https://checkvpn.uwaterloo.ca/?callback=https://{{vars.server_name}}$request_uri;
# NOTE: nginx does not have a good way to encode_url for the callback
# SO: A request like .. ?callback=https://me.com/?x=1&y=2
# will drop y=2 from the callback!
}
}
}
CADDY
In Caddy you can define a importable “block” in your CaddyFile to re-use in other parts of your configuration. The following creates a re-usable directive called “redirect_off_campus”, then uses it in a site configuration:
(redirect_off_campus) {
@external not remote_ip \
127.0.0.0/8 \
10.0.0.0/8 \
172.16.0.0/12 \
192.168.0.0/16 \
129.97.0.0/16 \
2620:101:F000::/47 \
2620:101:f000:700::/56 \
fd74:6b6a:8eca:504::/64
redir @external https://checkvpn.uwaterloo.ca/?callback={scheme}://{host}{uri} 307
}
cool-service.uwaterloo.ca {
import redirect_off_campus
reverse_proxy localhost:8000
}