Tutorial

Cómo instalar Tinc y configurar una VPN básica en Ubuntu 18.04

UbuntuSecurityNetworkingVPNUbuntu 18.04

Introducción

Tinc es un demonio de red virtual privada (VPN) de código abierto equipado con funciones útiles, como el cifrado, la compresión opcional y el direccionamiento automático de mesh que puede dirigir de forma oportuna el tráfico de VPN directamente entre servidores. Estas funciones diferencian a Tinc de otras soluciones de VPN y hacen que sea un buena opción para crear una VPN a partir de muchas redes pequeñas distribuidas geográficamente.

En este tutorial, se abordará la manera de usar Tinc para crear una VPN segura a través de la cual nuestros servidores puedan comunicarse como si estuviesen en una red local. También se mostrará la manera de usar Tinc para configurar un túnel seguro en una red privada. Usaremos servidores de Ubuntu 18.04, pero las configuraciones pueden adaptarse para su emplearse con cualquier otro SO.

Objetivos

Para abarcar varios casos de uso, en este tutorial se describe la forma de conectar un nodo cliente a la VPN a través de una interfaz de red privada y otro a través de una pública. Sin embargo, puede adaptar esta configuración para que se adecue a sus necesidades. Solo necesitará planificar la forma en que desea que sus servidores accedan unos a otros y adaptar los ejemplos presentados en este tutorial a sus necesidades. Si adapta esto a su propia configuración, asegúrese de sustituir los valores resaltados en los ejemplos por sus propios valores. Sin embargo, puede ser interesante primero seguir el tutorial tal como está escrito para asegurarse de comprender los componentes y procesos implicados antes de modificar estas instrucciones.

A los efectos de aportar claridad, en este tutorial se hará referencia a los servidores de la siguiente manera:

  • server-01: todos los nodos VPN se conectarán a esta máquina y la conexión debe mantenerse para que la VPN funcione correctamente. Pueden configurarse servidores adicionales de la misma forma que este, para proporcionar redundancia si se desea.
  • client-01: se conecta al nodo VPN server-01 usando su interfaz de red privada.
  • client-02: se conecta al nodo VPN server-01 a través de la interfaz de red pública.

Nota: Tinc no diferencia entre servidores (máquinas que alojan y ofrecen servicios VPN) y clientes (máquinas que se conectan y utilizan la red privada segura), pero considerar sus servidores de esta forma puede ser útil para comprender y visualizar el funcionamiento de Tinc.

A continuación, se muestra un digrama de la VPN que deseamos configurar:

Configuración de VPN de Tinc

El cuadro azul representa nuestra VPN y el rosa la red privada subyacente. Los tres servidores pueden comunicarse a través de la VPN, aunque la red privada sea inaccesible para client-02.

Requisitos previos

Si desea seguir este tutorial con exactitud, proporcione dos servidores de Ubuntu 18.04 (server-01 *y *client-01) en el mismo centro de datos y habilite la red privada en cada uno de ellos. A continuación, cree otro servidor de Ubuntu 18.04 (client-02) en un centro de datos distinto. Cada servidor debería tener un usuario administrativo y un firewall configurado con ufw. Para configurar esto, siga la guía de configuración inicial de servidores para Ubuntu 18.04.

Además, posteriormente en este tutorial , deberá transferir algunos archivos entre cada máquina usando scp. Debido a esto, necesitará generar claves SSH en cada uno de sus servidores, añadir las claves SSH de client-01 y client-02 al archivo authorized_keys de server-01, y luego añadir la clave SSH de server-01 a los archivos authorized_keys de client-01 y client-02. Para obtener ayuda al configurar esto, consulte nuestra guía Cómo configurar claves SSH en Ubuntu 18.04.

Paso 1: Instalar Tinc

Tinc está disponible en los repositorios predeterminados de Ubuntu APT, lo cual significa que podemos instalarlo con solo unos comandos.

Si no lo hizo recientemente, ejecute el siguiente comando en cada servidor para actualizar sus índices de paquetes respectivos:

All servers
  • sudo apt update

A continuación, instale Tinc en cada servidor ejecutando el siguiente comando:

All servers
  • sudo apt install tinc

Con eso, habrá instalado Tinc en cada uno de sus servidores. Sin embargo, deberá realizar algunos cambios en la configuración de Tinc en cada máquina para dejar lista su VPN. Comenzaremos actualizando server-01.

Paso 2: Configurar el servidor Tinc

Tinc exige que cada máquina que forma parte de la VPN tenga los tres siguientes componentes de configuración:

  • Archivos de configuración de Tinc: tres archivos distintos que configuran el demonio de Tinc.
    • tinc.conf, que define el nombre de red, el dispositivo de red a través del cual funcionará la VPN y otras opciones de la VPN;
    • tinc-up, una secuencia de comandos que activa el dispositivo de red definido en tinc.conf tras iniciar Tinc;
    • tinc-down, que desactiva el dispositivo de red cuando Tinc se detiene.
  • Pares de claves púbicas y privadas: Tinc utiliza pares de claves públicas y privadas para garantizar que solo los usuarios con claves válidas puedan acceder a la VPN.
  • Archivos de configuración de host: cada máquina (o host) en la VPN tiene su propio archivo de configuración que contiene la dirección IP real del host y la subred en la cual Tinc la presentará.

Tinc utiliza un nombre de red para distinguir una VPN Tinc de otra. Esto es útil en los casos en los que desee configurar varias VPN, pero se le recomienda utilizar un nombre de red aun cuando solo planee configurar una VPN. Puede dar a su VPN el nombre de red que deee, pero para simplificar las cosas invocaremos a nuestra VPN netname.

En server-01, cree la estructura de directorios de configuración para la VPN:

server-01
  • sudo mkdir -p /etc/tinc/netname/hosts

Utilice el editor de texto que prefiera para crear un archivo tinc.conf. En este caso, utilizaremos nano:

server-01
  • sudo nano /etc/tinc/netname/tinc.conf

Añada las líneas siguientes al archivo vacío. Con estas se configura un nodo de Tinc llamado server_01 con una interfaz de red llamada tun0 que usará IPv4:

server-01:/etc/tinc/netname/tinc.conf
Name = server_01
AddressFamily = ipv4
Interface = tun0

Advertencia: Observe cómo el valor que sigue a la directiva Name incluye un guión bajo (_) en vez de uno convencional (-). Esto es importante, ya que Tinc requiere que el valor Name contenga solo caracteres alfanuméricos o guiones bajos. Si utiliza un guión aquí, verá un error cuando intente iniciar la VPN más adelante en esta guía.

Guarde y cierre el archivo después de añadir estas líneas. Si utiliza nano, podrá hacerlo presionando CTRL+X, Y y luego ENTER.

A continuación, cree un archivo de configuración de host llamado server_01 en el subdirectorio hosts. En última instancia, los nodos clientes utilizarán este archivo para comunicarse con server-01:

server-01
  • sudo nano /etc/tinc/netname/hosts/server_01

Una vez más, observe que el nombre de este archivo contiene un guión bajo en vez de uno convencional. De esta forma, se alinea con la directiva Name en el archivo tinc.conf, lo que permitirá que Tinc anexe automáticamente la clave RSA pública del servidor a este archivo cuando la generemos más adelante.

Añada las siguientes líneas al archivo; asegúrese de incluir la dirección IP pública de server-01:

server-01:/etc/tinc/netname/hosts/server_01
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32

El campo Address especifica la forma en que los otros nodos se conectarán a este servidor, y Subnet especifica la subred que presentará este demonio. Guarde y cierre el archivo.

A continuación, genere un par de claves RSA pública y privada para este host con el siguiente comando:

server-01
  • sudo tincd -n netname -K4096

Después de ejecutar este comando, se le solicitará introducir los nombres de los archivos en los que Tinc guardará las claves RSA pública y privada:

Output
. . . Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]: Please enter a file to save public RSA key to [/etc/tinc/netname/hosts/server_01]:

Pulse ENTER para aceptar las ubicaciones predeterminadas de cada solicitud; con esto, se indicará a Tinc que almacene la clave privada en un archivo llamado rsa_key.priv y que anexe la clave pública al archivo de configuración de host server_01.

Luego cree tinc-up, la secuencia de comandos que se ejecutará siempre que se inicie la VPN netname:

server-01
  • sudo nano /etc/tinc/netname/tinc-up

Añada las siguientes líneas:

server-01:/etc/tinc/netname/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Aquí verá lo que hace cada una de estas líneas:

  • ip link ...: fija el estado de la interfaz de red virtual de Tinc en el valor up.
  • ip addr ...: añade la dirección IP 10.0.0.1 con una máscara de red de 32 a la interfaz de red virtual de Tinc, lo que hará que las otras máquinas de la VPN vean la dirección IP de server-01 como 10.0.01.
  • ip route ...: añade una ruta (10.0.0.0/24) a la que se puede llegar en la interfaz de red virtual de Tinc.

Guarde y cierre el archivo después de añadir estas líneas.

A continuación, cree una secuencia de comandos para eliminar la interfaz de red virtual cuando se detenga su VPN:

server-01
  • sudo nano /etc/tinc/netname/tinc-down

Añada las siguientes líneas:

server-01:/etc/tinc/netname/tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down

Estas líneas tienen el efecto opuesto que ofrecen las de la secuencia de comandos tinc-up:

  • ip route ...: elimina la ruta 10.0.0.0/24.
  • ip addr: elimina la dirección IP 10.0.0.1 de la interfaz de red virtual de Tinc.
  • ip link ...: fija el estado de la interfaz de red virtual de Tinc en el valor down.

Guarde y cierre el archivo, y luego haga que estas nuevas secuencias de comandos de red sean ejecutables:

server-01
  • sudo chmod 755 /etc/tinc/netname/tinc-*

Como paso final para configurar server-01, añada una regla de firewall que permita el tráfico a través del puerto 655, el predeterminado de Tinc:

server-01
  • sudo ufw allow 655

server-01 quedará, ahora, completamente configurado y usted podrá pasar a configurar sus nodos clientes.

Paso 3: Configurar los nodos clientes

Ambas máquinas clientes requerirán una configuración ligeramente diferente en comparación con el servidor, aunque el proceso generalmente será bastante similar.

Debido a la configuración que intentamos realizar en esta guía, configuraremos client-01 y client-02 de forma casi indéntica con solo unas pequeñas diferencias ente ellos. Por lo tanto, muchos de los comandos proporcionados en este paso deben ejecutarse en ambas máquinas. Tenga en cuenta, sin embargo, que si client-01 o client-02 requieren un comando específico o una configuración especial, esas instrucciones se mostrarán en un bloque de comandos azul o rojo, respectivamente.

En client-01 y client-02, replique la estructura del directorio que creó en server-01:

client-01 & client-02
  • sudo mkdir -p /etc/tinc/netname/hosts

A continuación, cree un archivo tinc.conf:

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc.conf

Añada las siguientes líneas al archivo en ambas máquinas:

client-01 & client-02 /etc/tinc/netname/tinc.conf
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01

Asegúrese de sustituir node_name por el nombre del nodo cliente respectivo. Una vez más, asegúrese de que en este nombre se utilice un guión bajo (_) en vez de uno convencional.

Observe que este archivo contiene una directiva ConnectTo que apunta a server_01, mientras que en el archivo tinc.conf de server-01 no se incluyó esta directiva. Al no incluir una instrucción ConnectTo en server-01, server-01 solo escuchará las conexiones entrantes. Esto funciona para nuestra configuración, ya que no se conectará a ninguna otra máquina.

Guarde y cierre el archivo.

A continuación, cree un archivo de configuración de host en cada nodo cliente. Una vez más, asegúrese de que el nombre del archivo se escriba con un guión bajo en lugar de uno convencional:

client-01 & client-02
  • sudo nano /etc/tinc/netname/hosts/node_name

Para client-01, añada esta línea:

client-01:/etc/tinc/netname/hosts/client_01
Subnet = 10.0.0.2/32

Para client-02, añada esta línea:

client-02:/etc/tinc/netname/hosts/client_02
Subnet = 10.0.0.3/32

Tenga en cuenta que cada cliente tiene una subred diferente que Tinc presentará. Guarde y cierre el archivo.

A continuación, genere los pares de claves en cada máquina cliente:

client-01 & client-02
  • sudo tincd -n netname -K4096

Una vez más, como lo hizo con server-01, cuando se le solicite seleccionar archivos para guardar las claves RSA, pulse ENTER para aceptar las opciones predeterminadas.

Tras eso, cree la secuencia de comandos de inicio de la interfaz de red en cada cliente:

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc-up

Para client-01, añada estas líneas:

client-01:/etc/tinc/netname/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Para client-02, añada lo siguiente:

client-02:/etc/tinc/netname/tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.3/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Guarde y cierre cada archivo.

A continuación, cree la secuencia de comandos de detención de la interfaz de red en cada cliente:

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc-down

En client-01, añada el siguiente contenido al archivo vacío:

client-01:/etc/tinc/netname/tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 dev $INTERFACE
ip link set $INTERFACE down

En client-02, añada lo siguiente:

client-02:/etc/tinc/netname/tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.3/32 dev $INTERFACE
ip link set $INTERFACE down

Guarde y cierre los archivos.

Haga que las secuencias de comandos de red sean ejecutables aplicando el siguiente comando a cada máquina cliente:

client-01 & client-02
  • sudo chmod 755 /etc/tinc/netname/tinc-*

Por último, abra el puerto 655 en cada cliente:

client-01 & client-02
  • sudo ufw allow 655

En este momento, los nodos cliente están casi configurados (aunque no del todo). Aún necesitan la clave pública que creamos en server-01 en el paso anterior para autenticar la conexión con la VPN.

Paso 4: Distribuir las claves

Cada nodo que intente comunicarse directamente con otro debe haber intercambiado claves públicas, que están dentro de los archivos de configuración de host. En nuestro caso, server-01 necesita intercambiar claves públicas con los otros nodos.

Intercambiar claves entre server-01 y client-01

En client-01, copie su archivo de configuración host a server-01. Ya que client-01 y server-01 están en el mismo centro de datos y ambos tienen la red privada habilitada, puede usar la dirección IP privada de server-01 aquí:

client-01
  • scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp

A continuación, en server-01, copie el archivo de configuración de host de client-01 al directorio /etc/tinc/netname/hosts/:

server-01
  • sudo cp /tmp/client_01 /etc/tinc/netname/hosts/

A continuación, dentro de server-01, copie su archivo de configuración de host a client-01:

server-01
  • scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp

En client-01, copie el archivo de server-01 a la ubicación correspondiente:

client-01
  • sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

En client-01, edite el archivo de configuración host server-01 de modo que el campo Address se fije en la dirección IP privada de server-01. De esta forma, client-01 se conectará a la VPN a través de la red privada:

client-01
  • sudo nano /etc/tinc/netname/hosts/server_01

Cambie la directiva Address para que apunte a la dirección IP privada de server-01:

client-01:/etc/tinc/netname/hosts/server_01
Address = server-01_private_IP
Subnet = 10.0.0.1/32

Guarde y cierre el archivo. Ahora, continuaremos con nuestro nodo restante: client-02.

Intercambiar claves entre server-01 y client-02

En client-02, copie su archivo de configuración de host a server-01:

client-02
  • scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp

A continuación, en server-01 copie el archivo de configuración de host client-02 a la ubicación apropiada:

server-01
  • sudo cp /tmp/client_02 /etc/tinc/netname/hosts/

Luego copie el archivo de configuración de host server-01 a client-02:

server-01
  • scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp

En client-02, copie el archivo de server-01 a la ubicación apropiada:

client-02
  • sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

