Instalando y configurando wireguard en Debian 10

por | 18 diciembre, 2020

Hace un tiempo salio a la luz que wireguard pasó a estar incluido dentro del kernel linux versión 5.6 e incluye algunas mejoras en comparación al actual rey OpenVPN así que vamos a probarlo

En este post voy a hacer la instalación en un equipo con kernel 4.19.0-8-amd64 con debian 10 tanto servidor como cliente y probaré configurando un cliente en Android, en resumen en este post haremos:

Lo primero es comentar que wireguard no usa los términos Cliente/Servidor, en su reemplazo solo los identifican como pares (o peers) aquí solo por costumbre con OpenVPN vamos a mantener la terminología

Instalación Server/Cliente

Como les comente al inicio, vamos a realizar la instalación de wireguard en 2 equipos, ambos con Debian 10 y kernel 4.19.0-8-amd64. Este paso se realiza de la misma manera en ambos equipos (tanto cliente como servidor)

En el caso especifico de debian los paquetes aun se encuentran en la rama unestable por lo que según la wiki de debian debemos añadir el repositorio usando el siguiente comando

echo "deb http://deb.debian.org/debian/ unstable main" | sudo tee /etc/apt/sources.list.d/unstable-wireguard.list
printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' | sudo tee /etc/apt/preferences.d/limit-unstable
apt update
apt install wireguard

Un paso extra que podríamos necesitar es el código fuente del kernel que estemos usando (para la compilación de dkms), si no tienen el paquete linux-headers al intentar instalar wireguard-dkms les puede salir un mensaje como el siguiente, tienen que tener ojo de cual es la salida de la instalación

Configurando wireguard-dkms (1.0.20200429-2) ...
Loading new wireguard-1.0.20200429 DKMS files...
Module build for kernel 4.19.0-8-amd64 was skipped since the
kernel headers for this kernel does not seem to be installed.

si les aparece tienen que ejecutar la siguiente instalación

apt install linux-headers-$(uname -r)

Otro problema que encontré en el segundo servidor es que el paquete «bc» no estaba instalado y no se pudo compilar wireguard-dkms, esto se soluciono simplemente instalando el paquete faltante y automáticamente hizo la recompilacion del modulo dkms

apt install  bc

Con eso ya tendremos los paquetes necesarios instalados en nuestras maquinas, en el link oficial de wireguard pueden ver el paquete necesario para su distro y en que rama/repositorio lo pueden encontrar

Configuración llaves

Esta parte se realiza tanto en el lado cliente como el lado servidor y es una de las grandes diferencias con OpenVPN.

Tenemos que generar 2 llaves, una pública y la privada, como se imaginan la publica hay que compartirla con el peer y la privada se queda en la configuración local de wireguard, el nombre de los archivos no es relevante por lo que pueden usar los nombres que deseen, en mi caso elegí usar private.key y public.key

Para crear la llave publica usamos

 wg genkey > private.key

Esto nos generara un string aleatorio el cual usaremos para generar la llave publica y en la configuración de wireguard

Al igual que al manejar cualquier llave privada con ssh también se recomienda darle los permisos 600 (rw—) a este archivo generado por temas de seguridad

chmod 600 private.key

Luego usando el mismo archivo generado procedemos a crear el archivo con la llave publica la cual almacenaremos en el archivo public.key

wg pubkey < private.key > public.key

una forma mas rápida de ejecutar estos mismos pasos en uno solo es

wg genkey | tee private.key | wg pubkey >  public.key

Configuración Server/Cliente

Ya teniendo las llaves listas vamos a configurar wireguard en si, para eso creamos un archivo wg0.conf en el directorio /etc/wireguard, el nombre que le demos al archivo definirá la interfaz que se usará, en este caso como usare wg0.conf esa será la interfaz que se va a crear. Pondremos en el archivo la clave publica que creamos anteriormente junto con otros parámetros necesarios tales como la IP, el puerto y reglas si son necesarias, en mi caso quedará una configuración de la siguiente forma

[Interface]
PrivateKey = mIV/wlztpT0TL1w9bCGUhp2Ay5SYyuKmm2jnLQC/iHg=
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
SaveConfig = true

Las opciones mandatorias son:

  • [Interface]
  • PrivateKey
  • Address
  • ListenPort

Las opciones extra de PostUp y PostDown serán comandos que se ejecutaran al levantar la interfaz, en este caso esas reglas nos permitirán enrutar trafico a través de la interfaz de wireguard, en el equipo cliente tengo politicas muy estrictas por lo que use PostUp y PostDown para permitir el trafico quedando este archivo final

[Interface]
Address = 10.0.0.2/24
SaveConfig = true
PostUp = iptables -A OUTPUT -o wg0 -j ACCEPT; iptables -A INPUT -i wg0 -j ACCEPT; iptables -A SERVIDOR -p udp --dport 51820 -j ACCEPT -m comment --comment "Wireguard VPN"
PostDown = iptables -D OUTPUT -o wg0 -j ACCEPT; iptables -D INPUT -i wg0 -j ACCEPT; iptables -D SERVIDOR -p udp --dport 51820 -j ACCEPT -m comment --comment "Wireguard VPN"
ListenPort = 51820
PrivateKey = OHuqbgfPoqbYb0FrFqzXZ7o57Um0oh4UxgE3iR1arU0=

Este paso lo tenemos que realizar en ambos equipos antes de continuar con el siguiente paso

Conexión entre pares

Teniendo ya la configuración tanto en el lado del servidor como en el lado cliente tenemos que añadir una nueva sección en el archivo de configuración en ambos extremos incluyendo la información del peer correspondiente. O sea en el archivo de configuración del Servidor tenemos que poner la información del cliente y en el archivo de configuración del cliente tenemos que poner la información del servidor.

[Peer]
PublicKey = <Llave publica del peer vecino>
Endpoint = <IP publica del peer vecino>:<Puerto usado en el peer vecino>
AllowedIPs = <IP's definidas en el archivo del vecino seccion "Address">

Notaran que yo he generado las llaves en archivos y estos archivos no han sido usados directamente en los archivos de configuración, también se puede evitar la creación de estos archivos de llave colocando los output de los comandos directamente en el archivo de configuración y no habrá problemas.

Cabe decir que el obtener llaves tanto publicas como privadas es un proceso muy rápido en la mayoría de los equipos

instalación en Android

Para este paso tenemos que instalar el software de Wireguard oficial y para la configuración tenemos varias opciones:

  • crear un archivo de configuración directamente en el Android
  • Importar un archivo de configuración
  • Utilizar un código QR generado desde un linux

En mi caso me he decidido por la opción 3 por lo que necesito en la maquina donde voy a configurar el cliente un programa capaz de generar códigos QR a través de la terminal, en mi caso seguí la opción ofrecida por la wiki de debian e instale el paquete qrencode

apt install qrencode

Luego cree un nuevo archivo de configuración para Android con el siguiente contenido

[Interface]
Address = 10.0.0.3/24
ListenPort = 51820
PrivateKey = cF++Sel1AkR/Z5CBSqE608vK3MhNozVL3+GZCTo9I1Y=

[Peer]
PublicKey = J0fiqDmpwZtcdEaPs2tKwI7PbaPBM5815D50sfN7c2k=
AllowedIPs = 10.0.0.1/32
Endpoint = <IP Publica servidor>:51820

Como ven la sintaxis es muy similar a la que usamos en las maquinas Linux en esta parte genere nuevas llaves publico/privada donde la privada queda en este nuevo archivo y la publica se agrega a wg0 del equipo servidor, luego usamos el programa antes descargado para generar el código QR

 qrencode -t ansiutf8 < mobile.conf

y ya con eso podemos escanear la terminal y tener configurado nuestro Android con wireguard.

Un punto a tener en consideración es que, como el equipo móvil cambia constantemente de IP no podemos agregar esa información en el lado del servidor (a no ser que se utilice alguna solución tipo ddns pero realmente no vale la pena) por lo que si necesitamos comunicar desde el servidor al cliente no va a poder ser posible a no ser que el túnel permanezca activo y para esto hay que generar tráfico desde el cliente al servidor

Hasta el momento de terminar de escribir este post no he podido descubrir como enrutar el tráfico a través de wireguard

Iniciar interfaz con el sistema

Una vez que tengamos configurada nuestra interfaz podemos iniciarla con systemd y esto nos permite habilitar la interfaz al inicio del sistema, para eso solo basta con tipear

sudo systemctl enable wg-quick@<tu interfaz>

y ya con eso se iniciara la interfaz al inicio del sistema

Prueba de velocidad

Lamentablemente no he podido realizar la prueba por mi mismo ya que hay un problema con OpenVPN que no he podido resolver pero he encontrado otras páginas que si realizaron pruebas y les dejo sus resultados como evidencia

https://www.redeszone.net/tutoriales/vpn/wireguard-vpn-configuracion/

https://www.wireguard.com/performance/

Finalmente comentar que si prueban esta solución y es de su agrado les podrían hacer una donación al proyecto tal como ya lo han hecho varias marcas (entre ellas nordvpn)

fuente:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *