You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

9.9 KiB

title date draft
Redes Privadas Virtuales con WireGuard 2023-01-26T22:01:09+01:00 false

Caso 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.

El Escenario es el siguiente:

escenario1

Vamos a utilizar un VagrantFile igual al utilizado en el caso A para montar la infraestructura necesaria para la práctica:

Vagrant.configure("2") do |config|

config.vm.synced_folder ".", "/vagrant", disabled: true

  config.vm.define :cliente3 do |cliente3|
    cliente3.vm.box = "debian/bullseye64"
    cliente3.vm.hostname = "cliente3"
    cliente3.vm.network :private_network,
      :libvirt__network_name => "red-externa3",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.0.20",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
  end

  config.vm.define :servidor3 do |servidor3|
    servidor3.vm.box = "debian/bullseye64"
    servidor3.vm.hostname = "servidor3"
    servidor3.vm.network :private_network,
      :libvirt__network_name => "red-externa3",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.0.10",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
    servidor3.vm.network :private_network,
      :libvirt__network_name => "red-interna3",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.1.10",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
  end

  config.vm.define :maquina3 do |maquina3|
    maquina3.vm.box = "debian/bullseye64"
    maquina3.vm.hostname = "maquina3"
    maquina3.vm.network :private_network,
      :libvirt__network_name => "red-interna3",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.1.30",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
  end
end

Ahora vamos a configurar las máquinas:

Servidor

Instalamos wireguard:

sudo apt update
sudo apt install wireguard

Activamos el bit de forwarding en el servidor editando el fichero /etc/sysctl.conf y descomentando la siguiente línea:

net.ipv4.ip_forward=1

y hacemos los cambios efectivos:

sudo sysctl -p

Ahora vamos a generar los pares de claves para el servidor (como usuario root):

wg genkey | tee /etc/wireguard/server_private.key | wg pubkey | tee /etc/wireguard/server_public.key

Ahora vamos a crear el fichero de configuración del servidor en /etc/wireguard/wg0.conf, utilizando las claves que hemos generado en el paso anterior:

[Interface]
Address = 10.99.99.1/24
ListenPort = 51820
PrivateKey = aB9gyJdOH835WVK4bqbb2VqrGeW5wFuOIyHFx7suu1w=


Al tratarse de fichero sensibles, tienen que tener permisos de solo lectura, por lo que vamos a cambiar los permisos:

sudo chmod -R 600 /etc/wireguard/

Creamos la interfaz:

sudo wg-quick up /etc/wireguard/wg0.conf

wgup

Cliente

Instalamos wireguard:

sudo apt update
sudo apt install wireguard

Ahora vamos a generar los pares de claves para el cliente (como usuario root):

wg genkey | tee /etc/wireguard/client_private.key | wg pubkey | tee /etc/wireguard/client_public.key

hora vamos a crear el fichero de configuración del cliente en /etc/wireguard/wg0.conf, utilizando la clave privada generada en el paso anterior y la clave pública del servidor:

[Interface]
Address = 10.99.99.2/24
PrivateKey = 8DFSQc0qbT3P9Dhnbg44bxU+W2uRraXsebB+suQH+nQ=

[Peer]
PublicKey = voKHGdJUz8B6Q6jRYJspzhSWDLmXI4jroPc89VkMCHQ=
AllowedIPs = 0.0.0.0/0
Endpoint = 192.168.0.10:51820
PersistentKeepalive = 25

Al tratarse de fichero sensibles, tienen que tener permisos de solo lectura, por lo que vamos a cambiar los permisos:

sudo chmod -R 600 /etc/wireguard/

Creamos la interfaz:

sudo wg-quick up /etc/wireguard/wg0.conf

wgup2

Una vez hecho esto, tenemos que añadir la clave pública del cliente al fichero de configuración del servidor, añadiendo las siguentes líneas:

[Peer]
PublicKey = eh7Ap8nkBQf5vL60sp2ORzqLtz2YWnbjABbTMrukaCo=
AllowedIPs = 10.99.99.2/32

y reiniciamos la interfaz:

sudo wg-quick down /etc/wireguard/wg0.conf
sudo wg-quick up /etc/wireguard/wg0.conf

Podemos ver el estado de la interfez con el comando wg:

wg

Rutas

Para que los mensajes que se envíen desde la máquina cliente a la máquina servidor, pasen por el túnel VPN, tenemos que cambiar la ruta por defecto para que sea a través del servidor:

sudo ip route del default
sudo ip route add default via 10.99.99.1

Tenemos que cambiar la ruta por defecto también de la máquina interna para que sea a través del servidor:

sudo ip route del default
sudo ip route add default via 192.168.1.10

Comprobación

Para comprobar que funciona, vamos a hacer un traceroute desde la máquina cliente a la máquina servidor:

traceroute1

Caso 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.

El Escenario es el siguiente:

escenario2

El escenario es similar al del caso B por lo que utilizaremos el mismo vagrantfile:

Vagrant.configure("2") do |config|