Suponiendo que solo configure dos nodos clientes, habrá terminado de distribuir las claves públicas. Sin embargo, si crea una VPN más grande este será un buen momento para intercambiar las claves entre esos otros nodos. Recuerde que si desea que dos nodos se comuniquen directamente entre ellos (sin un servidor de reenvío de por medio), tienen que haber intercambiado sus claves y archivos de configuración de host y deben poder acceder a las interfaces de red reales de cada uno. Además, está bien copiar simplemente cada archivo de configuración de host a cada nodo en la VPN.

Paso 5: Probar la configuración

En cada nodo, comenzando por server-01, inicie Tinc con el siguiente comando:

All servers
  • sudo tincd -n netname -D -d3

Este comando incluye el indicador -n, que apunta al nombre de red de nuestra VPN: netname. Esto es útil si tiene más de una VPN configurada y necesita especificar la que desee iniciar. También incluye el indicador -D, que evita que Tinc se bifurque y se desconecte, y deshabilita el mecanismo de reinicio automático de Tinc. Por último, incluye el indicador -d, que solicita a Tinc ejecutarse en modo depuración, con un nivel de depuración de 3.

Nota: Cuando se trata del demonio de Tinc, un nivel de depuración 3 mostrará cada solicitud intercambiada entre dos servidores cualesquiera; se incluyen las solicitudes de autenticación, los intercambios de claves y las actualizaciones de listas de conexión. Los niveles de depuración más altos muestran más información a través del tráfico de red, pero por ahora solo nos interesa si los nodos pueden comunicarse entre ellos. Por ello, un nivel 3 será suficiente. En un escenario de producción, sin embargo, le convendrá aplicar un cambio a un nivel de depuración más bajo para no llenar los discos con archivos de registro.

Puede obtener más información sobre los niveles de depuración de Tinc revisando la documentación oficial.

Después de iniciar el demonio en cada nodo, debería ver un resultado con los nombres de cada nodo a medida que estos se conecten a server-01. Ahora, probaremos la conexión a través de la VPN.

En una ventana independiente, en client-02, aplique ping a la dirección IP VPN de client-01. Previamente, le asignamos el valor 10.0.0.2:

client-02
  • ping 10.0.0.2

El ping debería funcionar correctamente y debería ver en las otras ventanas algún resultado de depuración relacionado con la conexión en la VPN. Esto indica que client-02 puede comunicarse a través de la VPN y mediante server-01 *con *client-01. Pulse CTRL+C para dejar de hacer ping.

También puede usar las interfaces de la VPN para otras comunicaciones de red, como conexiones de aplicaciones, copia de archivos y SSH.

En cada ventana de depuración del demonio de Tinc, cierre el demonio pulsando CTRL+\.

Paso 6: Configurar Tinc para que se inicie en el arranque

Los servidores de Ubuntu utilizan systemd como administrador de sistema predeterminado para controlar el inicio y los procesos en ejecución. Debido a esto, podemos habilitar la VPN netname para que se inicie automáticamente en el arranque con un único comando systemctl.

Ejecute el siguiente comando en cada nodo para determinar que la VPN de Tinc se inicie siempre que la máquina arranque:

All servers
  • sudo systemctl enable tinc@netname

Tinc está configurado para iniciarse en el arranque de cada una de sus máquinas y usted puede controlar esto con el comando systemctl. Si desea iniciarlo ahora, ejecute el siguiente comando en cada uno de sus nodos:

All servers
  • sudo systemctl start tinc@netname

Nota: Si tiene varias VPN, las habilita o inicia a la vez, como se muestra a continuación:

All servers
  • sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n

Con esto, su VPN Tinc quedará completamente configurada y activa en cada uno de sus nodos.

Conclusión

Ahora que completó este tutorial, debería disponer de una buena base para crear las VPN que se adapten a sus necesidades. Tinc es muy flexible, y cualquier nodo puede configurarse para conectarse a cualquier otro (al que pueda acceder a través de la red), con lo cual puede actuar como una VPN “mesh” sin depender de un nodo individual.

0 Comments

Creative Commons License