Noticia Configuración de un servidor VPN WireGuard en Android para acceso remoto

Configuración de un servidor VPN WireGuard en Android para acceso remoto


Montar tu propio servidor VPN con WireGuard y conectarte desde Android es una de las formas más sencillas de tener acceso remoto seguro a tu red doméstica o a tu VPS. Aunque a primera vista pueda intimidar ver comandos, claves y ficheros de configuración, en realidad el proceso es bastante mecánico si sigues los pasos con calma.

En esta guía vas a aprender a desplegar un servidor WireGuard en Linux (por ejemplo, en un VPS con Ubuntu) y a conectarte desde tu móvil Android para poder entrar a tu LAN, acceder a NAS, cámaras IP, routers o navegar como si estuvieras en casa. Además, se explican conceptos de fondo, trucos de seguridad, ejemplos de configuración y cómo aprovechar nombres de dominio locales para que el acceso remoto sea cómodo y transparente.

Qué es WireGuard y por qué usarlo para acceso remoto desde Android​


WireGuard es un protocolo VPN moderno que destaca por ser mucho más simple, rápido y seguro que alternativas clásicas como OpenVPN o IPsec. Su implementación es minimalista (unas pocas miles de líneas de código) y se apoya en criptografía de última generación como Curve25519, ChaCha20, Poly1305 o BLAKE2s.

Su filosofía se centra en que la configuración sea lo más clara posible: cada dispositivo tiene un par de claves pública/privada, se definen unas pocas opciones (IP interna, puerto, AllowedIPs…) y con eso basta para tener un túnel cifrado funcional. Nada de decenas de parámetros crípticos ni ficheros llenos de directivas difíciles de entender.

A nivel de rendimiento, WireGuard funciona solo sobre UDP e incluso puede integrarse en el kernel de Linux, lo que se traduce en baja latencia, velocidades altas y uso eficiente de recursos, algo que se nota especialmente cuando te conectas desde Android usando redes móviles o WiFi con calidad variable.

Otra ventaja potente es que WireGuard es multiplataforma y tiene apps oficiales para Android, iOS, Windows, macOS y Linux. Eso significa que puedes montar el servidor en un VPS o en tu router compatible y conectar desde el móvil simplemente importando un archivo .conf o escaneando un código QR.

Requisitos previos antes de montar el servidor WireGuard​


Antes de lanzarte a teclear comandos, conviene asegurarse de que tienes preparados los elementos básicos que necesita un servidor VPN WireGuard con acceso desde Android. Esto te ahorrará muchas vueltas y errores tontos por el camino.

Lo más habitual es utilizar un VPS o un servidor dedicado con Linux, donde instalarás el servicio. Ubuntu 22.04 es una de las opciones más cómodas, porque trae WireGuard en los repositorios oficiales y hay abundante documentación, pero cualquier distribución moderna sirve.

Necesitarás también un usuario con permisos de administración, ya sea root directo o un usuario con sudo, ya que vas a instalar paquetes, modificar configuración de red y activar reenvío de IPs. Es importante que tengas acceso SSH al servidor y sepas al menos conectarte desde tu ordenador.

Por último, necesitarás un cliente que se conecte a ese servidor: puede ser tu móvil Android con la app oficial de WireGuard, pero también otros sistemas (Windows, macOS, Linux, iOS). En este artículo nos centraremos especialmente en Android, aunque verás que el archivo de configuración es prácticamente el mismo para todos.

Preparación del servidor Linux: actualización e instalación de WireGuard​


Con el VPS o el servidor ya inicializado e instalado con Ubuntu 22.04 (u otra versión similar), el primer paso razonable es actualizar los paquetes del sistema para asegurarte de que todo está al día y no arrastras errores o vulnerabilidades conocidas.

Conéctate al servidor por SSH y ejecuta:

Código:
apt update
apt upgrade -y

El primer comando refresca la lista de paquetes en los repositorios, y el segundo actualiza los paquetes ya instalados a sus versiones más recientes de forma automática. Esto puede tardar un poco, sobre todo si el servidor es nuevo o llevaba tiempo sin actualizarse.

