Configurar cliente servidor WireGuard en OpenBSD
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: