Escrito por Adrian Ali el 4 de abril de 2021 usando OpenBSD Release 6.8 y revisado el 06 de marzo de 2022 usando OpenBSD Release 7.0

contacto: adrianali arroba fortix.com.ar

Configurar cliente servidor WireGuard en OpenBSD

1. Introduccion

El controlador wg en OpenBSD proporciona interfaces de red privada virtual (VPN) para el intercambio seguro de tráfico en capa 3 con otros pares WireGuard utilizando el protocolo WireGuard. Una interfaz wg reconoce uno o más pares, establece un túnel seguro con cada uno bajo demanda y rastrea el punto final UDP de cada par para intercambiar tráfico cifrado.

Este es un instructivo básico de como hacer una configuración tipo “roadwarrior” o VPS.

                             T  U  N  E  L                 
CLIENTE                     I N T E R N E T         SERVIDOR
----------------                                    ----------------- 
|              |                                    |               |
|              |                  <IP Publica>:51820|               |
|iwn0(Internet)|<---------------------------------->|em0:10.0.0.0/8)|
|              |wg0:192.168.66.78  192.168.66.77:wg0|               |
|              |                                    |               |
----------------                                    ----------------- 
                                                            |
                                                            |
                                                        --------
                                                        |      |
                                                        | LAN  |
                                                        |      |
                                                        --------

2. Configuración en el servidor

Se usara como server OpenBSD 6.8.

a. Instalo WireGuard

server ~ root # pkg_add -mv wireguard-tools

b. Chequear que este habilitado el forward

server ~ root # sysctl net.inet.ip.forwarding
net.inet.ip.forwarding=1
server ~ root #

sino:

server ~ root # sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 1 -> 1
server ~ root #

poner esta configuración persistente en:

server ~ root # 
server ~ root # grep net.inet.ip.forwarding /etc/sysctl.conf
server ~ root # 
server ~ root # echo "net.inet.ip.forwarding=1" >> /etc/sysctl.conf
server ~ root # 
server ~ root # grep net.inet.ip.forwarding /etc/sysctl.conf       
net.inet.ip.forwarding=1
server ~ root #

c. Generar par de llaves pública/privada

server ~ root # 
server ~ root # mkdir /etc/wireguard
server ~ root # chmod 700 /etc/wireguard
server ~ root # cd /etc/wireguard
server /etc/wireguard root # wg genkey > secret.key
Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.
server /etc/wireguard root # chmod 600 secret.key
server /etc/wireguard root # wg pubkey < secret.key > public.key
server /etc/wireguard root #

d. Crear archivo de configuración

server ~ root # vi /etc/wireguard/wg0.conf

con el contenido:

[Interface]
PrivateKey = <aquí va la PRIVATE key del server, la que generamos 1 paso atras>
ListenPort = 51820

# client 1
[Peer]
PublicKey = <aquí la PUBLIC key del cliente, cuando la generemos la pondremos aquí>
AllowedIPs = 192.168.66.78/32

e. Configurar de forma persistente que WireGuard inicie en boot time

Configuro archivo:

/etc/hostname.wg0

con el contenido:

inet 192.168.66.77 255.255.255.0 NONE
up

!/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf

f. Configuraciones de PF (Packet Filter) en el servidor

Se debe configurar PF para dos cosas, primero que deje pasar trafico del puerto UDP de WireGuard y segundo que deje hacer el forward desde WireGuard a la interface de elección (subred adonde queremos llegar), editar:

/etc/pf.conf

con el contenido:

# configuraciones WireGuard para el server
pass in on wg0
pass in inet proto udp from any to any port 51820
pass out on egress inet from (wg0:network) nat-to (vlan0:0)

g. Agregar mas clientes

Lo unico que tenemos que hacer para agregar mas clientes es agregar bloques:

# client N
[Peer]
PublicKey = <public key del nuevo cliente>
AllowedIPs = IP_del_nuevo_cliente/32

en el archivo:

/etc/wireguard/wg0.conf

luego de esto podemos hacer:

server ~ root # sh /etc/netstart wg0

para que WireGuard actualice los cambios.

h. Generar archivos QR code para clientes Android

genero par de llaves pública/privada para cliente Android:

server ~ root # mkdir -p /etc/wireguard/clients/client1
server ~ root # cd /etc/wireguard/clients/client1
server ~ root # wg genkey > secret.key
server ~ root # cat secret.key | wg pubkey > public.key

escribo el archivo de configuración del client1:

server ~ root # vi /etc/wireguard/clients/client1/client1.conf

con el contenido:

[Interface]
PrivateKey = <PrivateKey del cliente>
Address = 192.168.66.81/24
DNS = 172.16.0.1

[Peer]
PublicKey = <PublicKey del server>
AllowedIPs = 10.20.0.0/16 , 172.16.0.0/16
Endpoint = 199.185.178.80:51820

luego para generar el QR code:

server /etc/wireguard/clients/client1 root #  qrencode -o client1.png < client1.conf

envio ese archivo al usuario para que lo carge desde la APP desde su celular, información de como hacer en:

https://serversideup.net/how-to-configure-a-wireguard-ios-client/ https://serversideup.net/how-to-configure-a-wireguard-android-vpn-client/

i. Habilitar debug de las conexiones en el servidor

Se habilita el debug con el comando:

server ~ root # ifconfig wg0 debug

fijarse que antes de habilitar el debug el comando ‘ifconfig -A’ en ves de mostrar:

wg0: flags=80c3<UP,BROADCAST,RUNNING,NOARP,MULTICAST> mtu 1420

mostrara:

wg0: flags=80c7<UP,BROADCAST,DEBUG,RUNNING,NOARP,MULTICAST> mtu 1420

luego en el log del kernel veremos salidas como:

nain ~ root # tail -f /var/log/kern.log | grep wg0
Apr 13 09:01:08 nain /bsd: wg0: Sending handshake initiation to peer 0
Apr 13 09:01:08 nain /bsd: wg0: Receiving handshake response from peer 0
Apr 13 09:01:08 nain /bsd: wg0: Sending keepalive packet to peer 0
Apr 13 09:01:08 nain /bsd: wg0: Receiving keepalive packet from peer 0
Apr 13 09:01:51 nain /bsd: wg0: Sending keepalive packet to peer 0
Apr 13 09:02:29 nain /bsd: wg0: Sending keepalive packet to peer 0

3. Configuracion en el cliente

Se usara como cliente OpenBSD 6.8.

a. Instalo WireGuard

client ~ root # pkg_add -mv wireguard-tools

b. Generar par de llaves publica/privada

client ~ root # 
client ~ root # mkdir /etc/wireguard
client ~ root # chmod 700 /etc/wireguard
client ~ root # cd /etc/wireguard
client /etc/wireguard root # wg genkey > secret.key
Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.
client /etc/wireguard root # chmod 600 secret.key
client /etc/wireguard root # wg pubkey < secret.key > public.key
client /etc/wireguard root #

c. Crear archivo de configuracion

client ~ root # vi /etc/wireguard/wg0.conf

con el contenido:

[Interface]
PrivateKey = <aqui va la PRIVATE key del client, la que generamos 1 paso atras>

[Peer]
PublicKey = <aqui la PUBLIC key del server>
Endpoint = 199.185.178.80:51820
AllowedIPs = 10.20.0.0/16 , 172.16.0.0/16

d. Configurar de forma persistente que encienda WireGuard al inicio

Configuracion archivo:

/etc/hostname.wg0

con el contenido:

inet 192.168.66.78 255.255.255.0 NONE
up

!/usr/local/bin/wg setconf wg0 /etc/wireguard/wg0.conf
!route add 10.20.0.0/16 192.168.66.77
!route add 172.16.0.0/16 192.168.66.77

Fijarse que al final del archivo agregamos un par de rutas para llegar a las subredes que queremos acceder a través del túnel.

e. Probar la VPN

Enviar un ping a una IP atras del tunel:

client ~ root # ping -c3 10.20.0.26
PING 10.20.0.26 (10.20.0.26): 56 data bytes
64 bytes from 10.20.0.26: icmp_seq=0 ttl=62 time=6.900 ms
64 bytes from 10.20.0.26: icmp_seq=1 ttl=62 time=2.435 ms
64 bytes from 10.20.0.26: icmp_seq=2 ttl=62 time=2.523 ms

--- 10.20.0.26 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 2.435/3.952/6.900/2.084 ms
client ~ root #

4. Chequeos y logs

a. Controlar que el server este escuchando conexiones

Al reiniciar el server se tiene que ver:

server ~ root # netstat -anv -f inet | grep 51820
udp          0      0  *.51820                *.*                   
server ~ root #

b. Controlar en el server y en el cliente que las reglas de PF se hayan cargado

server ~ root # pfctl -s rules
pass in on wg0 all flags S/SA
pass in inet proto udp from any to any port = 51820
pass out on egress inet from (wg0:network) to any flags S/SA nat-to (vlan0:0)
server ~ root #

5. Referencias

En la instalacion del cliente o servidor OpenBSD leer:

/usr/local/share/doc/pkg-readmes/wireguard-tools

Howto en Internet:

https://ianix.com/wireguard/openbsd-howto.html

Pagina del manual:

https://man.openbsd.org/wg.4