Tailscale vs Wireguard performance

Any reason I should expect iperf3 speeds to be much slower on Tailscale than Wireguard? Windows runs tailscale in userspace same as Wireguard right? CPU isn’t maxed out on any test.

On a gigabit 1ms local connection with packet size small enough to fit within each application’s packet window size:

Wireguard: 317mbps

PS C:\Program Files\iperf-3.1.3-win64> .\iperf3.exe -c 192.168.99.2 -l 1200
[  4] local 192.168.99.1 port 52674 connected to 192.168.99.2 port 5201


[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  38.4 MBytes   322 Mbits/sec
[  4]   1.00-2.01   sec  36.1 MBytes   300 Mbits/sec
[  4]   2.01-3.00   sec  39.9 MBytes   338 Mbits/sec
[  4]   3.00-4.00   sec  36.9 MBytes   309 Mbits/sec
[  4]   4.00-5.00   sec  38.8 MBytes   325 Mbits/sec
[  4]   5.00-6.00   sec  38.2 MBytes   320 Mbits/sec
[  4]   6.00-7.00   sec  37.3 MBytes   312 Mbits/sec
[  4]   7.00-8.00   sec  39.0 MBytes   328 Mbits/sec
[  4]   8.00-9.00   sec  36.3 MBytes   304 Mbits/sec
[  4]   9.00-10.00  sec  37.3 MBytes   313 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   378 MBytes   317 Mbits/sec                  sender
[  4]   0.00-10.00  sec   378 MBytes   317 Mbits/sec                  receiver

Tailscale (Direct): 275mbps

PS C:\Program Files\iperf-3.1.3-win64> .\iperf3.exe -c 100.96.118.106 -l 1200
[  4] local 100.118.125.44 port 52722 connected to 100.96.118.106 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  36.5 MBytes   306 Mbits/sec
[  4]   1.00-2.00   sec  34.9 MBytes   293 Mbits/sec
[  4]   2.00-3.00   sec  35.5 MBytes   297 Mbits/sec
[  4]   3.00-4.00   sec  37.7 MBytes   316 Mbits/sec
[  4]   4.00-5.01   sec  29.0 MBytes   242 Mbits/sec
[  4]   5.01-6.00   sec  30.2 MBytes   255 Mbits/sec
[  4]   6.00-7.00   sec  31.1 MBytes   260 Mbits/sec
[  4]   7.00-8.00   sec  30.4 MBytes   256 Mbits/sec
[  4]   8.00-9.00   sec  28.7 MBytes   241 Mbits/sec
[  4]   9.00-10.00  sec  34.9 MBytes   293 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   329 MBytes   276 Mbits/sec                  sender
[  4]   0.00-10.00  sec   328 MBytes   275 Mbits/sec                  receiver

Native: 352

PS C:\Program Files\iperf-3.1.3-win64> .\iperf3.exe -c 192.168.24.24 -l 1200
[  4] local 192.168.24.167 port 57833 connected to 192.168.24.24 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.01   sec  43.4 MBytes   359 Mbits/sec
[  4]   1.01-2.00   sec  40.9 MBytes   348 Mbits/sec
[  4]   2.00-3.00   sec  41.5 MBytes   347 Mbits/sec
[  4]   3.00-4.00   sec  41.6 MBytes   350 Mbits/sec
[  4]   4.00-5.00   sec  42.3 MBytes   354 Mbits/sec
[  4]   5.00-6.00   sec  44.7 MBytes   376 Mbits/sec
[  4]   6.00-7.00   sec  43.2 MBytes   361 Mbits/sec
[  4]   7.00-8.00   sec  40.4 MBytes   339 Mbits/sec
[  4]   8.00-9.01   sec  39.7 MBytes   329 Mbits/sec
[  4]   9.01-10.00  sec  42.7 MBytes   363 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   420 MBytes   353 Mbits/sec                  sender
[  4]   0.00-10.00  sec   420 MBytes   352 Mbits/sec                  receiver

Allowing an unlimited window grows the difference even more:

Tailscale

[  4] local 100.118.125.44 port 60113 connected to 100.96.118.106 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  37.0 MBytes   310 Mbits/sec
[  4]   1.00-2.01   sec  30.9 MBytes   257 Mbits/sec
[  4]   2.01-3.00   sec  32.2 MBytes   273 Mbits/sec
[  4]   3.00-4.00   sec  29.1 MBytes   244 Mbits/sec
[  4]   4.00-5.00   sec  29.5 MBytes   248 Mbits/sec
[  4]   5.00-6.00   sec  24.0 MBytes   202 Mbits/sec
[  4]   6.00-7.00   sec  33.4 MBytes   280 Mbits/sec
[  4]   7.00-8.00   sec  20.0 MBytes   168 Mbits/sec
[  4]   8.00-9.00   sec  14.8 MBytes   124 Mbits/sec << high variability too here.
[  4]   9.00-10.01  sec  13.4 MBytes   111 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.01  sec   264 MBytes   221 Mbits/sec                  sender
[  4]   0.00-10.01  sec   264 MBytes   221 Mbits/sec                  receiver

Wireguard

[  4] local 192.168.99.1 port 60174 connected to 192.168.99.2 port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  62.2 MBytes   521 Mbits/sec
[  4]   1.00-2.00   sec  60.6 MBytes   509 Mbits/sec
[  4]   2.00-3.00   sec  64.4 MBytes   540 Mbits/sec
[  4]   3.00-4.00   sec  65.1 MBytes   546 Mbits/sec
[  4]   4.00-5.00   sec  65.5 MBytes   550 Mbits/sec
[  4]   5.00-6.00   sec  62.4 MBytes   523 Mbits/sec
[  4]   6.00-7.00   sec  63.9 MBytes   536 Mbits/sec
[  4]   7.00-8.00   sec  60.4 MBytes   506 Mbits/sec
[  4]   8.00-9.00   sec  63.4 MBytes   532 Mbits/sec
[  4]   9.00-10.00  sec  61.9 MBytes   519 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   630 MBytes   528 Mbits/sec                  sender
[  4]   0.00-10.00  sec   630 MBytes   528 Mbits/sec                  receiver

Wireguard with standard window size is more than twice as fast.


Over a higher latency internet connection between two nodes the differences seems to also remain.

Tailscale Subnet Router
Reverse mode, remote host VPNHost is sending

[  4] local 100.118.125.44 port 61180 connected to 192.168.###.### port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  9.49 MBytes  79.6 Mbits/sec
[  4]   1.00-2.00   sec  8.49 MBytes  71.2 Mbits/sec
[  4]   2.00-3.00   sec  7.03 MBytes  58.8 Mbits/sec
[  4]   3.00-4.00   sec  6.86 MBytes  57.7 Mbits/sec
[  4]   4.00-5.00   sec  8.99 MBytes  75.4 Mbits/sec
[  4]   5.00-6.00   sec  6.40 MBytes  53.7 Mbits/sec
[  4]   6.00-7.00   sec  9.73 MBytes  81.4 Mbits/sec
[  4]   7.00-8.00   sec  8.63 MBytes  72.5 Mbits/sec
[  4]   8.00-9.00   sec  7.96 MBytes  66.8 Mbits/sec
[  4]   9.00-10.00  sec  6.82 MBytes  57.2 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec  80.6 MBytes  67.6 Mbits/sec                  sender
[  4]   0.00-10.00  sec  80.5 MBytes  67.6 Mbits/sec                  receiver

Wireguard & iptables

Reverse mode, remote host VPNHost is sending
[  4] local 192.168.###.### port 51546 connected to 192.168.###.### port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.01   sec  13.0 MBytes   108 Mbits/sec
[  4]   1.01-2.00   sec  13.3 MBytes   112 Mbits/sec
[  4]   2.00-3.00   sec  12.5 MBytes   104 Mbits/sec
[  4]   3.00-4.00   sec  12.7 MBytes   107 Mbits/sec
[  4]   4.00-5.00   sec  13.5 MBytes   113 Mbits/sec
[  4]   5.00-6.00   sec  11.8 MBytes  98.8 Mbits/sec
[  4]   6.00-7.00   sec  13.3 MBytes   111 Mbits/sec
[  4]   7.00-8.00   sec  13.4 MBytes   113 Mbits/sec
[  4]   8.00-9.00   sec  13.0 MBytes   109 Mbits/sec
[  4]   9.00-10.00  sec  12.8 MBytes   107 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   129 MBytes   109 Mbits/sec                  sender
[  4]   0.00-10.00  sec   129 MBytes   109 Mbits/sec                  receiver

Wireguard is >50% faster

With MTU size constraints:

Tailscale Subnet Router (Linux)

PS C:\Program Files\iperf-3.1.3-win64> .\iperf3.exe -c VPNHost -R -l 1200
[  4] local 100.118.125.44 port 57918 connected to 192.168.###.### port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec  92.0 MBytes  77.2 Mbits/sec                  receiver

Wireguard & iptables

PS C:\Program Files\iperf-3.1.3-win64> .\iperf3.exe -c VPNHost -R -l 1200
[  4] local 192.168.###.### port 52597 connected to 192.168.###.### port 5201

[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.00  sec   152 MBytes   128 Mbits/sec                  receiver

Wireguard is nearly twice as fast.

  • Gavin