Get faster OpenVPN on FreeBSD by enabling DCO – easily done

I’ve been configuring a new gateway server for use in my basement data center (home lab). I had recently read about DCO and FreeBSD’s opvn device.

DCO (Data Channel Offload) let’s OpenVPN use the encryption features available in many CPUs. In my previous post, I checked; my OpenVPN server and most of the clients are DCO-capable.

I decided to try it.

I found documentation lacking as to how to use it. I took advice from mzar on #FreeBSD on Libera.chat.

They said:

“kernel module has to be loaded, network topology set to subnet, compression disabled, openvpn process run as root and you will have it.”

In this post:

  • FreeBSD 14.2 (on the gateway, where OpenVPN is running)
  • OpenVPN 2.6.13
  • FreeBSD 14.1 (on the server, running iperf)
  • iperf3 3.18 (on the server for testing)
  • iperf 3.8.1 (on my laptop, Apple version iperf3-117 (cJSON 1.7.13)
  • Viscosity 1.11.4 (1702) – OpenVPN client for OSX

About the tests

When testing, the iperf server was running on the host r730-03, a Dell R730 in my basement.

My laptop was connected via the VPN into the basement home lab.

Initially the laptop was connected wirelessly. Later, it was connected via a network cable. In both cases, Viscosity was used to connect to my OpenVPN server running on my 4-ATOM CPU (named gw01).

On the wired connection, the laptop is using a 1Gbit/second switch.

I saved the server side of the tests in this gist.

kernel module has to be loaded

[19:02 gw01 dvl ~] % kldstat | grep vpn
 7    1 0xffffffff8333b000     d848 if_ovpn.ko

I had this line in /boot/loader.conf.local (/boot/loader.conf will do as well):

if_ovpn_load="YES"

I had rebooted since adding that line, but you can load that dynamically via kldload if_ovpn (see man 4 ovpn)

network topology set to subnet

[19:03 gw01 dvl ~] % sudo grep topology /usr/local/etc/openvpn/openvpn.conf
topology subnet

compression disabled

[19:03 gw01 dvl ~] % sudo grep compression /usr/local/etc/openvpn/openvpn.conf
allow-compression no

openvpn process run as root

[19:04 gw01 dvl ~] % sudo grep user  /usr/local/etc/openvpn/openvpn.conf
[19:04 gw01 dvl ~] % sudo service openvpn start                         
Starting openvpn.
[20:16 gw01 dvl ~] % ps auwwx | grep openvpn
root     6770   0.1  0.0  23508 10588  -  Ss   19:28     1:09.54 /usr/local/sbin/openvpn --cd /usr/local/etc/openvpn --daemon 
openvpn --config /usr/local/etc/openvpn/openvpn.conf --writepid /var/run/openvpn.pid

and you will have it

Here is my test before making the above changes. FYI, I issued this command on the server at 10.55.0.143: iperf3 -s.

This is the command issued on my laptop, which was connected over WIFI:

-----------------------------------------------------------
Server listening on 5201 (test #3)
-----------------------------------------------------------
Accepted connection from 10.8.1.180, port 62652
[  5] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 62653
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.06   sec  5.88 MBytes  46.4 Mbits/sec                  
[  5]   1.06-2.06   sec  8.75 MBytes  73.7 Mbits/sec                  
[  5]   2.06-3.02   sec  8.25 MBytes  72.3 Mbits/sec                  
[  5]   3.02-4.06   sec  10.0 MBytes  80.2 Mbits/sec                  
[  5]   4.06-5.06   sec  9.38 MBytes  78.8 Mbits/sec                  
[  5]   5.06-6.06   sec  8.38 MBytes  70.5 Mbits/sec                  
[  5]   6.06-7.06   sec  9.25 MBytes  77.4 Mbits/sec                  
[  5]   7.06-8.06   sec  9.12 MBytes  76.5 Mbits/sec                  
[  5]   8.06-9.06   sec  9.00 MBytes  75.5 Mbits/sec                  
[  5]   9.06-10.01  sec  8.50 MBytes  75.1 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.01  sec  86.5 MBytes  72.5 Mbits/sec                  receiver
-----------------------------------------------------------

Now, after:

-----------------------------------------------------------
Server listening on 5201 (test #1)
-----------------------------------------------------------
Accepted connection from 10.8.1.180, port 63109
[  5] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63110
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.06   sec  14.1 MBytes   112 Mbits/sec                  
[  5]   1.06-2.06   sec  13.9 MBytes   117 Mbits/sec                  
[  5]   2.06-3.06   sec  12.4 MBytes   104 Mbits/sec                  
[  5]   3.06-4.06   sec  14.2 MBytes   120 Mbits/sec                  
[  5]   4.06-5.05   sec  14.5 MBytes   122 Mbits/sec                  
[  5]   5.05-6.01   sec  13.0 MBytes   114 Mbits/sec                  
[  5]   6.01-7.06   sec  14.2 MBytes   114 Mbits/sec                  
[  5]   7.06-8.01   sec  11.8 MBytes   104 Mbits/sec                  
[  5]   8.01-9.02   sec  13.8 MBytes   114 Mbits/sec                  
[  5]   9.02-10.01  sec  14.1 MBytes   120 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.01  sec   136 MBytes   114 Mbits/sec                  receiver

Let’s do some more wifi testing

Then I did some parallel tests:

-----------------------------------------------------------
Server listening on 5201 (test #7)
-----------------------------------------------------------
Accepted connection from 10.8.1.180, port 63176
[  5] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63177
[  8] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63178
[ 10] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63179
[ 12] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63180
[ 14] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63181
[ 16] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63182
[ 18] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63183
[ 20] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63184
[ 22] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63185
[ 24] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63186
[ 26] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63187
[ 28] local 10.55.0.143 port 5201 connected to 10.8.1.180 port 63188
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.06   sec  1.62 MBytes  12.8 Mbits/sec                  
[  8]   0.00-1.06   sec  1.38 MBytes  10.8 Mbits/sec                  
[ 10]   0.00-1.06   sec  1.50 MBytes  11.8 Mbits/sec                  
[ 12]   0.00-1.06   sec  1.75 MBytes  13.8 Mbits/sec                  
[ 14]   0.00-1.06   sec  1.00 MBytes  7.89 Mbits/sec                  
[ 16]   0.00-1.06   sec  1.88 MBytes  14.8 Mbits/sec                  
[ 18]   0.00-1.06   sec  1.50 MBytes  11.8 Mbits/sec                  
[ 20]   0.00-1.06   sec  1.38 MBytes  10.8 Mbits/sec                  
[ 22]   0.00-1.06   sec  1.25 MBytes  9.86 Mbits/sec                  
[ 24]   0.00-1.06   sec  2.12 MBytes  16.8 Mbits/sec                  
[ 26]   0.00-1.06   sec  1.00 MBytes  7.89 Mbits/sec                  
[ 28]   0.00-1.06   sec  1.50 MBytes  11.8 Mbits/sec                  
[SUM]   0.00-1.06   sec  17.9 MBytes   141 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   1.06-2.06   sec  1.50 MBytes  12.6 Mbits/sec                  
[  8]   1.06-2.06   sec  1.12 MBytes  9.47 Mbits/sec                  
[ 10]   1.06-2.06   sec  1.62 MBytes  13.7 Mbits/sec                  
[ 12]   1.06-2.06   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 14]   1.06-2.06   sec  1.38 MBytes  11.6 Mbits/sec                  
[ 16]   1.06-2.06   sec  1.00 MBytes  8.42 Mbits/sec                  
[ 18]   1.06-2.06   sec  1.12 MBytes  9.47 Mbits/sec                  
[ 20]   1.06-2.06   sec  1.62 MBytes  13.7 Mbits/sec                  
[ 22]   1.06-2.06   sec  1.75 MBytes  14.7 Mbits/sec                  
[ 24]   1.06-2.06   sec  1.38 MBytes  11.6 Mbits/sec                  
[ 26]   1.06-2.06   sec  1.75 MBytes  14.7 Mbits/sec                  
[ 28]   1.06-2.06   sec  1.25 MBytes  10.5 Mbits/sec                  
[SUM]   1.06-2.06   sec  16.8 MBytes   141 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   2.06-3.00   sec  1.75 MBytes  15.6 Mbits/sec                  
[  8]   2.06-3.00   sec  1.25 MBytes  11.1 Mbits/sec                  
[ 10]   2.06-3.00   sec  1.50 MBytes  13.4 Mbits/sec                  
[ 12]   2.06-3.00   sec  1.50 MBytes  13.4 Mbits/sec                  
[ 14]   2.06-3.00   sec  1.38 MBytes  12.3 Mbits/sec                  
[ 16]   2.06-3.00   sec  1.50 MBytes  13.4 Mbits/sec                  
[ 18]   2.06-3.00   sec  1.12 MBytes  10.0 Mbits/sec                  
[ 20]   2.06-3.00   sec  1.50 MBytes  13.4 Mbits/sec                  
[ 22]   2.06-3.00   sec  1.75 MBytes  15.6 Mbits/sec                  
[ 24]   2.06-3.00   sec  1.38 MBytes  12.3 Mbits/sec                  
[ 26]   2.06-3.00   sec  1.50 MBytes  13.4 Mbits/sec                  
[ 28]   2.06-3.00   sec  1.25 MBytes  11.1 Mbits/sec                  
[SUM]   2.06-3.00   sec  17.4 MBytes   155 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   3.00-4.00   sec  1.25 MBytes  10.5 Mbits/sec                  
[  8]   3.00-4.00   sec  1.38 MBytes  11.5 Mbits/sec                  
[ 10]   3.00-4.00   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 12]   3.00-4.00   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 14]   3.00-4.00   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 16]   3.00-4.00   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 18]   3.00-4.00   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 20]   3.00-4.00   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 22]   3.00-4.00   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 24]   3.00-4.00   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 26]   3.00-4.00   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 28]   3.00-4.00   sec  1.62 MBytes  13.6 Mbits/sec                  
[SUM]   3.00-4.00   sec  17.1 MBytes   143 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   4.00-5.03   sec  1.25 MBytes  10.2 Mbits/sec                  
[  8]   4.00-5.03   sec  1.88 MBytes  15.3 Mbits/sec                  
[ 10]   4.00-5.03   sec  1.38 MBytes  11.2 Mbits/sec                  
[ 12]   4.00-5.03   sec  1.50 MBytes  12.2 Mbits/sec                  
[ 14]   4.00-5.03   sec  1.25 MBytes  10.2 Mbits/sec                  
[ 16]   4.00-5.03   sec  1.62 MBytes  13.2 Mbits/sec                  
[ 18]   4.00-5.03   sec  1.38 MBytes  11.2 Mbits/sec                  
[ 20]   4.00-5.03   sec  1.38 MBytes  11.2 Mbits/sec                  
[ 22]   4.00-5.03   sec  1.38 MBytes  11.2 Mbits/sec                  
[ 24]   4.00-5.03   sec  1.38 MBytes  11.2 Mbits/sec                  
[ 26]   4.00-5.03   sec  1.75 MBytes  14.2 Mbits/sec                  
[ 28]   4.00-5.03   sec  1.12 MBytes  9.15 Mbits/sec                  
[SUM]   4.00-5.03   sec  17.2 MBytes   140 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   5.03-6.03   sec  1.62 MBytes  13.6 Mbits/sec                  
[  8]   5.03-6.03   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 10]   5.03-6.03   sec  1.75 MBytes  14.7 Mbits/sec                  
[ 12]   5.03-6.03   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 14]   5.03-6.03   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 16]   5.03-6.03   sec  1.75 MBytes  14.7 Mbits/sec                  
[ 18]   5.03-6.03   sec  1.12 MBytes  9.44 Mbits/sec                  
[ 20]   5.03-6.03   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 22]   5.03-6.03   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 24]   5.03-6.03   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 26]   5.03-6.03   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 28]   5.03-6.03   sec  1.88 MBytes  15.7 Mbits/sec                  
[SUM]   5.03-6.03   sec  18.4 MBytes   154 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   6.03-7.04   sec  1.62 MBytes  13.6 Mbits/sec                  
[  8]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 10]   6.03-7.04   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 12]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 14]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 16]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 18]   6.03-7.04   sec  1.38 MBytes  11.5 Mbits/sec                  
[ 20]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 22]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 24]   6.03-7.04   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 26]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[ 28]   6.03-7.04   sec  1.50 MBytes  12.5 Mbits/sec                  
[SUM]   6.03-7.04   sec  17.5 MBytes   146 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   7.04-8.06   sec  1.75 MBytes  14.3 Mbits/sec                  
[  8]   7.04-8.06   sec  1.38 MBytes  11.3 Mbits/sec                  
[ 10]   7.04-8.06   sec   896 KBytes  7.17 Mbits/sec                  
[ 12]   7.04-8.06   sec  1.75 MBytes  14.3 Mbits/sec                  
[ 14]   7.04-8.06   sec  1.00 MBytes  8.19 Mbits/sec                  
[ 16]   7.04-8.06   sec  1.88 MBytes  15.4 Mbits/sec                  
[ 18]   7.04-8.06   sec  1.50 MBytes  12.3 Mbits/sec                  
[ 20]   7.04-8.06   sec  1.38 MBytes  11.3 Mbits/sec                  
[ 22]   7.04-8.06   sec  1.25 MBytes  10.2 Mbits/sec                  
[ 24]   7.04-8.06   sec  2.00 MBytes  16.4 Mbits/sec                  
[ 26]   7.04-8.06   sec  1.50 MBytes  12.3 Mbits/sec                  
[ 28]   7.04-8.06   sec   896 KBytes  7.17 Mbits/sec                  
[SUM]   7.04-8.06   sec  17.1 MBytes   140 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   8.06-9.06   sec  1.00 MBytes  8.40 Mbits/sec                  
[  8]   8.06-9.06   sec  1.12 MBytes  9.45 Mbits/sec                  
[ 10]   8.06-9.06   sec  1.50 MBytes  12.6 Mbits/sec                  
[ 12]   8.06-9.06   sec  1.62 MBytes  13.6 Mbits/sec                  
[ 14]   8.06-9.06   sec  1.50 MBytes  12.6 Mbits/sec                  
[ 16]   8.06-9.06   sec  1.38 MBytes  11.5 Mbits/sec                  
[ 18]   8.06-9.06   sec  1.12 MBytes  9.45 Mbits/sec                  
[ 20]   8.06-9.06   sec  1.38 MBytes  11.5 Mbits/sec                  
[ 22]   8.06-9.06   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 24]   8.06-9.06   sec  1.25 MBytes  10.5 Mbits/sec                  
[ 26]   8.06-9.06   sec  1.38 MBytes  11.5 Mbits/sec                  
[ 28]   8.06-9.06   sec  1.25 MBytes  10.5 Mbits/sec                  
[SUM]   8.06-9.06   sec  15.8 MBytes   132 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   9.06-10.01  sec  1.50 MBytes  13.3 Mbits/sec                  
[  8]   9.06-10.01  sec  1.00 MBytes  8.85 Mbits/sec                  
[ 10]   9.06-10.01  sec  1.50 MBytes  13.3 Mbits/sec                  
[ 12]   9.06-10.01  sec  1.38 MBytes  12.2 Mbits/sec                  
[ 14]   9.06-10.01  sec  1.62 MBytes  14.4 Mbits/sec                  
[ 16]   9.06-10.01  sec  1.38 MBytes  12.2 Mbits/sec                  
[ 18]   9.06-10.01  sec  1.38 MBytes  12.2 Mbits/sec                  
[ 20]   9.06-10.01  sec  1.25 MBytes  11.1 Mbits/sec                  
[ 22]   9.06-10.01  sec  1.00 MBytes  8.85 Mbits/sec                  
[ 24]   9.06-10.01  sec  1.00 MBytes  8.85 Mbits/sec                  
[ 26]   9.06-10.01  sec  1.50 MBytes  13.3 Mbits/sec                  
[ 28]   9.06-10.01  sec  1.50 MBytes  13.3 Mbits/sec                  
[SUM]   9.06-10.01  sec  16.0 MBytes   142 Mbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.01  sec  14.9 MBytes  12.5 Mbits/sec                  receiver
[  8]   0.00-10.01  sec  13.2 MBytes  11.1 Mbits/sec                  receiver
[ 10]   0.00-10.01  sec  14.4 MBytes  12.0 Mbits/sec                  receiver
[ 12]   0.00-10.01  sec  15.1 MBytes  12.7 Mbits/sec                  receiver
[ 14]   0.00-10.01  sec  13.1 MBytes  11.0 Mbits/sec                  receiver
[ 16]   0.00-10.01  sec  15.5 MBytes  13.0 Mbits/sec                  receiver
[ 18]   0.00-10.01  sec  13.2 MBytes  11.1 Mbits/sec                  receiver
[ 20]   0.00-10.01  sec  14.2 MBytes  11.9 Mbits/sec                  receiver
[ 22]   0.00-10.01  sec  14.0 MBytes  11.7 Mbits/sec                  receiver
[ 24]   0.00-10.01  sec  14.6 MBytes  12.3 Mbits/sec                  receiver
[ 26]   0.00-10.01  sec  15.0 MBytes  12.6 Mbits/sec                  receiver
[ 28]   0.00-10.01  sec  13.8 MBytes  11.5 Mbits/sec                  receiver
[SUM]   0.00-10.01  sec   171 MBytes   143 Mbits/sec                  receiver

143 Mbits/sec over 12 parallel tests.

What about wired

After some reconfiguration, I connected my laptop over a wired connection and tried again.

[16:06 pro04 dvl ~] % iperf3-darwin -c r730-03     
Connecting to host r730-03, port 5201
[  7] local 10.8.1.180 port 63962 connected to 10.55.0.143 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd          RTT
[  7]   0.00-1.00   sec  27.7 MBytes   232 Mbits/sec    0    436 KBytes   8ms     
[  7]   1.00-2.00   sec  27.7 MBytes   232 Mbits/sec    0    436 KBytes   9ms     
[  7]   2.00-3.00   sec  27.1 MBytes   227 Mbits/sec    0    436 KBytes   7ms     
[  7]   3.00-4.00   sec  27.8 MBytes   233 Mbits/sec    0    436 KBytes   8ms     
[  7]   4.00-5.00   sec  27.9 MBytes   234 Mbits/sec    0    538 KBytes   8ms     
[  7]   5.00-6.00   sec  27.9 MBytes   234 Mbits/sec    0    538 KBytes   8ms     
[  7]   6.00-7.00   sec  28.0 MBytes   235 Mbits/sec    0    538 KBytes   8ms     
[  7]   7.00-8.00   sec  27.9 MBytes   234 Mbits/sec    0    538 KBytes   8ms     
[  7]   8.00-9.00   sec  27.7 MBytes   233 Mbits/sec    0    538 KBytes   8ms     
[  7]   9.00-10.00  sec  28.1 MBytes   236 Mbits/sec    0    538 KBytes   6ms     
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  7]   0.00-10.00  sec   278 MBytes   233 Mbits/sec    0             sender
[  7]   0.00-10.00  sec   278 MBytes   233 Mbits/sec                  receiver

iperf Done.

That seems a decent change.

Website Pin Facebook Twitter Myspace Friendfeed Technorati del.icio.us Digg Google StumbleUpon Premium Responsive

Leave a Comment

Scroll to Top