WireGuard

Based on https://www.scaleway.com/en/docs/installing-wireguard-vpn-linux/

To use this guide you need VPS to use as VPN server.

Use Debian 10 on both server and client.

On both server and client

In Qubes, do the following steps in TemplateVM (debian-10).

If needed, enable buster-backports:

$ echo 'deb http://deb.debian.org/debian buster-backports main' | sudo tee /etc/apt/sources.list.d/buster-backports.list
$ sudo apt-get update

If needed, install kernel headers:

$ sudo apt-get install linux-headers-amd64

Install WireGuard:

$ sudo apt-get install wireguard resolvconf

Make sure kernel module was installed:

$ sudo modprobe wireguard
$ echo $?
0

In Qubes, shutdown debian-10 TemplateVM and do the following steps in ProxyVM sys-wireguard based on debian-10. On the server, continue in the same terminal.

Generating Public and Private Keys

# mkdir -p /etc/wireguard/keys
# cd /etc/wireguard/keys
# umask 077
# wg genkey | tee privatekey | wg pubkey > publickey

On server

Create the file /etc/wireguard/wg0.conf with the following content:

[Interface]
PrivateKey = <private key of the server>
Address = 192.168.66.1/32
ListenPort = <random port for server>
PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -A FORWARD -i %i -o %i -j DROP; iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o %i -j DROP; iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <public key of the client>
AllowedIPs = 192.168.66.2/32

<add more clients if needed>

Run:

$ sudo wg-quick up wg0

You can also enable the start of WireGuard on server at boot time with the following command:

$ sudo systemctl enable wg-quick@wg0.service

On client

Create the file /home/user/wg0.conf with the following content:

[Interface]
PrivateKey = <private key of the client>
Address = 192.168.66.2/32
DNS = 1.1.1.1
PostUp = iptables -t nat -I PREROUTING 1 -p udp -m udp --dport 53 -j DNAT --to-destination 1.1.1.1; iptables -t nat -I POSTROUTING 3 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

[Peer]
PublicKey = <public key of the client>
Endpoint = <public ip of server>:<public port of server>
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Run:

$ sudo wg-quick up /home/user/wg0.conf

It should work at this point.

Add the following to /rw/config/rc.local:

wg-quick up /home/user/wg0.conf

Then chmod +x /rw/config/rc.local

Then go to Qubes firewall settings and limit outgoing connections to UDP <public ip of server>:<public port of server>. Then do to dom0 console and use qvm-firewall command to remove unneeded exceptions for ICMP and DNS:

$ qvm-firewall sys-wireguard
... 4 rules, including unwanted DNS and ICMP rules ...
$ qvm-firewall sys-wireguard del --rule-no 1
$ qvm-firewall sys-wireguard del --rule-no 1
$ qvm-firewall sys-wireguard
... 2 rules ...

Make sure it now has only the server rule and then DROP.

On Android/iOS

You can use wireguard on Android or iOS devices.

Android: https://play.google.com/store/apps/details?id=com.wireguard.android&hl=fr

iOS: https://apps.apple.com/us/app/wireguard/id1441195209?ls=1

In the app, select Create from scratch and configure it the same way you did in sys-wireguard. The form has the same fields as the file.


This document was migrated from the qubes-community project
  • Page archive
  • First commit: 31 Oct 2020. Last commit: 24 Nov 2020.
  • Applicable Qubes OS releases based on commit dates and supported releases: 4.0
  • Original author(s) (GitHub usernames): ratpoison4
  • Original author(s) (forum usernames): N/A
  • Document license: GPLv2
1 Like

In my case I had to make sure /etc/resolv.conf is a soft link to /run/resolvconf/resolv.conf. It was in the template but for some reason my actual qube (AppVM) would contain a file instead with the DNS servers listed.

So I added the following lines into my /rw/config/rc.local:

rm /etc/resolv.conf
ln -s /run/resolvconf/resolv.conf /etc/resolv.conf
wg-quick up /home/user/wg0.conf

The rest of the guide worked as expected.