Una vez el sistema está al día, procede a instalar WireGuard desde los repositorios oficiales con:

apt install -y wireguard

Con esa orden se instalará el paquete principal, las utilidades como wg y wg-quick y, si hace falta, se cargará el módulo del kernel necesario. En algunos tutoriales verás también el uso explícito de:

modprobe wireguard

Este comando simplemente fuerza la carga manual del módulo de WireGuard en el kernel, algo que puede venir bien si por lo que sea el módulo no se ha cargado automáticamente o si estás en un entorno algo más peculiar.

Generación de claves y estructura básica de configuración en el servidor​


El corazón del sistema WireGuard es su gestión de claves, por eso el siguiente paso es crear el par de clave privada y pública del servidor. Toda la configuración se suele alojar en el directorio estándar /etc/wireguard/.

Entra en ese directorio con:

cd /etc/wireguard/

Para proteger las claves, conviene ajustar primero la máscara de permisos por defecto, de modo que los ficheros que se creen tengan permisos restrictivos y no sean legibles por otros usuarios del sistema. Eso se hace con:

umask 077

A continuación, genera el par de claves del servidor de forma sencilla:

Código:
wg genkey > privatekey
wg pubkey < privatekey > publickey

El archivo privatekey debe quedar a buen recaudo y nunca compartirse, mientras que la clave pública podrá distribuirse a los clientes que quieras autorizar. Para reforzar la seguridad, ajusta explícitamente los permisos de la clave privada:

chmod 600 privatekey

Si quieres ver el contenido de las claves por pantalla, puedes usar un simple tail:

tail privatekey publickey

Con eso tendrás a la vista las cadenas que luego tendrás que copiar en el fichero de configuración wg0.conf y en las configuraciones de los clientes, siempre respetando bien cuál es la pública y cuál la privada.

Creación y edición del fichero wg0.conf en el servidor​


Configuración de un servidor VPN WireGuard en Android para acceso remoto


WireGuard se organiza por interfaces virtuales, que por convención suelen llamarse wg0, wg1, etc.. Cada interfaz tiene su propio fichero de configuración en /etc/wireguard/. En nuestro caso, crearemos wg0.conf como interfaz principal.

Para editar el archivo puedes usar cualquier editor de texto en modo consola, pero en muchos tutoriales verás nano por su sencillez. Si no lo tienes instalado, puedes añadirlo con:

apt install -y nano

Una vez lo tengas, crea y abre el fichero de configuración del servidor:

nano /etc/wireguard/wg0.conf

Antes de escribir la configuración, conviene averiguar el nombre de la interfaz de red física por la que el servidor sale a Internet, ya que la vas a necesitar para la regla de NAT. Para ello usa:

ip a

En muchos VPS la interfaz se llama ens3, eth0, enp0s3 o similar, y será la que tenga asignada la IP pública o la IP interna por la que conectas vía SSH.

Un ejemplo completo de bloque en el servidor podría ser:

Código:
PrivateKey = <tu_clave_privada_servidor>
Address = 10.30.0.1/24
ListenPort = 51928
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o <nombre_interfaz_salida> -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o <nombre_interfaz_salida> -j MASQUERADE

En este ejemplo asignas al servidor la IP interna 10.30.0.1/24 dentro de la VPN, escuchas en el puerto UDP 51928 y añades reglas iptables para permitir el reenvío y aplicar NAT cuando la interfaz wg0 sube (PostUp) y eliminar esas reglas cuando se baja (PostDown).

Recuerda que en nano puedes guardar con Ctrl+O y salir con Ctrl+X. Una vez guardado, wg0.conf será la base sobre la que irás añadiendo los distintos peers (clientes) más adelante.

Activar el reenvío de IPs y el servicio WireGuard en el servidor​


Para que los clientes conectados por WireGuard puedan acceder a Internet o a otras redes detrás del servidor, es imprescindible habilitar el reenvío de paquetes IP a nivel de sistema. Esto se hace editando la configuración de sysctl.

En muchos casos basta con lanzar:

Código:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding=1" >> /etc/sysctl.conf
sysctl -p

Con esto activas el forward tanto para IPv4 como para IPv6 y recargas los parámetros del kernel con sysctl -p. Es importante no olvidarse de este paso, porque si el reenvío está desactivado, tendrás túnel pero no llegarás a la LAN ni a Internet desde los clientes.

Ahora puedes poner en marcha el servicio de WireGuard asociado a wg0 usando el comando wg-quick, que simplifica mucho la gestión de interfaces:

systemctl start wg-quick@wg0

Si quieres que la interfaz WireGuard se levante automáticamente en cada arranque del servidor, habilita el servicio con:

systemctl enable wg-quick@wg0

Para comprobar si está activo, puedes echar un vistazo al estado del servicio:

systemctl status wg-quick@wg0

El estado debería aparecer como active (running). Además, puedes usar el comando:

wg

para ver información en tiempo real sobre la interfaz, las claves, los peers configurados y el tráfico que se está intercambiando a través del túnel.

Añadir clientes al servidor: PC, móvil Android y otros dispositivos​


Una vez que la parte del servidor está en marcha, toca ir sumando clientes que se conectarán como peers. Por cada dispositivo que quieras conectar (PC, teléfono, tablet, router cliente, etc.) debes generar un nuevo par de claves y asignarle una dirección IP dentro de la red de la VPN.

Para simplificar, muchos administradores generan las claves de los clientes directamente en el servidor, aunque desde el punto de vista de seguridad lo ideal sería crearlas en el propio dispositivo cliente y trasladar solo la clave pública al servidor. La mecánica es la misma, así que veremos el caso sencillo generando las claves en /etc/wireguard/.

Por ejemplo, para un ordenador de sobremesa podrías hacer:

Código:
wg genkey > mypc_privatekey
wg pubkey < mypc_privatekey > mypc_publickey

Y para tu móvil Android:

Código:
wg genkey > myphone_privatekey
wg pubkey < myphone_privatekey > myphone_publickey

Con un simple:

ls

verás todos los ficheros de claves. Y con:

tail mypc_publickey myphone_publickey

podrás ver sus valores en pantalla. Esas claves públicas son las que vas a pegar en el fichero wg0.conf del servidor dentro de sendos bloques , otorgando a cada uno su IP de túnel.

Abre de nuevo wg0.conf:

nano wg0.conf

y añade las definiciones de los clientes, por ejemplo:

Código:
PublicKey = <clave_publica_mipc>
AllowedIPs = 10.30.0.2/32

PublicKey = <clave_publica_mitelefono>
AllowedIPs = 10.30.0.3/32

Con estas líneas estás indicando que el peer cuya clave pública coincide con mypc_publickey usará la IP 10.30.0.2 dentro de la VPN, y que el móvil Android usará la 10.30.0.3. AllowedIPs con /32 implica que se trata de una IP individual, algo habitual en configuraciones tipo road-warrior.

Guarda los cambios y reinicia el servicio para que el servidor lea la nueva configuración:

systemctl restart wg-quick@wg0

Siempre que modifiques wg0.conf en el servidor (por ejemplo, para meter o quitar peers) tendrás que recargar el servicio para que los cambios tengan efecto. Un nuevo systemctl status wg-quick@wg0 te confirmará que Todo sigue en verde.

Creación de ficheros de configuración para los clientes​


Ya con los peers dados de alta en el servidor, el siguiente paso es preparar los archivos .conf que usarán los clientes para conectarse. Estos ficheros contienen la clave privada del cliente, su IP de túnel, DNS y los datos del servidor (clave pública, IP y puerto).

Siguiendo el ejemplo, para el PC podrías crear un fichero mypc.conf en /etc/wireguard/:

nano mypc.conf

y escribir algo similar a:

Código:
PrivateKey = <clave_privada_mipc>
Address = 10.30.0.2/32
DNS = 8.8.8.8

PublicKey = <clave_publica_servidor>
Endpoint = <IP_publica_servidor>:51928
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

La sección describe el lado cliente: la clave privada del dispositivo, su dirección IP en la red WireGuard y el servidor DNS que usará cuando el túnel esté activo. En defines al servidor, indicando su clave pública, la IP o dominio por el que se llega a él y el puerto que configuraste antes (51928 en este ejemplo).

AllowedIPs = 0.0.0.0/0 hace que todo el tráfico del cliente se enrute por la VPN (típico cuando quieres ocultar tu IP real o salir siempre por la IP del servidor). Si solo quieres llegar a ciertas subredes remotas, podrías limitarlo, por ejemplo, a 10.30.0.0/24 o a 192.168.0.0/24, según la topología que uses.

El parámetro PersistentKeepalive mantiene un pequeño intercambio periódico de paquetes para que la conexión no se cierre cuando el cliente está detrás de NAT o firewalls que tiran conexiones inactivas. Un valor de 20-25 segundos suele funcionar bien para clientes móviles conectados por 4G/5G.

Configuración específica del cliente Android con WireGuard​


Para Android el planteamiento es exactamente el mismo que para el PC: el móvil necesita su propia clave privada, se le asigna su IP del túnel y se referencia la clave pública del servidor. Puedes generar las claves en el propio servidor (como hicimos antes) o directamente desde la app de Android.

Siguiendo el flujo anterior, ya tendrías myphone_privatekey y myphone_publickey creadas en /etc/wireguard/. Falta dar de alta la configuración de cliente que luego importarás en el móvil. Un ejemplo de fichero para Android podría ser:

nano myphone.conf

y dentro:

Código:
PrivateKey = <clave_privada_mitelefono>
Address = 10.30.0.3/32
DNS = 8.8.8.8

PublicKey = <clave_publica_servidor>
Endpoint = <IP_publica_servidor>:51928
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Ese archivo contiene todo lo necesario para que la app oficial de WireGuard en Android pueda crear el túnel y negociar el handshake con el servidor. La parte delicada aquí es hacer llegar este archivo de forma segura al teléfono, evitando, en la medida de lo posible, dejar rastros inseguros por el camino.

En un entorno de laboratorio se podría montar un servidor web (por ejemplo Apache), copiar myphone.conf al document root y descargarlo desde el navegador de Android. Sin embargo, en un escenario real, es más recomendable usar métodos como USB, herramientas de sincronización cifrada o, mejor aún, un código QR generado desde el propio servidor.

Para eso, puedes instalar la utilidad qrencode en el servidor:

apt install -y qrencode

y desde el directorio de configuración ejecutar:

qrencode -t ansiutf8 -r myphone.conf

Ese comando mostrará en la terminal un código QR en caracteres, que puedes escanear directamente desde la app WireGuard en Android usando la opción de añadir nuevo túnel mediante “Scan from QR code”. De este modo, no necesitas enviar el archivo por correo ni subirlo a servicios externos.

Configuración de accesos remotos a LAN, DNS y nombres de dominio locales​


Además de crear el túnel básico, muchas veces lo que quieres es poder entrar desde tu móvil Android a dispositivos de la LAN del servidor, como un NAS, una cámara IP, un router o un servidor interno, usando sus nombres de dominio locales en lugar de memorizar direcciones IP.

En algunos routers que actúan como servidor WireGuard (por ejemplo, ciertas marcas que integran servidor VPN en su firmware) existe un apartado para gestionar esos nombres locales. Dentro del panel web de administración sueles encontrar opciones como NETWORK → DNS → Edit Hosts, desde las cuales puedes definir pares IP/nombre (por ejemplo, 192.168.1.50 nas-casa.local).

Si el router no resuelve correctamente los dominios locales de forma automática, puedes añadir manualmente las entradas de los dispositivos que quieras tener accesibles desde la VPN y aplicar los cambios. Con eso logras que tanto el propio router como los clientes que usen su DNS resuelvan correctamente esos nombres internos.

En servidores WireGuard embebidos en routers con diferentes versiones de firmware también suele haber ajustes específicos para permitir el acceso remoto a la LAN. Por ejemplo, algunas interfaces ofrecen opciones llamadas “Allow Remote Access the LAN Subnet” o “Remote Access LAN” que debes activar desde la sección de configuración del servidor WireGuard.

Al habilitar esa opción, el router y los dispositivos de la red local pasan a ser accesibles a través del túnel, de modo que puedes llegar desde la red del cliente (por ejemplo, la LAN de tu casa secundaria o la red móvil del Android) a los servicios internos del router servidor y a los equipos de la LAN principal.

En muchos casos esos routers permiten exportar el perfil de configuración WireGuard para que lo uses en clientes externos. Desde su pestaña de “WireGuard Server” sueles poder generar un archivo .conf que ya incluye la IP de túnel, el DNS correcto (apuntando a la IP de la interfaz de túnel del servidor) y todos los parámetros necesarios para conectar desde otro router cliente o desde la app móvil.

Verificación, solución de problemas y seguridad en WireGuard​


Una vez has levantado el túnel y has importado la configuración en Android, el primer check es comprobar que el handshake se realiza correctamente. La app de WireGuard en el móvil mostrará el estado del túnel y las últimas marcas de tiempo de handshake.

En el servidor, ejecutar el comando:

wg

te mostrará por cada peer la clave pública, la IP de endpoint desde la que se está conectando, la última vez que se realizó handshake y los bytes transferidos. Si ves que la última actividad está vacía o muy antigua, es probable que el cliente no esté conectando o que haya un problema de firewall o redirección de puertos.

Si no hay conexión, revisa que el puerto UDP configurado (por ejemplo, 51928 o 51820) esté correctamente abierto en el firewall del servidor y en cualquier router intermedio. Recuerda que si tu servidor está detrás de un router doméstico, tendrás que hacer port forwarding del puerto UDP de WireGuard hacia la IP interna del servidor.

Si el túnel se levanta pero no tienes acceso a Internet desde el cliente, revisa que el reenvío de paquetes (net.ipv4.ip_forward y net.ipv6.conf.all.forwarding) esté activo y que la regla de NAT en iptables se haya aplicado correctamente sobre la interfaz de salida correcta (eth0, ens3, etc.).

Los problemas de DNS suelen manifestarse en que sí puedes hacer ping a IPs concretas pero no resolver nombres de dominio. En ese caso verifica que en el archivo de configuración del cliente (Android, PC, router cliente) el campo DNS apunte al servidor correcto: puede ser un DNS público (8.8.8.8, 1.1.1.1) o bien la IP del túnel del servidor si quieres que éste haga también de resolutor.

En cuanto a seguridad, más allá de la solidez criptográfica del protocolo, es fundamental:

  • Proteger las claves privadas y no compartirlas nunca.
  • Restringir al máximo las AllowedIPs de cada peer para que solo tenga acceso a lo estrictamente necesario.
  • Usar puertos UDP no estándar para reducir ruido de escáneres automáticos.
  • Mantener actualizado el sistema y, por supuesto, el propio WireGuard.
  • Aplicar reglas de firewall adicionales para limitar quién puede llegar al puerto de WireGuard en tu servidor.

Todo este conjunto de medidas hace que tu VPN con WireGuard sea no solo rápida y funcional, sino también robusta frente a ataques comunes que explotan malas configuraciones o descuidos en la gestión de claves.

Con todos estos pasos tendrás un servidor WireGuard bien montado, con acceso remoto desde Android y otros sistemas, con tráfico cifrado, posible navegación completa a través del túnel y capacidad de entrar a tus dispositivos de casa o de la oficina usando nombres de dominio internos; en definitiva, una forma bastante elegante de llevar tu red contigo allá donde vayas sin romperte la cabeza.

Continúar leyendo...