I've recently come back to looking at openvpn, after discovering that it now handles most things 'out of the box' for non-admins on Windows a requirement on our managed machines).

The one problem I've discovered is that as openvpn starts, it tries to alter the routing tables on the client to route through the VPN. However, these routing rules can only be changed by an admin - or more specifically by a member of the 'Network Configuration Operators' group, This group gives more rights to the user than are necessary for just routing, and may create security problems.

I've come up with a solution for this, for which I've written a
'proof-of-concept' script - please don't use this in service, as its not really
been tested!

The idea is that a Windows Service runs and in some way monitors the VPN connection (tailing a log file, having a socket which it can be connected to on, etc). the routing rules that are normally implemented by the openvpn command itself are moved to this service, and when 'triggered' it runs the routing commands. The service runs as an account with appropriate privileges to make these changes. There is no need to 'undo' these rules, since when the vpn is disconnected, and the tun device disappears, the network stack tidies up the routing table accordingly.

I've implemented this as a test using a VBS script, which watches the OpenVPN log file for successful connections.

The script is here:

http://www.see.ed.ac.uk/~mrichar1/openvpn-routing/

And relies on the srvany/instsrv tools from Microsoft. download all the files to c:\openvpn-routing\

To install:

instsrv.exe OPENVPN-Routing c:\openvpn-routing\srvany.exe

then edit the registry:

HKLM\CurrentControlSet\Services\OPENVPN-Routing\Parameters\

Create String 'Application' - value of:

cscript c:\openvpn-routing\monitor.vbs

At the moment the script doesn't change the routing tables - instead it
launches notepad to show its working - change the notepad line to the
appropriate route commands to actually use it.

All of the above is really provided as a demonstration of a possible solution for this problem - its written in vbs for simplicity, but I imagine (not being familiar with the openvpn code-base) that it would be possible to reproduce in a more suitable language and bundle as part of the openvpn package, and use a better mechanism than tailing the log file to make the call to the service to change the routing table.

Just a thought on solving this problem.  Comments etc welcome!

Matthew


--
=====================================================
Matthew Richardson
School of Engineering and Electronics,
The University of Edinburgh, King's Buildings,
Mayfield Rd, Edinburgh EH9 3JL
-----------------------------------------------------
0131 650 8747,  FAX: 0131 650 6554
m.richard...@ed.ac.uk
=====================================================

Reply via email to