Saltar a contenido

VPN

En esta práctica contaremos con varios escenarios con los que trabajaremos para implementar las VPN requeridas en cada ejercicio.


A) VPN de acceso remoto con OpenVPN y certificados x509 (5 puntos)

Configura una conexión VPN de acceso remoto entre dos equipos del cloud:

• Uno de los dos equipos (el que actuará como servidor) estará conectado a dos redes
• Para la autenticación de los extremos se usarán obligatoriamente certificados digitales, que se generarán utilizando openssl y se almacenarán en el directorio /etc/openvpn, junto con los parámetros Diffie-Helman y el certificado de la propia Autoridad de Certificación.
• Se utilizarán direcciones de la red 10.99.99.0/24 para las direcciones virtuales de la VPN. La dirección 10.99.99.1 se asignará al servidor VPN.
• Los ficheros de configuración del servidor y del cliente se crearán en el directorio /etc/openvpn de cada máquina, y se llamarán servidor.conf y cliente.conf respectivamente.
• Tras el establecimiento de la VPN, la máquina cliente debe ser capaz de acceder a una máquina que esté en la otra red a la que está conectado el servidor.

B) VPN sitio a sitio con OpenVPN y certificados x509 (5 puntos)

Configura una conexión VPN sitio a sitio entre dos equipos del cloud:

• Cada equipo estará conectado a dos redes, una de ellas en común
• Para la autenticación de los extremos se usarán obligatoriamente certificados digitales, que se generarán utilizando openssl y se almacenarán en el directorio /etc/openvpn, junto con con los parámetros Diffie-Helman y el certificado de la propia Autoridad de Certificación.
• Se utilizarán direcciones de la red 10.99.99.0/24 para las direcciones virtuales de la VPN.
• Tras el establecimiento de la VPN, una máquina de cada red detrás de cada servidor VPN debe ser capaz de acceder a una máquina del otro extremo.

C) VPN de acceso remoto con WireGuard (5 puntos)

Monta una VPN de acceso remoto usando Wireguard. Intenta probarla con clientes Windows, Linux y Android. Documenta el proceso adecuadamente y compáralo con el del apartado A.

D) VPN sitio a sitio con WireGuard (5 puntos)

Configura una VPN sitio a sitio usando WireGuard. Documenta el proceso adecuadamente y compáralo con el del apartado B.

Extra 1) VPN de acceso remoto con Ipsec (5 puntos)

Elige una aplicación por software (por ejemplo, StrongSwan o ProtonVPN) y monta la configuración. Documenta el proceso detalladamente.

Extra 2) VPN sitio a sitio con IPsec (10 puntos)

Montando el escenario en GNS3 usando routers CISCO despliega la configuración solicitada sobre los routers. Documenta el proceso detalladamente.

A) VPN de acceso remoto con OpenVPN y certificados x509

• Uno de los dos equipos (el que actuará como servidor) estará conectado a dos redes
• Para la autenticación de los extremos se usarán obligatoriamente certificados digitales, que se generarán utilizando openssl y se almacenarán en el directorio /etc/openvpn, junto con los parámetros Diffie-Helman y el certificado de la propia Autoridad de Certificación.
• Se utilizarán direcciones de la red 10.99.99.0/24 para las direcciones virtuales de la VPN. La dirección 10.99.99.1 se asignará al servidor VPN.
• Los ficheros de configuración del servidor y del cliente se crearán en el directorio /etc/openvpn de cada máquina, y se llamarán servidor.conf y cliente.conf respectivamente.
• Tras el establecimiento de la VPN, la máquina cliente debe ser capaz de acceder a una máquina que esté en la otra red a la que está conectado el servidor.

Para la realización de este ejercicio, estaré usando un escenario en Vagrant con la siguiente disposición:

Vagrant.configure("2") do |config|
    config.vm.provider :libvirt do |libvirt|
        libvirt.memory = 1024
    end
    config.vm.define :nodo1 do |nodo1|
      nodo1.vm.box = "debian/bookworm64" 
      nodo1.vm.hostname = "servidor-vpn" 
      nodo1.vm.synced_folder ".", "/vagrant", disabled: true
      nodo1.vm.network :private_network,
       :libvirt__network_name => "vpn1",
       :libvirt__dhcp_enabled => false,
       :ip => "192.168.100.1",
       :mode => "veryisolated" 
      nodo1.vm.network :private_network,
        :libvirt__network_name => "vpn2",
        :libvirt__dhcp_enabled => false,
        :ip => "192.168.200.1",
        :libvirt__forward_mode => "veryisolated" 
     end
    config.vm.define :nodo2 do |nodo2|
      nodo2.vm.synced_folder ".", "/vagrant", disabled: true
      nodo2.vm.box = "debian/bookworm64" 
      nodo2.vm.hostname = "cliente1" 
      nodo2.vm.network :private_network,
        :libvirt__network_name => "vpn1",
        :libvirt__dhcp_enabled => false,
        :ip => "192.168.100.2",
        :libvirt__forward_mode => "veryisolated" 
     end
     config.vm.define :nodo3 do |nodo3|
      nodo3.vm.synced_folder ".", "/vagrant", disabled: true
      nodo3.vm.box = "debian/bookworm64" 
      nodo3.vm.hostname = "cliente2" 
      nodo3.vm.network :private_network,
        :libvirt__network_name => "vpn2",
        :libvirt__dhcp_enabled => false,
        :ip => "192.168.200.2",
        :libvirt__forward_mode => "veryisolated" 
     end

  end

Tenemos el servidor vpn el cual tiene 2 interfaces, cada una de ellas se encuentra en una red diferente.
Por otra parte tenemos 2 clientes (cliente 1 y cliente 2), cada cliente esta conectado a una de las redes mencionadas anteriormente.

Empezaremos configurando el SERVIDOR.

Lo primero que haremos aqui será instalar openvpn:

sudo apt install openvpn

Además de esto hay que habilitar el bit de forwarding, para ello editamos el fichero /etc/sysctl.conf.

net.ipv4.ip_forward=1

Ahora vamos a copiar la configuración del fichero easy-rsa a /etc/openvpn. Haciendo esto evitamos que futuras actualizaciones del paquete sobreescriban los cambios que tenemos:

cp -r /usr/share/easy-rsa /etc/openvpn

A partir de ahora /etc/openvpn/easy-rsa, será el directorio en el que trabajaremos.

EasyRSA es una CLI que facilita la configuración y gestión de una infraestructura de clave pública para OpenVPN. También nos permite generar módulos Diffie-Hellman, necesarios para ejecutar un servidor OpenVPN.

Ya que nos encontramos en este directorio seguiremos con el proceso. Lo siguiente será inicializar el directorio init-pki.

ficheros

Posteriormente vamos a generar el certificado de la CA y la clave privada, con esta firmaremos los certificados de los cliente y del servidor.

ficheros

Durante el proceso de generación nos pedira unas frases de paso. Como podemos ver en la salida del comando, se ha generado el certificado, el cual se encuentra en /etc/openvpn/easy-rsa/pki/ca.crt. También se ha generado la clave privada en /etc/openvpn/easy-rsa/pki/private/ca.key.

Vamos a pasar ahora a generar los parámetros Diffie-Hellman, los cuales serán utilizados por OpenVPN al establecer el primer contacto entre los nodos de la VPN.

El intercambio de claves Diffie-Hellman (DH) es un protocolo criptográfico que permite a dos partes acordar de manera segura una clave de cifrado común sobre un canal de comunicación no seguro.

Este proceso de generación puede demorar varios minutos:

./easyrsa gen-dh

El fichero ha sido guardado en /etc/openvpn/easy-rsa/pki/dh.pem Ahora vamos a generar el certificado y la clave privada del servidor OpenVPN

./easyrsa build-server-full server nopass

El certificado se ha generado en /etc/openvpn/easy-rsa/pki/issued/server.crt y la clave privada en /etc/openvpn/easy-rsa/pki/private/server.key.

De la misma forma que hemos hecho con el servidor, vamos a generar el certificado y la clave privada del cliente de la VPN. Esto lo haremos desde el servidor empleando el siguiente comando:

./easyrsa build-client-full cliente1 nopass

ficheros

Como vemos, tambien se ha generado otro fichero. Para que la conexión a través de la VPN funcione, debemos pasar algunos de estos ficheros que hemos generado a nuestro cliente. Para una mayor organización voy a mover todos los ficheros a un directorio (cliente1) de mi servidor, para posteriormente pasarlos al cliente a través de scp

ficheros

Para traspasar este directorio a nuestro cliente ejecutamos el siguiente comando:

scp -r /home/vagrant/Clientevpn1/ vagrant@192.168.100.11

Vamos a seguir configurando el tunel en el servidor, el siguiente paso es crear el fichero de configuración del tunel.

sudo nano /etc/openvpn/server/servidor.conf 

Con el siguiente contenido:

port 1194
proto udp
dev tun

ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem

topology subnet

# El rango de ip de la interfaz que se creará (El servidor coge por defecto la primera dirección: 10.99.99.1)
server 10.99.99.0 255.255.255.0

ifconfig-pool-persist /var/log/openvpn/ipp.txt

# Aquí especificamos la ruta que se usará para acceder al cliente 2
push "route 192.168.200.0 255.255.255.0" 

keepalive 10 120
cipher AES-256-CBC
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1

Una vez creado el fichero podemos iniciar el servicio:

ficheros

Vamos a pasar ahora a configurar el CLIENTE1:

Instalamos openvpn:

sudo apt install openvpn

Y moveremos los fichero que hemos obtenido antes:

mv Clientevpn1/* /etc/openvpn/client/

Aquí también hay que crear un fichero de configuración para la VPN:

nano /etc/openvpn/client/cliente.conf

El contenido es el siguiente:

client
dev tun
proto udp

remote 192.168.100.10 1194
resolv-retry infinite
nobind
persist-key
persist-tun

ca /etc/openvpn/client/ca.crt
cert /etc/openvpn/client/cliente1.crt
key /etc/openvpn/client/cliente1.key

remote-cert-tls server
cipher AES-256-CBC
verb 3

Una vez terminada la configuración del fichero, podemos iniciar el servicio.

ficheros

Llegados a este punto, podemos comprobar que tanto en el cliente como en el servidor tenemos una nueva interfaz tun0:

SERVIDOR:

ficheros

CLIENTE:

ficheros

Lo unico que tendremos que hacer en el cliente interno (cliente2), será modificar la ruta por defecto y configurarlo para que use el servidor:

sudo ip route del default
sudo ip route add default via 192.168.200.10

Pruebas de funcionamiento

Ping desde cliente1 a cliente2:

ficheros

Como podemos comprobar, el cliente1 hace ping al cliente2, además con traceroute podemos ver que el cliente hace un salto a través del tunel para llegar a su destino.


B) VPN sitio a sitio con OpenVPN y certificados x509

• Cada equipo estará conectado a dos redes, una de ellas en común
• Para la autenticación de los extremos se usarán obligatoriamente certificados digitales, que se generarán utilizando openssl y se almacenarán en el directorio /etc/openvpn, junto con con los parámetros Diffie-Helman y el certificado de la propia Autoridad de Certificación.
• Se utilizarán direcciones de la red 10.99.99.0/24 para las direcciones virtuales de la VPN.
• Tras el establecimiento de la VPN, una máquina de cada red detrás de cada servidor VPN debe ser capaz de acceder a una máquina del otro extremo.

En esta ocasión, tal y como hicimos anteriormente vamos a estar usando un escenario Vagrant.

Vagrant.configure("2") do |config|
    config.vm.provider :libvirt do |libvirt|
        libvirt.memory = 1024
    end
    config.vm.define :servidor1 do |servidor1|
      servidor1.vm.box = "debian/bullseye64" 
      servidor1.vm.hostname = "servidor1" 
      servidor1.vm.synced_folder ".", "/vagrant", disabled: true
      servidor1.vm.network :private_network,
        :libvirt__network_name => "privadavpn",
        :libvirt__dhcp_enabled => false,
        :ip => "172.30.0.10",
        :netmask => "255.255.255.0",
        :libvirt__forward_mode => "veryisolated" 
    end
    config.vm.define :cliente1 do |cliente1|
      cliente1.vm.synced_folder ".", "/vagrant", disabled: true
      cliente1.vm.box = "debian/bullseye64" 
      cliente1.vm.hostname = "cliente1" 
      cliente1.vm.network :private_network,
        :libvirt__network_name => "privadavpn",
        :libvirt__dhcp_enabled => false,
        :ip => "172.30.0.11",
        :netmask => "255.255.255.0",
        :libvirt__forward_mode => "veryisolated" 
     end
     config.vm.define :servidor2 do |servidor2|
        servidor2.vm.box = "debian/bullseye64" 
        servidor2.vm.hostname = "servidor2" 
        servidor2.vm.synced_folder ".", "/vagrant", disabled: true
        servidor2.vm.network :private_network,
          :libvirt__network_name => "privadvpn2",
          :libvirt__dhcp_enabled => false,
          :ip => "172.20.0.10",
          :netmask => "255.255.255.0",
          :libvirt__forward_mode => "veryisolated" 
      end
      config.vm.define :cliente2 do |cliente2|
        cliente2.vm.synced_folder ".", "/vagrant", disabled: true
        cliente2.vm.box = "debian/bullseye64" 
        cliente2.vm.hostname = "cliente2" 
        cliente2.vm.network :private_network,
          :libvirt__network_name => "privadvpn2",
          :libvirt__dhcp_enabled => false,
          :ip => "172.20.0.11",
          :netmask => "255.255.255.0",
          :libvirt__forward_mode => "veryisolated" 
       end
end

El escenario se divide en 2 partes:

  • Parte 1: Tenemos la red privadavpn1 con direccionamiento 172.30.0.0. Esta red es de tipo interna y habrá dos máquinas conectadas a ella, una máquina Servidor1 la cual puede salir a internet y es accesible por el Servidor2 y una máquina Cliente, la cual solo tiene acceso a la máquina Servidor.

  • Parte 2: Por otra parte, aquí tenemos la red privadavpn2 con direccionamiento 172.20.0.0. En esta red encontraremos la máquina Servidor2 y la máquina Cliente2, la cual solo puede acceder a Servidor2.

Configuración de los servidores (servidor1)

En primer lugar instalaremos openvpn, posteriormente vamos a copiar un fichero (vars), el cual contiene las variables que se configurarán durante la instalación de la CA.

sudo apt install openvpn
cp /usr/share/easy-rsa/vars.example /usr/share/easy-rsa/vars

En mi caso he rellenado el fichero con las siguientes variables:

set_var EASYRSA_REQ_COUNTRY     "ES"
set_var EASYRSA_REQ_PROVINCE    "Sevilla"
set_var EASYRSA_REQ_CITY        "Dos Hermanas"
set_var EASYRSA_REQ_ORG         "fabio Corp"
set_var EASYRSA_REQ_EMAIL       "fabiiogonzalez8@gmail.com"
set_var EASYRSA_REQ_OU          "Ejercicio B VPN"

Lo siguiente es generar el directorio pki, podemos generarlo como hicimos anteriormente en /usr/share/easy-rsa.

ficheros

Posteriormente, genereraremos la clave "Diffie-Hellman" empleando este comando:

./easyrsa gen-dh

Recordemos que el proceso puede tardar un rato.

Note: using Easy-RSA configuration from: /usr/share/easy-rsa/vars Using SSL: openssl OpenSSL 1.1.1w 11 Sep 2023 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time
........
DH parameters of size 2048 created at /usr/share/easy-rsa/pki/dh.pem

Una vez finalizada la tarea, vamos a pasar a generar la Autoridad Certificadora:

./easyrsa build-ca

ficheros

Continuaremos creando y firmando el certificado que usará la máquina servidor.

• Creamos:

./easyrsa gen-req server

• Firmamos:

./easyrsa sign-req server server

Para la firma tendremos que especificar la frase de paso que configuramos en el proceso anterior.

Ya que tenemos creado y firmado el certificado del servidor1, vamos a continuar creando y firmando el certificado que usará el servidor2, el cual pertenece a otra red y debe acceder a la VPN.

• Creamos:

./easyrsa gen-req server2

ficheros

• Firmamos:

./easyrsa sign-req client server2

ficheros

El siguiente paso es copiar varios de los ficheros generados a /etc/openvpn/server, recordemos que estos ficheros se encuentran en /usr/share/easy-rsa/pki.

ficheros

Además, debemos traspasar varios ficheros a la máquina Servidor2, ya que estos son requeridos para que la conexión a la VPN sea exitosa.

Los ficheros que tendremos que pasar al servidor2 son ca.crt, server2.crt y server2.key. Para ello he creado un directorio en el que tendremos estos 3 ficheros organizados y podremos pasarlos facilmente con scp.

ficheros

NOTA: He cambiado el propietario de los ficheros a vagrant para poder trasladarlos con scp, posteriormente volveré a cambiar el propitario a root en servidor2.

Seguiremos creando el fichero de configuración para el servidor VPN.

sudo nano /etc/openvpn/server/servidor.conf

Con el siguiente contenido:

dev tun
ifconfig 10.99.99.1 10.99.99.2
route 172.20.0.0 255.255.255.0
tls-server
ca ca.crt
cert server.crt
key server.key
dh dh.pem
comp-lzo
keepalive 10 120
log /var/log/openvpn/server.log
verb 3
askpass clave.txt

NOTA: Como podemos comprobar, he especificado un fichero clave.txt, este fichero es necesario crearlo en /etc/openvpn/server y contiene la clave de paso en claro. Esto lo hacemos ya que si no creamos este fichero, se solicitará la frase de paso en cada reinicio de openvpn.service

Una vez creado el fichero, podemos iniciar el servicio y comprobar que funciona:

ficheros

Por último, activaremos el bit de forwarding.

vagrant@servidor1:~$ sudo sysctl -p
net.ipv4.ip_forward = 1

Configuración de los servidores (servidor2)

Instalamos Openvpn y copiamos los ficheros que pasamos antes de servidor1.

sudo apt install openvpn
mv ca.crt /etc/openvpn/client/
mv server2.crt /etc/openvpn/client/
mv server2.key /etc/openvpn/client/

Es importante que estos ficheros tengan al usuario root como propietario.

Lo siguiente será crear el fichero de configuración de la VPN, en este caso se llamará cliente.conf y lo crearemos en /etc/openvpn/client con el siguiente contenido.

dev tun
remote 192.168.121.94
ifconfig 10.99.99.2 10.99.99.1
route 172.30.0.0 255.255.255.0
tls-client
ca ca.crt
cert server2.crt
key server2.key
comp-lzo
keepalive 10 60
verb 3
askpass clave2.txt

El fichero clave2.txt hay que ubicarlo en /etc/openvpn/client.

Hecho esto, podemos reiniciar el servicio y comprobar que funciona:

ficheros

Por último también será necesario activar el bit de forwarding:

vagrant@servidor2:~$ sudo sysctl -p
net.ipv4.ip_forward = 1

Configuración de los clientes

La única configuración que tendremos que hacer en los clientes, será cambiar la ruta por defecto en ambos, para que estos tengan como puerta de enlace la interfaz correspondiente de los servidores.

sudo ip r del defualt
sudo ip r add default via X.X.X.X
  • Cliente 1:

ficheros

  • Cliente 2:

ficheros

Pruebas de funcionamiento

  • Ping y traceroute de cliente1 a cliente2.

ficheros

  • Ping y traceroute de cliente2 a cliente1.

ficheros

  • Rutas del servidor1

ficheros

  • Rutas del servidor2

ficheros


C) VPN de acceso remoto con WireGuard

Monta una VPN de acceso remoto usando Wireguard. Intenta probarla con clientes Windows, Linux y Android. Documenta el proceso adecuadamente y compáralo con el del apartado A.

Para este ejercicio comenzaré creando las máquinas servidor, cliente1 y cliente2. Servidor tendrá dos redes y los clientes solo tendrán una red. Servidor y cliente 1 tienen conexion mediante la red por defecto de Vagrant, mientras que cliente2 tiene conexión con el servidor mediante una red muy aislada con IP 192.168.200.0/24. Para el escenario estaré reutilizando el Vagrantfile del ejercicio A.

Vagrant.configure("2") do |config|
  config.vm.provider :libvirt do |libvirt|
      libvirt.memory = 1024
  end
  config.vm.define :maquina1 do |maquina1|
    maquina1.vm.box = "debian/bookworm64" 
    maquina1.vm.hostname = "servidor" 
    maquina1.vm.synced_folder ".", "/vagrant", disabled: true
    maquina1.vm.network :private_network,
      :libvirt__network_name => "vpn2c",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.200.10",
      :libvirt__forward_mode => "veryisolated" 
   end
  config.vm.define :maquina2 do |maquina2|
    maquina2.vm.synced_folder ".", "/vagrant", disabled: true
    maquina2.vm.box = "debian/bookworm64" 
    maquina2.vm.hostname = "cliente1" 
   end
   config.vm.define :maquina3 do |maquina3|
    maquina3.vm.synced_folder ".", "/vagrant", disabled: true
    maquina3.vm.box = "debian/bookworm64" 
    maquina3.vm.hostname = "cliente2" 
    maquina3.vm.network :private_network,
      :libvirt__network_name => "vpn2c",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.200.11",
      :libvirt__forward_mode => "veryisolated" 
   end

end

En este caso empezaré con estas 3 máquinas, posteriormente añadiré a la red una máquina Windows para hacer el tunel y por último añadiré un Android al escenario.

Configuración entre máquinas debian

Cliente (al que accedemos)

En el cliente de nuestro escenario, simplemente tendremos que cambiar la ruta por defecto para que use la interfaz del servidor.

ficheros

Servidor

En el servidor, tendremos que instalar wireguard y activar el bit de forwarding.

sudo apt install wireguard

root@servidor:/etc/wireguard# sysctl -p
net.ipv4.ip_forward = 1

Posteriormente, vamos a acceder al directorio /etc/wireguard y generaremos un par de claves.

wg genkey | tee serverprivatekey | wg pubkey > serverpublickey
  • wg genkey: Genera una clave privada aleatoria para WireGuard.

  • tee serverprivatekey: Guarda la clave privada generada en un archivo llamado "serverprivatekey". La utilidad tee se utiliza para escribir la salida tanto en la pantalla como en el archivo especificado.

  • wg pubkey: Toma la clave privada generada y calcula su clave pública correspondiente.

  • serverpublickey: Guarda la clave pública resultante en un archivo llamado "serverpublickey".

A continuación crearemos el fichero de configuración (wg0.conf) con el siguiente contenido:

# Server config
[Interface]
Address = 10.99.99.1
PrivateKey = mBbRPbMiP7HQEe1jZv+m4D9XIBqoIFUR0Qj00CEoSVI=
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

En private key debemos poner la clave privada generada por wireguard, esto podemos obtenerlo haciendo un cat.

Lo siguiente es iniciar el servicio y comprobar que se ha iniciado exitosamente:

wg-quick up wg0

Cliente (con el que accedemos)

Al igual que con el servidor, tendremos que instalar wireguard y crear un par de claves.

wg genkey | tee clientprivatekey | wg pubkey > clientpublickey

En este caso no será necesario activar el bit de forwarding, pero si necesitaremos un fichero de configuración el cual contendrá la siguiente información:

[Interface]
Address = 10.99.99.2
PrivateKey = gECd0zNqDyK8ZbFSvXpzLqX9ZEuFOlUt6yGQuRrLbEc=
ListenPort = 51820
PostUp = ip route add 192.168.200.0/24 dev wg0
PostDown = ip route del 192.168.200.0/24 dev wg0

[Peer]
PublicKey = aKkmEqELooQCyyZxrY9s2iJYnJMVjhGyV2jPA619LHc=
AllowedIPs = 0.0.0.0/0
Endpoint = 192.168.121.193:51820

Tendremos que especificar la clave pública del servidor. A su misma vez, también será necesario configurar un nuevo bloque en el servidor que haga referencia a esta máquina, que será la que accede al cliente aislado.

# Server config
[Interface]
Address = 10.99.99.1
PrivateKey = mBbRPbMiP7HQEe1jZv+m4D9XIBqoIFUR0Qj00CEoSVI=
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
Publickey = nUpkMarHEWEZm5nugtWAVLB+a2/KgHM9ozFS7UF/3UE=
AllowedIPs = 10.99.99.2/32
PersistentKeepalive = 25

Será necesario reiniciar el servicio en ambas máquinas.

wg-quick down wg0
wg-quick up wg0

Una vez realizada esta configuración, podremos ver que en ambas máquinas tenemos una nueva interfaz wg0.

ficheros

Prueba de funcionamiento

  • Ping y traceroute de cliente1 a cliente2

ficheros

Configuración añadiendo una máquina Windows

Ahora añadiré al escenario una máquina Windows, esta máquina está en la misma red que el servidor, por lo tanto tiene conexión con el y no tiene conexión con la máquina remota.

Máquina Windows

Para instalar Wireguard en Windows podemos hacerlo a través de su página principal.

Una vez lo hayamos instalado, nos encontraremos con una interfaz gráfica en la que definiremos un nuevo túnel.

ficheros

Servidor

En el servidor, hay que añadir otro bloque que haga referencia a esta nueva máquina.

# Server config
[Interface]
Address = 10.99.99.1
PrivateKey = mBbRPbMiP7HQEe1jZv+m4D9XIBqoIFUR0Qj00CEoSVI=
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
Publickey = nUpkMarHEWEZm5nugtWAVLB+a2/KgHM9ozFS7UF/3UE=
AllowedIPs = 10.99.99.2/32
PersistentKeepalive = 25

[Peer]
Publickey = qIWl3rd0iPQaWqUgTZBpiO7XaO6K0Ye5c3z4zLMgD1Q=
AllowedIPs = 10.99.99.3/32
PersistentKeepalive = 25

Finalmente, podemos reiniciar el servicio en ambas máquinas y ver que tenemos la interfaz wg0 en Windows, comprobaremos que el túnel se encuentra activo.

  • Servidor.

ficheros

  • Maquina Windows

ficheros

Prueba de funcionamiento

  • Ping y tracert desde máquina Windows a cliente2.

ficheros

Android

La configuración de un cliente Android es simple, ya que podemos intalar Wireguard desde la tienda de aplicaciones y la configuración es similar a lo que vimos anteriormente en Windows.

Simplemente hay que crear un nuevo tunel en nuestro dispositivo, especificando la clave pública del servidor que estamos utilizando. También hay que crear un nuevo bloque peer en nuestro servidor que haga referencia al nuevo dispositivo.

Este es un ejemplo de como se vería la configuración en un dispositivo movil.

ficheros

Una vez creado el túnel, podremos activarlo.

ficheros

Comparativa con el punto A

En mi opinión, este ejercicio me ha resultado mas sencillo con Wireguard que con OpenVPN, aunque con esta útlima herramienta mencionada tampoco es un proceso excesivamente complicado.


D) VPN sitio a sitio con WireGuard

Configura una VPN sitio a sitio usando WireGuard. Documenta el proceso adecuadamente y compáralo con el del apartado B.

Para este ejercicio, vamos a utilizar el mismo escenario que en el ejercicio B, pero esta vez usaremos Wireguard. Estaré usando el mismo Vagrantfile que anteriormente pero modificando algunos parámetros, como los nombres de las redes.

Configuración de los servidores (servidor1)

En esta máquina comenzaremos instalando wireguard.

apt install wireguard

Y activamos el bit de forwarding:

vagrant@serv1:~$ sudo sysctl -p
net.ipv4.ip_forward = 1
vagrant@serv1:~$ 

Posteriormente, vamos a acceder al directorio /etc/wireguard y generaremos un par de claves.

wg genkey | tee serverprivatekey | wg pubkey > serverpublickey

A continuación crearemos el fichero de configuración (wg0.conf) con el siguiente contenido:

[Interface]
Address = 10.99.99.1
PrivateKey =
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

En private key debemos poner la clave privada generada por wireguard, esto podemos obtenerlo haciendo un cat.

Lo siguiente es iniciar el servicio y comprobar que se ha iniciado exitosamente:

wg-quick up wg0

ficheros

Configuración de los servidores (servidor2)

Para este servidor empezaré directamente con la parte de creación del fichero de configuración wg0.conf, ya que los pasos a seguir son los mismos que hemos visto anteriormente con el servidor1.

En el fichero de configuración tendremos que añadir un nuevo bloque:

[Interface]
Address = 10.99.99.2
PrivateKey = cO8izYAXFcqOJNWi1XASCqG9uC1YA6fNbpsR7n5o41I=
ListenPort = 51820

[Peer]
PublicKey = /QyPxTsN8/E3MqUnGJXyj7cdwQrfXYJwpsCutiEr92I=
AllowedIPs = 10.99.99.0/24, 172.30.0.0/24
Endpoint = 192.168.121.183:51820
  • [Interface]: Esta sección contiene la configuración para la interfaz local del túnel.

  • Address = 10.99.99.2: Asigna la dirección IP 10.99.99.2 a la interfaz local del túnel.

  • PrivateKey = cO8izYAXFcqOJNWi1XASCqG9uC1YA6fNbpsR7n5o41I=: Especifica la clave privada para esta interfaz. La clave privada es crucial para la seguridad de la comunicación y debe mantenerse en secreto.

  • ListenPort = 51820: Especifica el puerto en el que el servicio WireGuard escuchará conexiones entrantes.

  • [Peer]: Esta sección contiene la configuración para el par remoto del túnel (la otra parte del túnel con la que se está conectando).

  • PublicKey = /QyPxTsN8/E3MqUnGJXyj7cdwQrfXYJwpsCutiEr92I=: Especifica la clave pública del par remoto. Cada extremo del túnel tiene un par de claves: una clave privada y una clave pública.

  • AllowedIPs = 10.99.99.0/24, 172.30.0.0/24: Indica las direcciones IP permitidas a través del túnel para el par remoto. En este caso, cualquier tráfico dirigido a las subredes 10.99.99.0/24 y 172.30.0.0/24 se enrutarán a través del túnel.

  • Endpoint = 192.168.121.183:51820: Especifica la dirección IP y el puerto del extremo remoto del túnel. En este caso, el túnel se conecta a la dirección IP 192.168.121.183 en el puerto 51820.

Ahora, antes de iniciar el túnel en el servidor2, tendremos que volver al servidor1 para agregar otra configuración, especificando la clave pública del servidor2 entre otras cosas.

[Interface]
Address = 10.99.99.1
PrivateKey = OM1OTjuGK6gn+Ei1IEN+Nh9N9Lhe/uKjK2m08lbC+WI=
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Servidor 2
[Peer]
PublicKey = A9oibcrk2pTuOA1GfGZucdkkPw4/c4jazvt6OarBfyQ=
AllowedIPs = 10.99.99.0/24, 172.20.0.0/24
PersistentKeepalive = 25

Hecho esto, es recomendable reiniciar el tunel en ambas máquinas, usando los comandos:

wg-quick down wg0

wg-quick up wg0

Podremos comprobar que está funcionando el tunel en ambos servidores.

ficheros

Configuración de los clientes

En ambos clientes hay que cambiar la ruta por defecto para que sea la interfaz de red interna de sus correspondientes servidores:

ficheros

Pruebas de funcionamiento

  • Ping y traceroute desde cliente 1 a cliente 2.

ficheros

  • Ping y traceroute desde cliente 2 a cliente 1.

ficheros

Comparativa con el punto B

En mi opinión, Wireguard es mas simple y rápido de configurar que OpenVPN. En diferencia con OpenVPN (que funciona con certificados), Wireguard usa el intercambio de claves para el funcionamiento del túnel.