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:
- Instalación Server/Cliente
- Configuración llaves
- Conexión entre pares
- instalación en Android
- Iniciar interfaz con el sistema
- Prueba de velocidad
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
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: