
Ha llegado el momento en que un VPN ya no es una herramienta exótica de administradores de sistemas con barbas. Las necesidades de los usuarios son diversas, pero el hecho es que un VPN se ha vuelto necesario para todos.
El problema con las soluciones VPN actuales es que son complicadas de configurar correctamente, costosas de mantener, y están llenas de código legado de calidad dudosa.
Hace unos años, el especialista canadiense en seguridad informática Jason A. Donenfeld decidió que había tenido suficiente y comenzó a trabajar en . Actualmente, WireGuard se está preparando para incluirse en el núcleo de Linux, incluso ha recibido elogios de y en .
Las ventajas declaradas de WireGuard sobre otras soluciones VPN son:
- Fácil de usar.
- Utiliza criptografía moderna: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF, etc.
- Código compacto y legible, más fácil de investigar en busca de vulnerabilidades.
- Alto rendimiento.
- Una especificación clara y bien elaborada. .
un script para la instalación automática de un servidor VPN personal. .
Se pueden describir aproximadamente así:
Se crea una interfaz de WireGuard, se le asigna una clave privada y una dirección IP. Se cargan las configuraciones de otros pares: sus claves públicas, direcciones IP, etc.
- Todos los paquetes IP que llegan a la interfaz de WireGuard se encapsulan en UDP y
- se envían de forma segura Los clientes especifican la dirección IP pública del servidor en su configuración. El servidor conoce automáticamente las direcciones externas de los clientes cuando recibe datos correctamente autenticados.
- El servidor puede cambiar la dirección IP pública sin interrumpir su funcionamiento. Al hacerlo, enviará una notificación a los clientes conectados y ellos actualizarán su configuración al vuelo.
- Se utiliza el concepto de enrutamiento
- Cryptokey Routing. allowed-ips.
allowed-ipsSi un par está autenticado, el paquete es aceptado por la interfaz WireGuard. Al enviar un paquete saliente, se lleva a cabo el procedimiento correspondiente: se toma el campo dst del paquete y se selecciona el par correspondiente. El paquete se firma con su clave, se cifra con la clave del par y se envía al endpoint remoto.
La lógica principal de WireGuard ocupa menos de 4,000 líneas de código, mientras que OpenVPN e IPSec tienen cientos de miles de líneas. Para apoyar los algoritmos criptográficos modernos, se propone incluir un nuevo API criptográfico en el núcleo de Linux. . En este momento se está discutiendo cuán buena es esta idea.
Rendimiento
La máxima ventaja de rendimiento (en comparación con OpenVPN e IPSec) se notará en sistemas Linux, ya que allí WireGuard se implementa como un módulo del núcleo. Además, se admiten macOS, Android, iOS, FreeBSD y OpenBSD, pero en estos casos WireGuard funciona en espacio de usuario, lo que afecta el rendimiento. Se promete agregar soporte para Windows en un futuro cercano.
Los resultados de los benchmarks con :

Mi experiencia usando
No soy un experto en configurar VPN. Una vez configuré OpenVPN manualmente y fue muy tedioso, y no intenté con IPSec. Se necesitan tomar muchas decisiones, y es muy fácil dispararse en el pie. Por lo tanto, siempre he utilizado scripts listos para la configuración del servidor.
Así que, desde mi punto de vista, WireGuard es realmente ideal para el usuario. Todas las decisiones de bajo nivel están incluidas en la especificación, por lo que el proceso de preparación de una infraestructura VPN típica toma apenas unos minutos. Es casi imposible cometer un error en la configuración.
El proceso de instalación en el sitio oficial, y quiero destacar especialmente el excelente .
Las claves de cifrado se generan con la utilidad wg:
SERVER_PRIVKEY=$( wg genkey )
SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
CLIENT_PRIVKEY=$( wg genkey )
CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )Luego, hay que crear la configuración del servidor /etc/wireguard/wg0.conf con el siguiente contenido:
[Interface]
Address = 10.9.0.1/24
PrivateKey = $SERVER_PRIVKEY
[Peer]
PublicKey = $CLIENT_PUBKEY
AllowedIPs = 10.9.0.2/32y levantar el túnel con el script wg-quick:
sudo wg-quick up /etc/wireguard/wg0.confEn sistemas con systemd, en su lugar se puede usar sudo systemctl start wg-quick@wg0.service.
En la máquina cliente, crear la configuración /etc/wireguard/wg0.conf:
[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.9.0.2/24
[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 1.2.3.4:51820 # IP externa del servidor
PersistentKeepalive = 25 Y así es como se levanta el túnel:
sudo wg-quick up /etc/wireguard/wg0.confSolo queda configurar NAT en el servidor para que los clientes puedan salir a Internet, ¡y estará todo listo!
Se logró esta sencillez de uso y la compacidad de la base de código al renunciar a la funcionalidad de distribución de claves. Aquí no hay un sistema complejo de certificados ni todo ese horror corporativo, las claves de cifrado cortas se distribuyen más o menos como claves SSH. Pero esto plantea un problema: WireGuard no será tan fácil de implementar en algunas redes existentes.
Entre las desventajas, cabe mencionar que WireGuard no funcionará a través de un proxy HTTP, ya que el único transporte es el protocolo UDP. Surge la pregunta, ¿será posible ofuscar el protocolo? Claro, esta no es una tarea directa para un VPN, pero para OpenVPN, por ejemplo, existen formas de disfrazarse como HTTPS, lo que ayuda a los habitantes de países totalitarios a acceder plenamente a Internet.
Conclusiones
En resumen, es un proyecto muy interesante y prometedor, ya se puede utilizar en servidores personales. ¿Cuál es la ventaja? Alto rendimiento en sistemas Linux, facilidad de configuración y mantenimiento, base de código compacta y legible. Sin embargo, aún es prematuro lanzarse a traducir una infraestructura compleja a WireGuard, es mejor esperar su inclusión en el núcleo de Linux.
Para ahorrar mi (y su) tiempo, he desarrollado un . Con él, puedes levantar un VPN personal para ti y tus conocidos sin necesidad de entender nada de esto.
Fuente: habr.com
