Internal Routes HowTo

About

This document provides an example of how to set up OpenVPN internal routes. For simplicity, only basic configuration options are used.

Introduction

Company X has two sites A and B in different geographical locations, connected by a public network. They want to connect both sites to the same LAN and and have the networks behind the VPN nodes communicate.

The OpenVPN server node needs to know which networks are behind each of the client nodes. The internal routes associated with each client must be specified in the server configuration, as it is not able to infer this information from the routing table.

          Site A                               Site B

        .--------.                           .--------.
        |        |                           |        |
        |  Host  |                           |  Host  |
        |   A1   |                           |   B1   |
        '----+---'                           '---+----'
             | IP:10.70.0.2                      | IP:20.60.0.2
             |                                   |
             |                                   |
             |                                   |
        eth1 | IP:10.70.0.1                 eth1 | IP:20.60.0.1
        .----+---.                           .---+----.
        |        |                           |        |
        |  GW-A  |                           |  GW-B  |
        | server |                           | client |
        '----+---'                           '---+----'
      vlan2  |               .--.-.              | vlan2
  Public IP: |              ( (    )__           | Public IP:
192.168.0.21 '-------------(_,  \ ) ,_)----------' 192.168.0.22
                             '-'--`--'
                     Public Network/Internet

WeOS devices GW-A and GW-B both have a port on VLAN 2 connected to the WAN (Public network/Internet) and eth1 connected to the local network.

The example assumes that certificates have been generated offline and imported into both GW-A and GW-B.

Hosts A1 and B1 are not configured in this example. The gateways GW-A and GW-B are assumed to be able to reach each other via public IPv4 addresses.

Server Configuration

In this setup GW-A is the OpenVPN server node. To configure the server side of the tunnel, enter the following commands in the CLI:

First, create the tunnel:

server:/#> configure tunnel ssl 200
Creating new SSL tunnel 200, check your settings before activating the tunnel!
server:/config/tunnel/ssl-200/#> type tun
server:/config/tunnel/ssl-200/#> method cert
server:/config/tunnel/ssl-200/#> ca-certificate server1
server:/config/tunnel/ssl-200/#> certificate server1
server:/config/tunnel/ssl-200/#> server
server:/config/tunnel/ssl-200/#> client-to-client
server:/config/tunnel/ssl-200/#> leave

Then add a static ip address to the server’s end of the tunnel:

server:/#> configure iface ssl200
server:/config/iface-ssl200/#> no inet
server:/config/iface-ssl200/#> inet static 192.168.254.1/24
server:/config/iface-ssl200/inet-static-192.168.254.1/#> leave

Then create a client configuration:

server:/#> configure tunnel ssl 200
server:/config/tunnel/ssl-200/#> client-config 1
Creating new client config: 1!
server:/config/tunnel/ssl-200/client-config-1/#> common-name client1
server:/config/tunnel/ssl-200/client-config-1/#> address 192.168.254.21/24
server:/config/tunnel/ssl-200/client-config-1/#> iroute 20.60.0.0/24
server:/config/tunnel/ssl-200/client-config-1/#> end
server:/config/tunnel/ssl-200/#> push-network 10.70.0.0/24
server:/config/tunnel/ssl-200/#> leave

We have created a configuration for a new client, we have assigned a static ip address to its end of the tunnel (192.168.254.21), we have pushed the server’s network to the client (10.70.0.0/24), and we have also configured the tunnel to know about the internal routes to network behind the client’s node (20.60.0.0/24).

The final step is to add the routes to the client’s network.

server:/#> configure ip
server:/config/ip/#> route 20.60.0.0/24 ssl200
server:/config/ip/#> leave

Now we can check the tunnel and ssl interface status:

server:/#> show tunnel ssl
TUNNEL   DESCRIPTION     STATUS   UPTIME                                      
200      ssl200          Down

server:/#> sh iface ssl200
Name         : ssl200
Admin. State : Up
Oper. Status : DOWN
MAC Address  : N/A
IP Addresses : 192.168.254.1/24   (static)
MTU          : 1500
Statistics   :
               RX: Packets    Bytes        Errors CsumErrs OutOfSeq Mcasts
                   0          0            0      0        0        0       
               TX: Packets    Bytes        Errors DeadLoop NoRoute  NoBufs
                   0          0            0      0        0        0 

The tunnel as DOWN, which is expected. This changes to UP once a connection with a client has been established.

Client Configuration

GW-B is the OpenVPN client node. To configure the client side of the tunnel, enter the following commands in the CLI:

client:/#> configure tunnel ssl 200
Creating new SSL tunnel 200, check your settings before activating the tunnel!
client:/config/tunnel/ssl-200/#> type tun
client:/config/tunnel/ssl-200/#> method cert
client:/config/tunnel/ssl-200/#> ca-certificate client1
client:/config/tunnel/ssl-200/#> certificate client1
client:/config/tunnel/ssl-200/#> no server
client:/config/tunnel/ssl-200/#> peer 192.168.0.21
client:/config/tunnel/ssl-200/#> leave

The IP address for the peer is the public IP address of the server.

Again, we can check the tunnel and ssl interface status:

client:/#> show tunnel ssl
TUNNEL   DESCRIPTION     STATUS   UPTIME                                      
200      ssl200          UP       0 Days 0 Hours 0 Mins 10 Secs

client:/#> sh iface ssl200
Name         : ssl200
Admin. State : Up
Oper. Status : UP
MAC Address  : N/A
IP Addresses : 192.168.254.21/24  (UNKNOWN)
MTU          : 1500
Statistics   :
               RX: Packets    Bytes        Errors CsumErrs OutOfSeq Mcasts
                   0          0            0      0        0        0       
               TX: Packets    Bytes        Errors DeadLoop NoRoute  NoBufs
                   0          0            0      0        0        0     

Verifying connectivity

From host A1 to host B1:

a1:/#> ping count 5 20.60.0.2
Press Ctrl-C to abort PING 20.60.0.2 (20.60.0.2): 56 data bytes
64 bytes from 20.60.0.2: seq=0 ttl=62 time=5.482 ms
64 bytes from 20.60.0.2: seq=1 ttl=62 time=5.229 ms
64 bytes from 20.60.0.2: seq=2 ttl=62 time=5.225 ms
64 bytes from 20.60.0.2: seq=3 ttl=62 time=2.512 ms
64 bytes from 20.60.0.2: seq=4 ttl=62 time=5.215 ms

--- 20.60.0.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 2.512/4.732/5.482 ms
a1:/#>

From host B1 to host A1:

b1:/#> ping count 2 10.70.0.2
Press Ctrl-C to abort PING 10.70.0.2 (10.70.0.2): 56 data bytes
64 bytes from 10.70.0.2: seq=0 ttl=62 time=4.953 ms
64 bytes from 10.70.0.2: seq=1 ttl=62 time=5.440 ms

--- 10.70.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 4.953/5.196/5.440 ms

Note

Do not forget to add the route from host B1 to the tunnel so that the ping replies are routed correctly.

b1:/#> configure ip route 192.168.254.0/24 20.60.0.1
b1:/config/#> leave

Final Topology

The following figure illustrates the resulting topology, with an L3 tunnel connecting the two LANs via the virtual interface ssl200 on each GW device.

          Site A                                  Site B

        .--------.                              .--------.
        |        |                              |        |
        |  Host  |                              |  Host  |
        |   A1   |                              |   B1   |
        '----+---'                              '---+----'
             | IP:10.70.0.2                         | IP:20.60.0.2
             |                                      |
             |                                      |
             |                                      |
        eth1 | IP:10.70.0.1                    eth1 | IP:20.60.0.1
        .----+---.                              .---+----.
        |     `. |         OpenVPN Tunnel       | .´     |
        |  GW-A `+==============================+´ GW-B  |
        |        | ssl200                ssl200 |        |
        |        |192.168.254.1   192.168.254.21|        |
        '----+---'                              '---+----'        
      vlan2  |                .--.-.                | vlan2
  Public IP: |               ( (    )__             | Public IP:
192.168.0.21 '--------------(_,  \ ) ,_)------------' 192.168.0.22
                             '-'--`--'
                     Public Network/Internet