enchufado
   RSS
#
Servidor VPN fácil con Wireguard (GNU/Linux) 2019-04-02 22:36:20

En el post previo vimos cómo crear una VPN punto-a-punto con Wireguard para, por ejemplo, conectar dos sedes. Ésta vez, vamos a montar un servidor/concentrador VPN con el mismo software para que puedan conectarse clientes varios (roadwarriors). En nuestro caso, usaremos un móvil Android a través del cliente de VPN de Google Play que, a pesar de estar en Beta, parece funcionar correctamente.

Como anteriormente ya describimos ésta pieza de software, vamos directos al lío.

Servidor

  1. Habilitamos el ip forwarding:
  2. # Temporalmente
    $ sysctl net.ipv4.ip_forward=1
    
    # O de forma permanente
    $ vi /etc/sysctl.d/99-sysctl.conf
    net.ipv4.ip_forward = 1
    :wq
    $ sysctl -p
    
  3. Abrimos en el firewall el puerto 51820/udp y permitimos el forwarding a nivel de cortafuegos:
  4. iptables -I INPUT -p udp --dport 51820 -j ACCEPT
    iptables -P FORWARD ACCEPT
    
  5. Si tenemos un router, habrá que redireccionar el tráfico UDP del puerto 51820 a la dirección ip del servidor de la LAN que ejecutará el servicio/concentrador VPN Wireguard. Ésto hay que hacerlo a través del propio router.
  6. Generamos las claves pública y privada:
  7. $ wg genkey > privatekey
    $ chmod 600 privatekey
    $ wg pubkey < privatekey > publickey
    
  8. Creamos la configuración de Wireguard en el servidor. En éste caso creamos un solo peer, pero se pueden poner tantos como clientes VPN sean necesarios:
  9. $ mkdir /etc/wireguard
    $ vi /etc/wireguard/wg0.conf
    
    [Interface]
    Address = 10.200.200.1/24
    SaveConfig = true
    ListenPort = 51820
    PrivateKey = [SERVER PRIVATE KEY]
    
    # Sustituir 'eth0' por la interficie por la que el servidor escuchará de cara a Internet
    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 foo
    PublicKey = [FOO's PUBLIC KEY]
    #PresharedKey = [PRE-SHARED KEY]
    AllowedIPs = 10.200.200.2/32
    
    :wq
    
  10. En éste punto, podemos gestionar la interfaz "manualmente" usando wg-quick(8), o bien usando el servicio con el mismo nombre de systemd. Ejemplo de uno y otro:
  11. # Manualmente
    $ wg-quick up wg0
    [#] ip link add wg0 type wireguard
    [#] wg setconf wg0 /dev/fd/63
    [#] ip address add 10.200.200.1/24 dev wg0
    [#] ip link set mtu 1420 up dev wg0
    [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    
    $ ifconfig wg0
    wg0: flags=209  mtu 1420
            inet 10.200.200.1  netmask 255.255.255.0  destination 10.200.200.1
            unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
            RX packets 0  bytes 0 (0 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    $ wg-quick down wg0
    [#] wg showconf wg0
    [#] ip link delete dev wg0
    [#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    
    # Automáticamente
    $ systemctl enable wg-quick@wg0.service
    $ systemctl start wg-quick@wg0.service
    $ systemctl status wg-quick@wg0.service
    ● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
       Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
       Active: active (exited) since Tue 2019-04-02 20:40:09 CEST; 1s ago
         Docs: man:wg-quick(8)
               man:wg(8)
               https://www.wireguard.com/
               https://www.wireguard.com/quickstart/
               https://git.zx2c4.com/WireGuard/about/src/tools/man/wg-quick.8
               https://git.zx2c4.com/WireGuard/about/src/tools/man/wg.8
      Process: 7145 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
     Main PID: 7145 (code=exited, status=0/SUCCESS)
    
    abr 02 20:40:08 srv systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
    abr 02 20:40:08 srv wg-quick[7145]: [#] ip link add wg0 type wireguard
    abr 02 20:40:09 srv wg-quick[7145]: [#] wg setconf wg0 /dev/fd/63
    abr 02 20:40:09 srv wg-quick[7145]: [#] ip address add 10.200.200.1/24 dev wg0
    abr 02 20:40:09 srv wg-quick[7145]: [#] ip link set mtu 1420 up dev wg0
    abr 02 20:40:09 srv wg-quick[7145]: [#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    abr 02 20:40:09 srv systemd[1]: Started WireGuard via wg-quick(8) for wg0.
    

Cliente

Con un cliente normal en consola, tendríamos la siguiente configuración:

$ vi /etc/wireguard/wg0.conf

[Interface]
Address = 10.200.200.2/24
PrivateKey = [FOO's PRIVATE KEY]
DNS = 10.200.200.1

[Peer]
PublicKey = [SERVER PUBLICKEY]
PresharedKey = [PRE-SHARED KEY]
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = [SERVER PUBLIC IP]:51820
:wq

$ wg-quick up wg0

Comentar brevemente que el AllowedIPs es importante puesto que redigirá el tráfico para esos rangos de red por la VPN. Sería el análogo a las rutas pushed a los clientes de OpenVPN. Usando el catch-all 0.0.0.0/0, ::/0 redirigirá todo el tráfico a través de la VPN, pero podríamos decidir que sólo enrutamos ciertos rangos de red.

Por ejemplo, podemos poner sólo los rangos de red de nuestra LAN (192.168.1.0/24, 172.16.0.0/24) y de éste modo sólo se enrutará por la VPN cuando solicitemos alguna dirección de éstos rangos. El resto del tráfico irá por la ruta por defecto.

Veamos cómo proceder con la configuración del cliente Android:

  1. Instalamos el cliente Android.
  2. Lanzamos la aplicación y aparece vacía. Añadimos la siguiente configuración pulsando el botón '+' y seleccionando "Create from scratch". A parte de la interfaz wg0 (primera imagen), tendremos que añadir un peer (el servidor/concentrador VPN, segunda imagen):
  3. Y la guardamos (imagen del diskette arriba a la derecha). Nótese que ésto supone que tenemos un servidor DNS en el host servidor/concentrador de VPN. Si no es así, podemos poner algún otro servidor dns público (8.8.8.8, 1.1.1.1, etc). Con ésto ya lo tenemos configurado, y en la pantalla principal de la app nos saldria la siguiente interfaz wg0, que sólo tenemos que habilitar (encendiendo el interruptor) para establecer la conexión con el servidor/concentrador de VPN:
  4. A continuación podemos ver una muestra de captura de tráfico y estadísticas de la interfaz del lado del servidor/concentrador VPN:
  5. $ ifconfig wg0
    wg0: flags=209  mtu 1420
            inet 10.200.200.1  netmask 255.255.255.0  destination 10.200.200.1
            unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
            RX packets 158  bytes 16948 (16.5 KiB)
            RX errors 0  dropped 158  overruns 0  frame 0
            TX packets 63  bytes 7788 (7.6 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    $ tcpdump -ni any udp and port 51820
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
    
    20:21:56.513268 IP 31.4.189.86.53659 > 192.168.2.7.51820: UDP, length 148
    20:22:01.532883 IP 31.4.189.86.53659 > 192.168.2.7.51820: UDP, length 148
    20:26:01.896448 IP 31.4.189.86.53619 > 192.168.2.7.51820: UDP, length 148
    20:26:01.897602 IP 192.168.2.7.51820 > 31.4.189.86.53619: UDP, length 92
    20:26:01.967003 IP 31.4.189.86.53619 > 192.168.2.7.51820: UDP, length 96
    20:26:01.995992 IP 31.4.189.86.53619 > 192.168.2.7.51820: UDP, length 112
    20:26:02.164035 IP 31.4.189.86.53619 > 192.168.2.7.51820: UDP, length 96
    20:26:03.155887 IP 31.4.189.86.53619 > 192.168.2.7.51820: UDP, length 96
    20:26:05.195718 IP 31.4.189.86.53619 > 192.168.2.7.51820: UDP, length 96
    
  6. Llegados a éste punto, podemos intentar conectar a algún servicio del servidor/concentrador VPN o a algún otro de algún host enrutado por la VPN y debería funcionarnos.

Y ésto es todo.


Comentarios (0)


Volver al indice

login, admin, form, register