Table of Contents
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:
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:
[label All servers]
sudo apt update
A continuación, instale Tinc en cada servidor ejecutando el siguiente comando:
[label 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 entinc.conftras 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:
[label 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:
[label 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:
[label server-01:/etc/tinc/netname/tinc.conf]
Name = <^>server_01<^>
AddressFamily = ipv4
Interface = tun0
[warning]
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:
[label 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:
[label 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:
[label 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:
[secondary_label 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<^>:
[label server-01]
sudo nano /etc/tinc/<^>netname<^>/tinc-up
Añada las siguientes líneas:
[label 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 valorup.
ip addr ...: añade la dirección IP10.0.0.1con una máscara de red de32a 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 como10.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:
[label server-01]
sudo nano /etc/tinc/<^>netname<^>/tinc-down
Añada las siguientes líneas:
[label 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 ruta10.0.0.0/24.
ip addr: elimina la dirección IP10.0.0.1de la interfaz de red virtual de Tinc.
ip link ...: fija el estado de la interfaz de red virtual de Tinc en el valordown.
Guarde y cierre el archivo, y luego haga que estas nuevas secuencias de comandos de red sean ejecutables:
[label 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:
[label 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:
[label client-01 & client-02]
sudo mkdir -p /etc/tinc/<^>netname<^>/hosts
A continuación, cree un archivo tinc.conf:
[label client-01 & client-02]
sudo nano /etc/tinc/<^>netname<^>/tinc.conf
Añada las siguientes líneas al archivo en ambas máquinas:
[label 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:
[label client-01 & client-02]
sudo nano /etc/tinc/<^>netname<^>/hosts/<^>node_name<^>
Para client-01, añada esta línea:
[label client-01:/etc/tinc/netname/hosts/client_01]
[environment second]
Subnet = 10.0.0.<^>2<^>/32
Para client-02, añada esta línea:
[label client-02:/etc/tinc/netname/hosts/client_02]
[environment third]
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:
[label 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:
[label client-01 & client-02]
sudo nano /etc/tinc/<^>netname<^>/tinc-up
Para client-01, añada estas líneas:
[label client-01:/etc/tinc/netname/tinc-up]
[environment second]
#!/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:
[label client-02:/etc/tinc/netname/tinc-up]
[environment third]
#!/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:
[label client-01 & client-02]
sudo nano /etc/tinc/<^>netname<^>/tinc-down
En client-01, añada el siguiente contenido al archivo vacío:
[label client-01:/etc/tinc/netname/tinc-down]
[environment second]
#!/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:
[label client-02:/etc/tinc/netname/tinc-down]
[environment third]
#!/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:
[label client-01 & client-02]
sudo chmod 755 /etc/tinc/<^>netname<^>/tinc-*
Por último, abra el puerto 655 en cada cliente:
[label 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í:
[label client-01]
[environment second]
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/:
[label 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:
[label 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:
[label client-01]
[environment second]
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:
[label client-01]
[environment second]
sudo nano /etc/tinc/<^>netname<^>/hosts/server_01
Cambie la directiva Address para que apunte a la dirección IP *privada* de server-01:
[label client-01:/etc/tinc/netname/hosts/server_01]
[environment second]
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:
[label client-02]
[environment third]
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:
[label 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:
[label 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:
[label client-02]
[environment third]
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:
[label 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:
[label client-02]
[environment third]
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:
[label 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:
[label 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:
[label 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.