config.vm.synced_folder ".", "/vagrant", disabled: true

  config.vm.define :maquina1 do |maquina1|
    maquina1.vm.box = "debian/bullseye64"
    maquina1.vm.hostname = "maquina1"
    maquina1.vm.network :private_network,
      :libvirt__network_name => "interna1",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.0.20",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
  end

  config.vm.define :cliente do |cliente|
    cliente.vm.box = "debian/bullseye64"
    cliente.vm.hostname = "cliente"
    cliente.vm.network :private_network,
      :libvirt__network_name => "interna1",
      :libvirt__dhcp_enabled => false,
      :ip => "192.168.0.10",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
    cliente.vm.network :private_network,
      :libvirt__network_name => "internet",
      :libvirt__dhcp_enabled => false,
      :ip => "10.20.30.1",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
  end

  config.vm.define :servidor do |servidor|
    servidor.vm.box = "debian/bullseye64"
    servidor.vm.hostname = "servidor"
    servidor.vm.network :private_network,
      :libvirt__network_name => "internet",
      :libvirt__dhcp_enabled => false,
      :ip => "10.20.30.2",
      :libvirt__netmask => '255.255.255.0',
      :libvirt__forward_mode => "veryisolated"
    servidor.vm.network :private_network,
      :libvirt__network_name => "interna2",
      :libvirt__dhcp_enabled => false,
      :ip => "172.22.0.10",
      :libvirt__netmask => '255.255.0.0',
      :libvirt__forward_mode => "veryisolated"
  end

  config.vm.define :maquina2 do |maquina2|
    maquina2.vm.box = "debian/bullseye64"
    maquina2.vm.hostname = "maquina2"
    maquina2.vm.network :private_network,
      :libvirt__network_name => "interna2",
      :libvirt__dhcp_enabled => false,
      :ip => "172.22.0.20",
      :libvirt__netmask => '255.255.0.0',
      :libvirt__forward_mode => "veryisolated"
  end
end

Ahora vamos a configurar las máquinas:

Servidor

La configuración es similar a la del caso B, con la diferencia de que el fichero de configuración en /etc/wireguard/wg0.conf es el siguiente:

Las claves son:

  • privada: 0N0kdHNHajtKY78rAGaI5uHzY8QGvZMCuiyw3WXU0n0=
  • pública: SC7FuKTw2GnjJmJDmP0GuZGzgr9CBHUbcBOAXKKrCSU=
[Interface]
Address = 10.99.99.1
ListenPort = 51820
PrivateKey = 0N0kdHNHajtKY78rAGaI5uHzY8QGvZMCuiyw3WXU0n0=

Creamos la interfaz con el siguiente comando:

sudo wg-quick up wg0

Cliente

La configuración es similar a la del caso B, con la diferencia de que el fichero de configuración en /etc/wireguard/wg0.conf es el siguiente:

Las claves son:

  • privada: OLKDIsseCywbzWOwME1gxzIZLhopGljCeyYgibrHwm0=
  • pública: jwqTMNZ4lQkVk2OLrlMGZGDCkkCLJFmcUjlF7aPvrWc=
[Interface]
Address = 10.99.99.2
PrivateKey = OLKDIsseCywbzWOwME1gxzIZLhopGljCeyYgibrHwm0=
ListenPort = 51820

[Peer]
PublicKey = SC7FuKTw2GnjJmJDmP0GuZGzgr9CBHUbcBOAXKKrCSU=
AllowedIPs = 0.0.0.0/0
Endpoint = 10.20.30.2:51820

Creamos la interfaz con el siguiente comando:

sudo wg-quick up wg0

Activamos el bit de forwarding en el servidor editando el fichero /etc/sysctl.conf y descomentando la siguiente línea:

net.ipv4.ip_forward=1

y hacemos los cambios efectivos:

sudo sysctl -p

Ahora, como tenemos la clave pública del otro servidor, modificamos el fichero /etc/wireguard/wg0.conf del servidor para añadir la siguiente sección:

[Peer]
Publickey = jwqTMNZ4lQkVk2OLrlMGZGDCkkCLJFmcUjlF7aPvrWc=
AllowedIPs = 0.0.0.0/0
PersistentKeepAlive = 25
Endpoint = 10.20.30.1:51820

y reiniciamos el servicio:

sudo wg-quick down wg0
sudo wg-quick up wg0

Máquinas

Ahora vamos a configurar las rutas en las maquinas internas:

Máquina1:

sudo ip route del default
sudo ip route add default via 192.168.0.10

Máquina2:

sudo ip route del default
sudo ip route add default via 172.22.0.10

Prueba de funcionamiento

traceroute desde maquina1 a maquina2:

traceroute2

traceroute desde maquina2 a maquina1:

traceroute3

Conclusión

Utilizando WireGuard la configuración es más sencilla de realizar y tiene menos ficheros, por lo que es más fácil de gestionar y de depurar errores. Aparte de esto, el funcionamiento es el mismo que el de OpenVPN.