enchufado
   RSS
#
VPN punto-a-punto fácil con Wireguard (GNU/Linux) 2019-03-31 21:34:54

De hace un tiempo, llevo leyendo sobre un software de VPN que tiene intención de llegar a ser incorporada en el kernel Linux, pero por motivos X no se hizo. Recientemente rescaté mi interés por el tema, topándome con éste artículo de arstechnica.

Los halagos a ésta pieza de software vienen de varias personalidades, siendo los provinentes de Linus Torvalds los de mayor relevancia (al fin y al cabo, es el padre del kernel de nuestro Sistema Operativo favorito; y el de toda Internet).

Algunas características a grandes rasgos, como comentan desde arstechnica:

  • Opera como módulo de kernel. Es decir, opera en kernel-space.
  • Muchas menos LOC (lineas de código) respecto de proyectos similares: 4k vs los 600k de OpenVPN o los 400k de OpenSSL, que se traduce en un mejor control y revisión del código, reduciendo con ello los bugs y la superficie de ataque. También en una probable mayor agilidad de operación de éste software vs otros de mayor envergadura.
  • Configuración mucho más simple. Lo veremos a continuación en éste ejemplo.
  • Algoritmos mucho más fuertes. Ésto trae como consecuencia el poder usar claves de menor longitud, mejorando de nuevo la velocidad de ejecución.
  • Handshakes/negociaciones más simples. A costa de no poder cambiar ciphers y digests, no ha de ocurrir una negociación de los mismos entre los hosts implicados. Resultado de ésto y otros puntos mencionados antes, se obtienen también unos tiempos de conexión rápidos.

Antes de proceder, comentar que Wireguard requiere de un kernel Linux ≥3.10 con algunas opciones de configuración habilitadas. Pero tranquilo: la mayoria de las distribuciones ya las llevan habilitadas en sus stock kernels. Dicho ésto y sin más dilación, vamos al lio con una configuración de VPN punto-a-punto.

Instalación

Nosotros vamos a optar por la opción de compilarlo desde las fuentes y posteriormente paquetizarlo para Debian gracias a una herramienta que considero socorrida (checkinstall). Son temas personales, dado que así luego la operación de instalación/desinstalación se me hace más sencilla:

$ apt-get install libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-config
$ wget https://git.zx2c4.com/WireGuard/snapshot/WireGuard-0.0.20190227.tar.xz
$ tar -Jxvf WireGuard-0.0.20190227.tar.xz
$ cd WireGuard-0.0.20190227/src
$ make -j2
$ su
$ checkinstall # Ésto ya realiza la instalación desde el paquete .deb generado

Configuración

Después de leer el Quick Start de la documentación oficial de Wireguard, le eché un vistazo a la entrada al respecto de la Wiki de Arch (que siempre la encuentro de lo más exquisita por su clara exposición) y con eso me fue suficiente para levantar y dejar funcionando la VPN punto-a-punto.

En concreto, los pasos aplicados son los que van del punto 2.1 al 2.3. Aclarar que los endpoints son las direcciones ip en las que va a estar escuchando el servicio VPN (en mi caso, 2 ips públicas). Tener en cuenta que al igual que QUIC, Wireguard trabaja por UDP, y por tanto, hay que abrir los puertos dónde escuchará dicho servicio por éste protocolo.

# Generamos la private key en ambos peers, A y B
$ wg genkey > privatekey
$ chmod 600 privatekey

# Generamos la public key también an ambos peers
$ wg pubkey < privatekey > publickey

# Peer A: Levantaremos éste punto VPN en el puerto 48574 y
# aceptará conexiones del peer B enlazando la public key del
# mismo con su dirección pública y las ips permitidas. Sólo
# aceptará conexiones del peer B.
#
$ ip link add dev wg0 type wireguard
$ ip addr add 10.0.0.1/24 dev wg0
$ wg set wg0 listen-port 48574 private-key privatekey
$ wg set wg0 peer [Peer B public key] persistent-keepalive 25 allowed-ips 10.0.0.2/32 endpoint 10.10.10.2:39814
$ ip link set wg0 up

# Peer B: Como con el otro peer, levantaremos éste punto VPN
# en otro puerto (el 39814) y aceptará conexiones del peer A
# enlazando la public key del mismo con su dirección pública
# y las ips permitidas. Sólo aceptará conexiones del peer A.
#
$ ip link add dev wg0 type wireguard
$ ip addr add 10.0.0.2/24 dev wg0
$ wg set wg0 listen-port 39814 private-key ./privatekey
$ wg set wg0 peer [Peer A public key] persistent-keepalive 25 allowed-ips 10.0.0.1/32 endpoint 10.10.10.1:48574
$ ip link set wg0 up

Con ésto ya deberíamos tener la VPN levantada y los peers conectados, a no ser que haya algún problema de red o firewall que impida su conexión. Comprobaciones que podemos hacer:

# Ver la configuración de identidad y de los peers asociados
peer-a$ wg
 interface: wg0
   public key: UguPyBThx/+xMXeTbRYkKlP0Wh/QZT3vTLPOVaaXTD8=
   private key: (hidden)
   listening port: 48574
 
 peer: 9jalV3EEBnVXahro0pRMQ+cHlmjE33Slo9tddzCVtCw=
   endpoint: 10.10.10.2:39814
   allowed ips: 10.0.0.2/32

# Hacer un ping a la ip del otro peer al final del tunel
peer-a$ ping 10.0.0.2

Finalmente, podemos guardar la configuración de modo permanente y recuperarla posteriormente:

$ wg showconf wg0 > /etc/wireguard/wg0.conf
$ wg setconf wg0 /etc/wireguard/wg0.conf

Esperemos que ésta pieza de software no tarde en incorporarse en el mainline Linux kernel :)


Comentarios (0)


Volver al indice

login, admin, form, register