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.
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:
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.
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.
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:
- sudo apt update
A continuación, instale Tinc en cada servidor ejecutando el siguiente comando:
- 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.
Tinc exige que cada máquina que forma parte de la VPN tenga los tres siguientes componentes de configuración:
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.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:
- 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
:
- 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:
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:
- 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:
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:
- 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
:
- sudo nano /etc/tinc/netname/tinc-up
Añada las siguientes líneas:
#!/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:
- sudo nano /etc/tinc/netname/tinc-down
Añada las siguientes líneas:
#!/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:
- 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:
- sudo ufw allow 655
server-01 quedará, ahora, completamente configurado y usted podrá pasar a configurar sus 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:
- sudo mkdir -p /etc/tinc/netname/hosts
A continuación, cree un archivo tinc.conf
:
- sudo nano /etc/tinc/netname/tinc.conf
Añada las siguientes líneas al archivo en ambas máquinas:
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:
- sudo nano /etc/tinc/netname/hosts/node_name
Para client-01, añada esta línea:
Subnet = 10.0.0.2/32
Para client-02, añada esta línea:
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:
- 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:
- sudo nano /etc/tinc/netname/tinc-up
Para client-01, añada estas líneas:
#!/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:
#!/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:
- sudo nano /etc/tinc/netname/tinc-down
En client-01, añada el siguiente contenido al archivo vacío:
#!/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:
#!/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:
- sudo chmod 755 /etc/tinc/netname/tinc-*
Por último, abra el puerto 655
en cada cliente:
- 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.
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.
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í:
- 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/
:
- 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:
- 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:
- 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:
- sudo nano /etc/tinc/netname/hosts/server_01
Cambie la directiva Address
para que apunte a la dirección IP privada de 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.
En client-02, copie su archivo de configuración de host a server-01:
- 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:
- sudo cp /tmp/client_02 /etc/tinc/netname/hosts/
Luego copie el archivo de configuración de host server-01 a client-02:
- 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:
- 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.
En cada nodo, comenzando por server-01, inicie Tinc con el siguiente comando:
- 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
:
- 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+\
.
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:
- 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:
- sudo systemctl start tinc@netname
Nota: Si tiene varias VPN, las habilita o inicia a la vez, como se muestra a continuación:
- 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.
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Sign up for Infrastructure as a Newsletter.
Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.