WireGuard importado a OpenBSD-6.7
Articulo Original de OpenBSD Journal
En el siguiente commit (y muchos otros), David Gwynne (dlg@) importó la mayor parte del código enviado recientemente por Jason A. Donenfeld y Matt Dunwoodie para permitirle usar WireGuard de forma nativa en OpenBSD:
CVSROOT: /cvs Module name: src Changes by: dlg@cvs.openbsd.org 2020/06/21 06:11:26 Modified files: sys/net : if.c Added files: sys/net : if_wg.c if_wg.h wg_cookie.c wg_cookie.h wg_noise.c wg_noise.h Log message: add wg(4), an in kernel driver for WireGuard vpn communication. thanks to Matt Dunwoodie and Jason A. Donenfeld for their effort. it's at least as functional as the go implementation, and maybe more so since this one works on more architectures. i'm sure there's further development that can be done, but you can say that about anything and everything that's in the tree. ok deraadt@
El protocolo VPN WireGuard ha estado disponible en OpenBSD como un puerto durante un tiempo, primero como la implementación `wireguard-go` en Go, pero luego también como el puerto wireep en C, ambos utilizando dispositivos tun(4), al igual que OpenVPN y otros, que incurre en una leve penalización por cruzar el borde del núcleo/espacio de usuario para cada paquete.
WireGuard es un túnel de capa 3 que se puede ejecutar en modo pasivo, solo enviando paquetes cuando algo necesita llegar al otro lado (a menos que habilite los latidos (heartbeats)). Solo permite algoritmos y algoritmos criptográficos modernos seleccionados, elegidos para funcionar en CPU que carecen de aceleradores criptográficos, a la vez que son seguros. Los paquetes de WireGuard se envían a través de UDP y pueden ejecutarse y transportar tanto IPv4 como IPv6. Maneja redirecciones NAT/puertos y puntos finales que cambian las direcciones IP, lo cual es muy bueno cuando se cambia de cableado a wifi o viceversa.
Jason y Matt han estado ocupados haciendo que WireGuard funcione de forma nativa en OpenBSD, y enviaron un parche enorme a tech@ recientemente [ver informe anterior](https://undeadly.org/cgi?action=article;sid=20200512080047) para poder ejecutarlo en OpenBSD, usando ifconfig(8) y con soporte de kernel para las interfaces wg(4).
Después de tres revisiones de parches enviadas, dlg@ ahora ha comenzado a importarlo a la base, y pronto debería habilitarse en los núcleos GENERIC.
Actualización 24 de junio de 2020: wg(4) se ha habilitado y ahora está disponible en las últimas instantáneas:
CVSROOT: /cvs Module name: src Changes by: dlg@cvs.openbsd.org 2020/06/23 17:35:39 Modified files: sys/conf : GENERIC Log message: enable wg(4). this will make testing easier for everyone. from Jason A. Donenfeld and Matt Dunwoodie ok deraadt@ tobhe@
Lo probamos rápidamente en dos máquinas virtuales vmm(4) que ejecutan la última instantánea de amd64:
test1$ doas ifconfig wg0 create wgport 9999 wgkey `openssl rand -base64 32` test1$ doas ifconfig wg0 wgpeer PvZvkFVrCX9bV1JG4BkGqRhmcbXt9KG3INwUJSbT7mE= wgendpoint fe80::fce1:bbff:fed1:c6db%vio0 9999 wgaip 10.0.0.1/32 test1$ doas ifconfig wg0 10.0.0.2/24 test1$ doas ifconfig wg0 wg0: flags=80c3<UP,BROADCAST,RUNNING,NOARP,MULTICAST> mtu 1420 index 6 priority 0 llprio 3 wgport 9999 wgpubkey 5nYUSIRp3RlfRclN7Fz5KtFnLCECxxHJmL9TLmwE0A8= wgpeer PvZvkFVrCX9bV1JG4BkGqRhmcbXt9KG3INwUJSbT7mE= wgendpoint fe80:1::fce1:bbff:fed1:c6db 9999 tx: 2608, rx: 2608 last handshake: 82 seconds ago wgaip 10.0.0.1/32 groups: wg inet 10.0.0.2 netmask 0xffffff00 broadcast 10.0.0.255
Y:
test2$ doas ifconfig wg0 create wgport 9999 wgkey `openssl rand -base64 32` test2$ doas ifconfig wg0 wgpeer 5nYUSIRp3RlfRclN7Fz5KtFnLCECxxHJmL9TLmwE0A8= wgendpoint fe80::fce1:bbff:fed1:c6d9%vio0 9999 wgaip 10.0.0.2/32 test2$ doas ifconfig wg0 10.0.0.1/24 test2$ doas ifconfig wg0 wg0: flags=80c3<UP,BROADCAST,RUNNING,NOARP,MULTICAST> mtu 1420 index 5 priority 0 llprio 3 wgport 9999 wgpubkey PvZvkFVrCX9bV1JG4BkGqRhmcbXt9KG3INwUJSbT7mE= wgpeer 5nYUSIRp3RlfRclN7Fz5KtFnLCECxxHJmL9TLmwE0A8= wgendpoint fe80:1::fce1:bbff:fed1:c6d9 9999 tx: 2608, rx: 2608 last handshake: 123 seconds ago wgaip 10.0.0.2/32 groups: wg inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
Con eso, se crean y configuran las interfaces wireguard en test1 y test2. Ahora puede alcanzar uno del otro a través de la VPN:
test1$ ping -c 3 10.0.0.1 PING 10.0.0.1 (10.0.0.1): 56 data bytes 64 bytes from 10.0.0.1: icmp_seq=0 ttl=255 time=1.484 ms 64 bytes from 10.0.0.1: icmp_seq=1 ttl=255 time=1.309 ms 64 bytes from 10.0.0.1: icmp_seq=2 ttl=255 time=1.549 ms --- 10.0.0.1 ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 1.309/1.447/1.549/0.101 ms