Wireguard es una implementación de VPN multiplataforma de código abierto que utiliza criptografía de última generación. Es más rápido, más simple y más funcional que los protocolos IPSec y OpenVPN. Está diseñado como una VPN de propósito general para ejecutarse en interfaces integradas y supercomputadoras y se ejecuta en Linux, Windows, macOS, iOS, Android, BSD y varias otras plataformas.
Este tutorial cubrirá cómo instalar Wireguard VPN en un servidor basado en CentOS 8 y cómo conectarse usando un cliente Linux (CentOS/Fedora/Ubuntu).
Paso 1 - Actualizar sistema
Antes de continuar, es imperativo actualizar su sistema para instalar las últimas actualizaciones.
$ sudo dnf update
Paso 2:instalar y habilitar el repositorio EPEL
Los paquetes necesarios de Wireguard se pueden encontrar en el repositorio de EPEL, por lo que debemos instalarlos y habilitarlos.
$ sudo dnf install epel-release
$ sudo dnf config-manager --set-enabled PowerTools
También habilitamos el repositorio de PowerTools ya que los paquetes EPEL dependen de él.
Paso 3:instalar Wireguard
Habilite el repositorio de Wireguard.
$ sudo dnf copr enable jdoss/wireguard
Instale Wireguard.
$ sudo dnf install wireguard-dkms wireguard-tools
Este paso también instala el compilador GNU GCC necesario para compilar los módulos del kernel de Linux.
Paso 4:configurar el servidor Wireguard
Cree un archivo de configuración vacío en el servidor para la configuración de Wireguard con los permisos adecuados.
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
El comando táctil crea el archivo wg0-server.conf
archivo en el /etc/wireguard
directorio.
A continuación, cree un par de claves pública/privada para el servidor Wireguard.
$ cd /etc/wireguard
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
Esto crea una clave tanto pública como privada para Wireguard y las escribe en los archivos respectivos.
Ver la clave privada que acabamos de crear.
$ sudo cat privatekey
Anote la clave y cópiela porque la necesitaremos para configurar Wireguard.
A continuación, edite el archivo de configuración.
$ sudo nano /etc/wireguard/wg0.conf
Agrega el siguiente código.
[Interface]
## VPN server private IP address ##
Address = 192.168.10.1/24
## VPN server port - You can choose any port ##
ListenPort = 37822
## VPN server's private key i.e. /etc/wireguard/privatekey - the one from above ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true
Cada configuración tiene una sección llamada [Interface]
donde se define la parte del servidor.
Contiene la clave privada del servidor WireGuard local, el puerto UDP en el que debe escuchar las conexiones entrantes y sus propias direcciones IP de VPN.
También configuramos SaveConfig
a true
. Esto le indicará al servicio Wireguard que guarde automáticamente su configuración activa en este archivo al cerrar.
Presiona Ctrl + W para cerrar el archivo e ingrese Y cuando se le solicite guardar el archivo.
Paso 5:configurar el cortafuegos
Necesitamos abrir el puerto que elegimos para Wireguard.
Primero, necesitamos definir el servicio Wireguard para el firewall. Para ello, cree un archivo wireguard.xml
con el editor Nano.
$ sudo nano /etc/firewalld/services/wireguard.xml
Pegue el siguiente código en el archivo.
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>wireguard</short>
<description>WireGuard open UDP port 37822 for client connections</description>
<port protocol="udp" port="37822"/>
</service>
Presiona Ctrl + W para cerrar el archivo e ingrese Y cuando se le solicite guardar el archivo.
Luego, habilite el servicio Wireguard en el firewall.
$ sudo firewall-cmd --permanent --add-service=wireguard
Activa el enmascaramiento para que todo el tráfico que entra y salga de 192.168.10.0/24 enrutado a través de nuestra dirección IP pública del servidor 203.1.114.98/24 .
$ sudo firewall-cmd --permanent --add-masquerade
Finalmente, recarga el firewall para activar las reglas.
$ sudo firewall-cmd --reload
Enumere las reglas de firewall actuales para confirmar.
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: wireguard ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Paso 6:activar el reenvío de IPv4
Crear /etc/sysctl.d/99-custom.conf
archivo.
$ sudo nano /etc/sysctl.d/99-custom.conf
Pegue el siguiente código en el archivo.
## Turn on bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
## for IPv4 ##
net.ipv4.ip_forward = 1
## Turn on basic protection/security ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
## for IPv6 ##
net.ipv6.conf.all.forwarding = 1
Presiona Ctrl + W para cerrar el archivo e ingrese Y cuando se le solicite guardar el archivo.
El alcance del código en el archivo anterior está fuera del alcance de este tutorial, así que por ahora, utilícelo tal como está.
Vuelva a cargar los cambios.
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf
De forma predeterminada, el cortafuegos no permitirá que wg0
y eth0
Las interfaces hablan entre sí. Por lo tanto, debemos agregar la interfaz Wireguard a la red interna y activar el enmascaramiento.
$ sudo firewall-cmd --add-interface=wg0 --zone=internal
$ sudo firewall-cmd --permanent --zone=internal --add-masquerade
Paso 7:habilite e inicie el servicio Wireguard
A continuación, debemos habilitar e iniciar el servicio Wireguard.
$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]
Puede verificar si la interfaz Wireguard, wg0
está en funcionamiento con el siguiente comando.
$ sudo wg
interface: wg0
public key: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
private key: (hidden)
listening port: 37822
$ sudo ip a show wg0
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.10.1/24 scope global wg0
valid_lft forever preferred_lft forever
Paso 8:instalar y configurar el cliente WireGuard
Puede encontrar las instrucciones de instalación del cliente Wireguard para su distribución de Linux en su página de instalación oficial.
Una vez que instale el cliente, debe crear el archivo de configuración del cliente.
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
$ cd /etc/wireguard/
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
$ sudo cat privatekey
Tenga en cuenta la clave privada que obtiene al final. A continuación, debemos editar el archivo de configuración que acabamos de crear.
$ sudo nano /etc/wireguard/wg0.conf
Agregue las siguientes directivas al archivo.
[Interface]
## client private key ##
PrivateKey = OEM6D/zt2fVWOepVv3iEDD430V0gAshKp4+5oVVt5EE=
## client ip address ##
Address = 192.168.10.2/24
[Peer]
## CentOS 8 server public key ##
PublicKey = VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
## set ACL ##
AllowedIPs = 192.168.10.0/24
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = 203.1.114.98:37822
## Key connection alive ##
PersistentKeepalive = 15
Tenga en cuenta que le asignamos la IP privada 192.168.10.1 al servidor y 192.168.10.2 al cliente. También agregamos la clave privada del cliente al archivo.
El [Peer]
La sección es donde ingresa la configuración del servidor al que se conectará el cliente. Aquí hemos agregado la clave pública, la IP pública y un conjunto de IP permitidas que contiene la IP privada de nuestro servidor. PersistentKeepalive
le dice a WireGuard que envíe un paquete UDP cada 15 segundos, esto es útil si está detrás de un NAT y desea mantener viva la conexión.
Presiona Ctrl + W para cerrar el archivo e ingrese Y cuando se le solicite guardar el archivo.
Ahora es el momento de habilitar e iniciar el cliente VPN.
$ sudo systemctl enable [email protected]
$ sudo systemctl start [email protected]
$ sudo systemctl status [email protected]
Paso 9:configurar el servidor para agregar el cliente
Ahora, necesitamos agregar la configuración del cliente al servidor nuevamente para informarle sobre el cliente.
Primero detenga el servicio Wireguard.
$ sudo systemctl stop [email protected]
Abra el archivo wg0.conf para editarlo.
$ sudo nano /etc/wireguard/wg0.conf
Agregue el siguiente código al final del archivo.
[Peer]
## client VPN public key ##
PublicKey = dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
## client VPN IP address (note /32 subnet) ##
AllowedIPs = 192.168.10.2/32
Presiona Ctrl + W para cerrar el archivo e ingrese Y cuando se le solicite guardar el archivo.
El [Peer]
Las secciones definen los otros miembros de la red VPN. Puede agregar tantos como necesite.
Contienen su clave pública, que debe coincidir con la clave privada del par en su [Interface]
sección.
Tenga en cuenta que cualquier conexión entrante se autentica primero con una de las claves públicas. Si la conexión no es de un par verificado, los paquetes entrantes simplemente se ignoran en silencio. Dado que las conexiones de hosts que no poseen una clave privada coincidente no se responden en absoluto, una VPN WireGuard no solo proporciona comunicación cifrada, sino que también permanece oculta para los extraños.
Vuelva a iniciar el servicio Wireguard.
$ sudo systemctl start [email protected]
Paso 10 - Prueba
Verifiquemos si tanto el cliente como el servidor están conectados de forma segura mediante VPN. Para probar la conexión, ejecute los siguientes comandos en su cliente.
$ ping -c 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=44.2 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=45.8 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=46.7 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=44.1 ms
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2800ms
rtt min/avg/max/mdev = 41.729/47.829/48.953/5.046 ms
$ sudo wg
interface: wg0
public key: dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
private key: (hidden)
listening port:
peer: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
endpoint: 203.1.114.98:37822
allowed ips: 192.168.10.0/24
latest handshake: 1 minute, 40 seconds ago
transfer: 938 B received, 45.67 KiB sent
persistent: keepalive: every 15 seconds
Conclusión
Eso es todo lo que hay en este tutorial. Ahora debería tener un servidor VPN basado en Wireguard basado en un servidor CentOS 8. Si tiene alguna pregunta, hágala en los comentarios a continuación.