Hi,
There has been a lot of interest in WireGuard on the OpenBSD subreddit. So here
is a patch that provides a few basic examples for usage.
Thanks,
Jim
Index: www/faq/faq17.html
===================================================================
RCS file: /cvs/www/faq/faq17.html,v
retrieving revision 1.16
diff -u -p -u -r1.16 faq17.html
--- www/faq/faq17.html 12 Dec 2020 19:07:25 -0000 1.16
+++ www/faq/faq17.html 2 May 2021 15:08:42 -0000
@@ -54,6 +54,7 @@ FAQ - Virtual Private Networks (VPN)
<li><a href="#clientwindows">With a Windows Client</a>
</ul>
<li><a href="#clientikev1" >Connecting to an IKEv1/L2TP OpenBSD VPN</a>
+ <li><a href="#wireguard" >WireGuard</a>
</ul>
<hr>
@@ -78,12 +79,6 @@ also available and, coupled with
<a href="https://man.openbsd.org/npppd">npppd(8)</a>, it allows you to build
an IKEv1/L2TP VPN where IKEv2 can't be deployed.
-<p>
-Native WireGuard support is also available via the
-<a href="https://man.openbsd.org/wg">wg(4)</a> device.
-As the manual explains, it can be configured the same way as all other
-<a href="faq6.html">network interfaces</a> in OpenBSD.
-
<h2 id="authentication">Authentication</h2>
<a href="https://man.openbsd.org/iked">iked(8)</a> supports the following
@@ -644,3 +639,169 @@ OpenBSD doesn't provide an L2TP client b
Refer to <code>/usr/local/share/doc/pkg-readmes/xl2tpd</code> for instructions
on how to properly setup the L2TP client.
+
+<h2 id="wireguard">WireGuard</h2>
+
+<p>
+Native WireGuard support is also available via the
+<a href="https://man.openbsd.org/wg">wg(4)</a> device.
+As the manual explains, it can be configured the same way as all other
+<a href="faq6.html">network interfaces</a> in OpenBSD.
+
+<p>
+WireGuard is an interface based VPN tunnel, which requires more knowledge
+about networking to get functioning.
+It can act as a responder or initiator or both where possible.
+WireGuard is a connectionless based tunnel, meaning there is no need to worry
+about daemons or state of the tunnel.
+The encryption / decryption key that is negotiated has a very short life span
of
+2 minutes and does not rely on the last packet recieved; so it is very
resilient
+against packet loss.
+
+<p>
+Required to forward traffic over WireGuard interfaces.
+
+<pre class="cmdbox">
+# <b>sysctl net.inet.ip.forwarding=1</b>
+</pre>
+
+<h3>Client to Server example</h3>
+
+<h4>Server configuration (responder)</h4>
+
+<p>
+Create a persistnent private key and interface, set listening port, get the
+pubkey that the client will need.
+
+<pre class="cmdbox">
+server# <b>echo "wgkey `openssl rand -base64 32`" > /etc/hostname.wg0</b>
+server# <b># sh /etc/netstart wg0</b>
+server# <b>ifconfig wg0 wgport 51820</b>
+server# <b>ifconfig wg0 | grep wgpubkey | cut -d ‘ ‘ -f 2</b>
+zQfRbQPcQiLppc55LJWbFCdrnHdpxZTg47VQmJG6heE=
+server# <b>ifconfig wg0 inet 192.0.2.1/24</b>
+server# <b>ifconfig wg0 wgpeer f+wtDqJrNnSIRqOCCiBa4YWGZ58WLSo5b5oWjBQt6Xg= \
+ wgpsk jPNozq8SGbXk5ACrfAHEA3/O1jWlrhiCJ4ibvon3oqc= \
+ wgaip 192.0.2.2/32</b>
+</pre>
+
+<p>
+PF rules needed for clients to establish a connection and enter and leave on
the
+wg0 interface on the server.
+The nat-to rule is only needed if you want the client to be able to use the
+internet of the server.
+
+<pre class="cmdbox">
+pass in on egress inet proto udp to port 51820
+match out on egress from wg0:network nat-to egress # needed for client to surf
the internet
+pass on wg keep state (if-bound)
+</pre>
+
+<h4>Client configuration (initiator)</h4>
+
+<p>
+Create a persistnent private key and interface and get the pubkey that the
+server will need.
+
+<pre class="cmdbox">
+client# <b>echo "wgkey `openssl rand -base64 32`" > /etc/hostname.wg0</b>
+client# <b># sh /etc/netstart wg0</b>
+clinet# <b>ifconfig wg0 | grep wgpubkey | cut -d ‘ ‘ -f 2</b>
+f+wtDqJrNnSIRqOCCiBa4YWGZ58WLSo5b5oWjBQt6Xg=
+client# <b>ifconfig wg0 inet 192.0.2.2/24</b>
+client# <b>ifconfig wg0 wgpeer zQfRbQPcQiLppc55LJWbFCdrnHdpxZTg47VQmJG6heE= \
+ wgpsk jPNozq8SGbXk5ACrfAHEA3/O1jWlrhiCJ4ibvon3oqc= \
+ wgendpoint a.b.c.d 51820 wgaip 0.0.0.0/0</b>
+</pre>
+
+<p>
+PF rules needed for traffic to enter and leave on the wg0 interface on the
+client.
+
+<pre class="cmdbox">
+pass on wg keep state (if-bound)
+</pre>
+
+<p>
+Routes needed on client to tunnel all traffic to / through the server.
+
+<pre class="cmdbox">
+client# <b>route add -priority 2 a.b.c.d `netstat -rn | grep default | \
+ awk ‘{print $2}’`</b>
+client# <b>route add -priority 7 default 192.0.2.1/24</b>
+</pre>
+
+<h3>Server to Server example</h3>
+
+<p>
+This example shows 2 servers each with another subnet connected to them. Pay
+close attention to the wgaip info. There can be multiple allowed IP's or
+subnets each with their own wgaip for the wgpeer line.
+
+
+<h4>Server 1 configuration (initiator and responder)</h4>
+
+<p>
+Create a persistnent private key and interface, set listening port, get the
+pubkey that server 2 will need.
+
+<pre class="cmdbox">
+server1# <b>echo "wgkey `openssl rand -base64 32`" > /etc/hostname.wg0</b>
+server1# <b># sh /etc/netstart wg0</b>
+server1# <b>ifconfig wg0 wgport 51820</b>
+server1# <b>ifconfig wg0 | grep wgpubkey | cut -d ‘ ‘ -f 2</b>
+zQfRbQPcQiLppc55LJWbFCdrnHdpxZTg47VQmJG6heE=
+server1# <b>ifconfig wg0 inet 192.0.2.1/24</b>
+server1# <b>ifconfig wg0 wgpeer f+wtDqJrNnSIRqOCCiBa4YWGZ58WLSo5b5oWjBQt6Xg= \
+ wgpsk jPNozq8SGbXk5ACrfAHEA3/O1jWlrhiCJ4ibvon3oqc= \
+ wgendpoint e.f.g.h 51820 wgaip 192.0.2.2/32 wgaip
10.0.1.0/24</b>
+</pre>
+
+<p>
+PF rules needed for server 2 to establish a connection and enter and leave on
+the wg0 interface.
+
+<pre class="cmdbox">
+pass in on egress inet proto udp to port 51820
+pass on wg keep state (if-bound)
+</pre>
+
+<p>
+Routes needed on server 1 to allow 10.0.0.0/24 to reach 10.0.1.0/24.
+
+<pre class="cmdbox">
+server1# <b>route add 10.0.1.0/24 192.0.2.2</b>
+</pre>
+
+<h4>Server 2 configuration (initiator and responder)</h4>
+
+<p>
+Create a persistnent private key and interface and get the pubkey that the
+server 1 will need.
+
+<pre class="cmdbox">
+server2# <b>echo "wgkey `openssl rand -base64 32`" > /etc/hostname.wg0</b>
+server2# <b># sh /etc/netstart wg0</b>
+server2# <b>ifconfig wg0 | grep wgpubkey | cut -d ‘ ‘ -f 2</b>
+f+wtDqJrNnSIRqOCCiBa4YWGZ58WLSo5b5oWjBQt6Xg=
+server2# <b>ifconfig wg0 inet 192.0.2.2/24</b>
+server2# <b>ifconfig wg0 wgpeer zQfRbQPcQiLppc55LJWbFCdrnHdpxZTg47VQmJG6heE= \
+ wgpsk jPNozq8SGbXk5ACrfAHEA3/O1jWlrhiCJ4ibvon3oqc= \
+ wgendpoint a.b.c.d 51820 wgaip 192.0.2.1/32 wgaip
10.0.0.0/24</b>
+</pre>
+
+<p>
+PF rules needed for server 1 to establish a connection and enter and leave on
the
+wg0 interface.
+
+<pre class="cmdbox">
+pass in on egress inet proto udp to port 51820
+pass on wg keep state (if-bound)
+</pre>
+
+<p>
+Routes needed on server 2 to allow 10.0.1.0/24 to reach 10.0.0.0/24.
+
+<pre class="cmdbox">
+server2# <b>route add 10.0.0.0/24 192.0.2.1</b>
+</pre>