Documentation

Server 3.x

Split Tunnel#

Configuring “split tunnel”, i.e. only routing certain traffic over the VPN can be configured. It consists of three parts, although some may not be required for your particular setup:

  1. Configuring the “routes” to the client to inform them which IP ranges need to be routed over the VPN and make sure the VPN is not used as a “default gateway”;
  2. Configure and (internal) DNS server to be used by the clients that possibly resolves “local” names only;
  3. Restrict other traffic from being sent over the VPN to other locations than the pushed routes, the clients should not be able to override the “route” configuration, e.g. by forcing “default gateway”.

NOTE: if there are no internal-only DNS entries to resolve, you SHOULD NOT push DNS servers to the client. If there are, then make sure to also specify dnsSearchDomainList. In addition, make sure the IP address(es) of the DNS server(s) are also included in the routeList.

Example#

We have an organization example.local that has two IP ranges, 10.42.42.0/24 and 10.43.43.0/24 that clients need access to from home. The internal DNS server, on 10.1.1.1/32 is responsible for resolving the example.local domain for internal servers. Only traffic to these IP ranges and the DNS server should be allowed from the VPN server.

Profile Configuration#

Configure an office profile in /etc/vpn-user-portal/config.php, e.g.:

'ProfileList' => [
    [
        'defaultGateway' => false,
        'profileId' => 'office',
        'displayName' => 'Office',
        // issued to VPN clients
        'oRangeFour' => '10.0.0.0/24',
        'oRangeSix' => 'fd00::/64',
        // hostname VPN clients will connect to
        'hostName' => 'office.example.org',

        ...
        ...

        // push the routes to the client, *including* the DNS IP
        'routeList' => ['10.42.42.0/24', '10.43.43.0/24', '10.1.1.1/32'],

        // push the local DNS to the clients as well
        'dnsServerList' => ['10.1.1.1'],

        // Connection-specific DNS Suffix Search List
        'dnsSearchDomainList' => ['example.local', 'foo.example.local', 'bar.example.local'],
    ],
],

Take special note of the routeList, dnsServerList and dnsSearchDomainList options. See Profile Config for other configuration options that may be relevant for your situation.

To apply the configuration changes:

$ sudo vpn-maint-apply-changes

Routing List Collisions with VPN Server IP#

Sometimes you want VPN clients to send traffic over the VPN to certain prefixes, but the public IP address of the VPN server itself is contained in that prefix. This may result in a “routing loop” on some platforms.

In vpn-user-portal >= 3.5.5 this situation is handled automatically. If it is detected that the routeList also contains the public IPv4 address of the VPN server, even as part of a larger subnet, it is automatically excluded for OpenVPN. For IPv6 it was never necessary, and also WireGuard works fine with such overlap.

Firewall Configuration#

You may want to update your firewall to drop/reject traffic to prefixes you do not want routed over the VPN.