WireGuard released their official iOS app today, and I wasted no time jumping on setting up a WireGuard server at home (based mostly on this guide). This is not going to be a tutorial, but instead, I’m going to talk about why WireGuard is a game-changer.
For years, I’ve used OpenVPN to connect back to my home network. Don’t get me wrong, OpenVPN is great, especially compared to dated, insecure alternatives like PPTP or L2TP/IPSec. But, for all its merits, OpenVPN has some drawbacks:
- OpenVPN is difficult to setup and maintain, especially considering configuration typically happens via command line scripts (however, there are web interfaces like OpenVPN Access Server and Pritunl).
- OpenVPN software isn’t built-in to devices (unlike PPTP and L2TP/IPSec).
- Clients are identified and authenticated via certificates, which expire at regular intervals, and need to be renewed.
- Certificates and client configuration files need to be distributed in a secure manner (e.g., probably not over email).
- OpenVPN is highly secure, but typically slow, because it uses AES encryption and offers many cipher options.
- OpenVPN is sensitive to changing networks (e.g., roaming from WiFi to cellular data).
- OpenVPN has a huge codebase, at over 600k lines of code, making it difficult to audit effectively (though, it has been audited).
What is WireGuard?
WireGuard is a next-generation VPN that promises to be almost everything that OpenVPN isn’t. It uses modern ideas and modern cryptography to solve modern problems.
Why you should use WireGuard
Compared one-to-one with the drawbacks above, you can see where WireGuard succeeds.
- WireGuard is dead simple to setup, with configuration files being only a few lines long. WireGuard purposely does not have dozens of encryption and cipher options (think about choosing a cipher suite in OpenVPN). It’s designed to lack cryptographic agility, so you don’t waste time choosing poor ciphers or improperly configure encryption. Keep It Simple, Stupid.
- WireGuard is proposed to be included directly into the Linux kernel, with Linus himself calling the code a “work of art“. This makes WireGuard extremely fast (in most cases, near line-rate). This also greatly increases its possible user-base, as anything using Linux will have WireGuard available to it by default.
- Clients are authenticated with public/private keypairs, like SSH. No more expiring certificates, and no worrying about the key exchange problem.
- Configuration files are very small, and can be distributed as a flat file, or as a QR code (super convenient for mobile devices).
- WireGuard uses modern cryptography and ciphers that perform well on a wide range of devices (e.g., mobile devices), not just x86 and x64 hardware.
- WireGuard is designed to be available when moving networks
- WireGuard is only about 4k lines, making it easy to audit (though, it has not been audited yet)
Some other advantages to WireGuard that didn’t fit into the categories above:
- WireGuard creates interfaces (e.g., wg0), which can be operated on like normal interfaces with tools like ip and ifconfig. It can also be managed by any network manager (e.g., systemd-networkd or NetworkManager).
- WireGuard is not a “chatty” protocol in that fact that it only transmits data when it needs to. When there is nothing to send, nothing is sent. This saves CPU, battery, data, etc…
- If WireGuard is misconfigured, it will generally not work, rather than working insecurely.
- Wireguard doesn’t respond to unauthenticated packets, so there’s no way to “scan” for a WireGuard server, making it stealthy.
- WireGuard has built-in quantum cryptography resistance, with the ability to use a pre-shared key as well.
Why you shouldn’t use WireGuard
- WireGuard is not a finished product, and should not be used in production yet. It also has not been formally audited.
- WireGuard is available for a variety of platforms (e.g., Linux, Mac, Android, iOS, BSDs), but not Windows (yet). Any other Windows clients are unofficial (as-of this writing).
Give WireGuard a try!