Wireguard para dummies

Solo quería dejar aquí anotado la parte esencial de Wireguard para poder entenderlo.

Servidor

Como todo servicio consta de dos partes el cliente y el servidor.

En el servidor, y posteriormente en el cliente también, hay que crear un par de claves al estilo ssh.

  mkdir ~/.wg
  chmod 700 ~/.wg && cd ~/.wg
  wg genkey | tee wg-private.key | wg pubkey > wg-public.key
  chmod 600 *

En el servidor creamos un archivo /etc/wireguard/wg0.conf

Primero definimos la configuración del propio servicio:

[Interface]
Address = 192.168.0.1/24
ListenPort = 44312
PrivateKey = w00/xxM000asdbDFa000008djXv0000VjEydgb00=
  1. El direccionamiento donde se va a establecer la nueva red que no debe coincidir con uno existente
  2. El puerto de escucha
  3. La clave privada que hemos creado previamente

Esta regla de IPTables recomiendan en caso de no estar detrás de un NAT.

# if the server is behind a router and receive traffic via NAT, this iptables rules are not needed
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

En el cliente 1 donde tenemos instalado Wireguard también creamos un par de claves

  mkdir ~/.wg
  chmod 700 ~/.wg && cd ~/.wg
  wg genkey | tee wg-private.key | wg pubkey > wg-public.key
  chmod 600 *

Y con lo que sale de la pública creamos un nuevo apartado de cliente “Peer” en el mismo archivo wg0.conf del servidor

[Peer] #cliente 1
PublicKey = mPcnwYR2JB+RljnV6ZelVFcZCqSQb+jp11et5ZRYZWo=
AllowedIPs = 0.0.0.0/0

[Peer] #cliente 2
PublicKey = eFknVBuw2uqZ6vRF9fZuvDY7Hq3F3fXMXl6dcru6m3Q=
AllowedIPs = 192.168.0.1/32, 192.168.1.1/32

En el apartado AllowedIPs incluímos las IPs a las que podrá saltar el cliente pueda acceder una vez conectado a la VPN.

Si ponemos 0.0.0.0/0 podrá acceder a cualquier red accesible desde el servidor y obviamente, si ponemos una red concreta sólo podrá acceder a esa. Siempre redes accesibles y conocidas para el servidor.

Todo junto, el archivo con dos clientes quedaría así de simple:

[Interface]
Address = 192.168.0.1/24
ListenPort = 55312
PrivateKey = w00/xxM000asdbDFa000008djXv0000VjEydgb00=

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer] #cliente 1
PublicKey = mPcnwYR2JB+RljnV6ZelVFcZCqSQb+jp11et5ZRYZWo=
AllowedIPs = 0.0.0.0/0

[Peer] #cliente 2
PublicKey = eFknVBuw2uqZ6vRF9fZuvDY7Hq3F3fXMXl6dcru6m3Q=
AllowedIPs = 192.168.0.1/32, 192.168.1.1/32

Cliente

Mientras que en el cliente tendríamos esto:

[Interface]
Address = 192.168.0.10
PrivateKey = 2FurTgPHkZWabpZzMeyKCAw1+D3GmvfNALkTt+dqRlg=
ListenPort = 44312

[Peer]
PublicKey = eB6/r+GEnWYJ+Pony6Ofxm6S2KB/LBWv3WdBFPB0y18=
Endpoint = xuacu.es:55312
AllowedIPs = 192.168.1.1/24, 192.168.0.0/24

# This is for if you're behind a NAT and
# want the connection to be kept alive.
PersistentKeepalive = 25

Servicio

Para que manejar el servicio en SystemD usamos el siguiente comando:

systemctl [enable|start|stop] wg-quick@wg0

Rutas en red local

Si además queremos que se pueda acceder a un cliente que está conectado a nuestra red desde otra parte de la propia red podemos añadir una ruta local en un cliente linux.

route add -net 192.168.0.0/24 gw 192.168.1.225 dev eth0

Con esto le decimos a nuestro sistema por donde tiene que pasar para llegar a la red 192.168.0.0 desde la red en la que estamos que será la 192.168.1.1.

Comandos

Un par de comandos de utilidad: * wg sin modificadores muestra una foto del estado de la conexión en tiempo real * wg-quick [up|down] levanta o para la red

+INFO

Como siempre esto son notas personales para tener a mano, aconsejo revisar estas webs en caso de necesitar ayuda de verdad para configurar esto: