Tinc

Author: MauricioPasquier
Date: 2011-06-25 04:47:43
url:http://wiki.buenosaireslibre.org/Tinc

Tinc es un demonio que genera una VPN mesh con túneles y encriptación entre varios nodos corriendo el demonio. Es mesh en el sentido de que eventualmente crea enlaces virtuales entre todos los nodos de la red, más allá de cuáles sean las conexiones iniciales entre nodos. Tiene licencia GPL.

Características principales

  • Encriptación, autenticación y compresión: se puede comprimir con zlib o LZO, y se usa OpenSSL para encriptar y proteger el tráfico.
  • Ruteo mesh automático: más allá de cómo se configuren los demonios para conectarse entre sí, el tráfico por la VPN siempre se manda directamente al destino, si es posible.
  • Facilidad para expandir la red: para agregar un nodo a la red lo único que hace falta es un archivo extra con la llave y el nombre del nuevo nodo.
  • El ruteo por olsrd funciona perfectamente sobre tinc.

Configuración

En los archivos de configuración, la variable $INTERFACE toma el valor de la VPN automáticamente del nombre del directorio donde están los archivos. Asique si queremos hacer la red para BAL, creamos un directorio /etc/tinc/bal y ahí adentro configuramos todo.

El rango usado para los nodos es el reservado para ejemplos y documentación en SubredesAsignadas:

Subred 172.16.167.0
CIDR 28
Máscara de red 255.255.255.240
Primera IP 172.16.167.1
Última IP 172.16.167.14
Broadcast 172.16.167.15
Responsable BuenosAiresLibre
Comentarios Reservado para ejemplos y documentación.

Asumimos que este rango es el asignado a NodoFalso, y este "presta" IPs a los nodos NodoEjemplo y NodoInventado para realizar la conexión. Luego, estos nodos pueden prestar de su rango a otros nodos, a los que NodoFalso va a tener acceso transparentemente. Por supuesto, un enlace real tiene prioridad, pero muchas veces estas IPs están sin uso. ¿Por qué no darle redundancia a la red y/o conectar un AP Aislado?

tinc.conf

01 # BuenosAiresLibre.org por VPN!
02
03 # El nombre de este host tinc (o sea el nombre del nodo)
04 Name = NodoFalso
05
06 # Los nodos con los que queremos conectarnos.
07 # Por cada nodo debemos tener un archivo de configuración en
08 # el directorio /etc/tinc/bal/hosts
09 ConnectTo = NodoEjemplo
10 ConnectTo = NodoInventado
11
12 # tinc funciona tanto en modo switch como router (el modo por omisión),
13 # pero ya que usamos olsrd no necesitamos el modo router
14 Mode = switch

tinc-up

1 #!/bin/sh
2
3 # En este archivo levantamos la interfaz por la que se conectan los nodos de la VPN.
4 # La subred del dispositivo tiene que ser mayor que las subredes asignadas a cada nodo,
5 # asique usamos la máscara que FreeNetworks le asignó a BuenosAiresLibre para
6 # interconexión de nodos (172.16.166.0/20), que engloba todas las direcciones ruteables
7 # por BAL, y una IP del rango asignado a NodoFalso
8
9 ifconfig $INTERFACE 172.16.167.1 netmask 255.255.240.0

tinc-down

1 #!/bin/sh
2 # Este archivo baja la interfaz. Normalmente no hay que tocarlo.
3
4 ifconfig $INTERFACE down

llaves

Para generar las llaves usamos el comando tincd -n nombredered -K. Previamente hay que haber creado el directorio /etc/tinc/nombredered:

tincd -n bal -K

El comando pregunta la ubicación de la llave. El valor por omisión suele ser el correcto (el directorio /etc/tinc/bal en este caso). Con esto ya tenemos las llaves rsa_key.priv y rsa_key.pub que identifican al nodo.

hosts

Los archivos de configuración de cada host (el nuestro y a los que nos conectamos) van en el directorio /etc/tinc/bal/hosts. Deben llamarse exactamente como los definimos en tinc.conf. En nuestro caso, tenemos los archivos NodoFalso, NodoEjemplo y NodoInventado.

NodoFalso

01 # Address puede ser una IP en el caso de que tengamos una fija, pero
02 # lo más probable es que tengamos IP dinámica. Lo mejor es configurar
03 # un dominio que siempre haga referencia a esa IP dinámica (con DynDNS
04 # o CDmon, por ejemplo)
05 Address = nodofalso.com.ar
06
07 # Tinc escucha por omisión en el puerto 655. Recuerden abrirlo en el
08 # firewall
09 Port = 655
10
11 # En Subnet vamos a asignarle a cada nodo una de las IP del rango para
12 # enlaces nodo-nodo específico de NodoFalso
13 Subnet = 172.16.167.1/32
14
15 # Después viene la llave pública que generamos antes.
16 -----BEGIN RSA PUBLIC KEY-----
17 MIICCgKCAgEAu2ZRQQXz5J5l5g3JGjEclWmoIV+fpEBklJ9cx8AFdKuxfRYIeN+z
18 hxHNnUENVbD+imEPI+jPtYGsh4iP9ysIXqIPGoOLYDXKnDSYYbup6VNEvtOztUB2
19 DrTShcvXcKz1nDtG6u/oT+SKiHrkrJdLNaPFYZ2BYP4GJJy/c80HgjYwuhZ3mN0M
20 Qo+4MMzurFHmEvT9MUXiAmEwKCaLh3QJJ5XZxT5hck4PsjVVkEN3TmB9Fqf4u6fW
21 eZOPl+lYCshkcYvz2Vh4sMfk0/PxHvMJg9iFKt/9WqRIcmsbn3v1Pnql3TwYlzCs
22 4bnN+KF069hKNnI6M5G6eFvp2TkXnGtqG5a1OqfABoFE5GlmCW7DOizOn2xuwkJE
23 LMkSSFj36a0LPrVV1VitFLlkAnfC4p0TGL/dYPGpqEBIWKD+/RcNiAeeB90X1t27
24 CbBuUP7N02XBPbssyQT6tSSsA33JpeJWHebVjiwNQyXr//9kgKYLS9AbkgqyDlgJ
25 StvJoKXuycNPs9ljGnVVtz3/ccqX7n7jgOWhHUrq7/bn8ZuigMWVmUd/cIpO9f/c
26 ZLt2o1TBtb7M4jpG3AhhT/j5eNCzTqY8aw8hOBLDfZICwWo0Jw8MmFKuZTACrS9A
27 tbG8JrsabS8h7JllNkszALefJQUJCLchA9Ss5Pn8EbPWXMh3CxvxvjkCAwEAAQ==
28 -----END RSA PUBLIC KEY-----

La llave pública podemos agregarla al archivo con el comando:

cat rsa_key.pub >> hosts/NodoFalso

NodoEjemplo y NodoInventado

La IP de los nodos a los que nos conectamos la determinamos nosotros (como administrador del NodoFalso), pero las llaves públicas tienen que generarla los administradores de NodoEjemplo y NodoInventado respectivamente.:

01 Address = nodoejemplo.dyndns.org
02 Subnet = 172.16.167.15/32
03
04 -----BEGIN RSA PUBLIC KEY-----
05 MIICCgKCAgEAyQkyZjmC+NsO2xCLecbLPaD0vSE8+csWtp/gxmHJr37g/FBqsVJ/
06 uRZaFmSoMemaZavyqDEAWDAW9RQQVu/R4E3aCXOWItuQB6pA/+RiUqfOZXeP7ayy
07 /xQTrnYDeFmycR4aXgu456OVL4ifsKgMGspaOHJ/Kg1f61x5cOAJnwS6PltSIGwL
08 +K7jKUPmYPfsuLh+uYlxSFMi6pAHwTX9TUNLLvwiH2MD6ASDLKQWOIUQDWd0QO7b
09 yAq04ivdGC8PRG9TwwXdJdRrNxWutZNzYHL975JW37RaWJ5Mdf0F22JIR5L8YezT
10 QwrdiFrxEw0UOdOuu8qbtgUw4cJp3rkUez5bqbP3jeTX7LkPnwmbrGwSNwE2n0ti
11 eBgpXpZINdIgXI17wlEEFVweYv6YbQdsgldO7xezm6tsRELklL+0cKKY5xSj6xLJ
12 PEdBIbWVvKfEJs04xaZtPNi4sgNodNCxYH37ohLiRN90FI8nSFOUHB2Q3VHiirE1
13 fUsdbDNXUTMNWPlo+M7dxOO4bxhD5jy7jiOn4Dr+vbjGuMNFZHSvzixiX3cymM5f
14 In1MsFIlp28xdB1h8tUE7vvDwvCaJFF9D1w36nYzpqephjQNxsw8kkLNxoDwcnkN
15 R9mUund/5vqokBpb9U8ZuOd/RuRsU6v3mUnMcBKASDOIWQBzc3WC7YsCAwEAAQ==
16 -----END RSA PUBLIC KEY-----

 1 Address = nodoinventado.org
 2 Subnet = 172.16.167.14/32
 3
 4 -----BEGIN RSA PUBLIC KEY-----
 5 MIICCgKCAgEAyQkyZjmC+NsO2xCLecbLPaD0vSE8+csWtp/gxmHJr37g/FBqsVJ/
 6 uRZaFmSoMemaZavyqUVJZ0+99RQQVu/R4E3aCXOWItuQB6pA/+RiUqfOZXeP7ayy
 7 /xQTrnYDeFmycR4aaASDwqeiqwe098123mkacsdlkmcadioadsjafsFASdfkjSDL
 8 +K7jKUPmYPfsuLh+uYlxSFMi6pAHwTX9TUNLLvwiH2MD6W2nkHNozL+e3vd0QO7b
 9 yAq04ivdGC8PRG9TwwXdJdRrNxWutZNzYHL975JW37RaWJ5Mdf0F22JIR5L8YezT
10 Qwrsm68slWdfhowEu8qbtgUw4cJp3rkUez5bqbP3jeTX7LkPnwmbrGwSNwE2n0ti
11 eBgpXpZINdIgXI17wlEEFVweYv6YbQdsgldO7xezm6tsRELklL+0cKKY5xSj6xLJ
12 PEdBIbWVvKfEJs04xaZtPNi4sgNodNCxYH37ohLiRN90FI8nSFOUHB2Q3VHiirE1
13 fUsdbDNXUTMNWPlo+M7dxOO4bxhD5jy7jiOn4Dr+vbjGuMNFZHSvzixiX3cymM5f
14 In1MsFIlp28xdB1h8tUE7vvDwvCaJFF9D1w36nYzpqephjQNxsw8kkLNxoDwcnkN
15 R9mUund/5vqokBpb9U8ZuOd/RuRsU6v3mUnMctaZPqRy7QBzc3WC7YsCAwEAAQ==
16 -----END RSA PUBLIC KEY-----

Iniciar el demonio

Se inicia con el comando:

tincd -n bal

Si queremos ver cómo es el proceso de conexión y asegurarnos de que está funcionando, podemos pasarle -D -d 2 como parámetros.

Si queremos conectarnos a diferentes VPNs (por ejemplo, con una máquina que rutee entre MontevideoLibre y BuenosAiresLibre, necesitamos 2 demonios, uno por red, con configuraciones diferentes para cada red.

Configuración de olsrd

Podemos agregar este bloque al olsrd.conf para que de menor prioridad a los enlaces por VPN:

01 Interface "bal"
02 {
03     LinkQualityMult default 0.2
04 }

Agregando un nodo

Ahora supongamos que NodoInventado quiere conectarse con NodoNuevo, prestándole una IP de su rango asignado, que suponemos es:

Subred 172.16.166.28
CIDR 28
Máscara de red 255.255.255.240
Primera IP 172.16.166.17
Última IP 172.16.166.30
Broadcast 172.16.166.31
Responsable BuenosAiresLibre
Comentarios Reservado para ejemplos y documentación.

Los pasos a seguir son:

  1. NodoNuevo configura su tinc con la IP que le asignó NodoInventado:

    172.16.166.18
    
    • tinc.conf:

      01 Name = NodoNuevo
      02 ConnectTo = NodoInventado
      03 Mode = switch
      
    • tinc-up:

      01 #!/bin/sh
      02 ifconfig $INTERFACE 172.16.166.18 netmask 255.255.240.0
      
    • tinc-down:

      01 #!/bin/sh
      02 ifconfig $INTERFACE down
      
    • hosts/NodoNuevo:

      01 Address = nodonuevo.com.ar
      02 Port = 655
      03 Subnet = 172.16.166.18/32
      04
      05 -----BEGIN RSA PUBLIC KEY-----
      06 MIICCgKCAgEAu2ZRQQXz5J5l5g3JGjEclWmoIV+fpEBklJ9cx8AFdKuxfRYIeN+z
      07 hxHNnUENVbD+imEPI+jPtYGsh4iP9ysIXqIPGoOLYDXKnDSYYbup6VNEvtOztUB2
      08 DrTShcvXcKz1nDtG6u/oT+SKiHrkrJdLNaPFYZ2BYP4GJJy/c80HgjYwuhZ3mN0M
      09 Qo+4MMzurFHmEvT9MUXiAmEwKCaLh3QJJ5XZxT5hck4PsjVVkEN3TmB9Fqf4u6fW
      10 eZOPl+lYCshkcYvz2Vh4sMfk0/PxHvMJg9iFKt/9WqRIcmsbn3v1Pnql3TwYlzCs
      11 4bnN+KF069hKNnI6M5G6eFvp2TkXnGtqG5a1OqfABoFE5GlmCW7DOizOn2xuwkJE
      12 LMkSSFj36a0LPrVV1VitFLlkAnfC4p0TGL/dYPGpqEBIWKD+/RcNiAeeB90X1t27
      13 CbBuUP7N02XBPbssyQT6tSSsA33JpeJWHebVjiwNQyXr//9kgKYLS9AbkgqyDlgJ
      14 StvJoKXuycNPs9ljGnVVtz3/ccqX7n7jgOWhHUrq7/bn8ZuigMWVmUd/cIpO9f/c
      15 ZLt2o1TBtb7M4jpG3AhhT/j5eNCzTqY8aw8hOBLDfZICwWo0Jw8MmFKuZTACrS9A
      16 tbG8JrsabS8h7JllNkszALefJQUJCLchA9Ss5Pn8EbPWXMh3CxvxvjkCAwEAAQ==
      17 -----END RSA PUBLIC KEY-----
      
    • hosts/NodoInventado:

      01 Address = nodoinventado.org
      02 Subnet = 172.16.167.14/32
      03
      04 -----BEGIN RSA PUBLIC KEY-----
      05 MIICCgKCAgEAyQkyZjmC+NsO2xCLecbLPaD0vSE8+csWtp/gxmHJr37g/FBqsVJ/
      06 uRZaFmSoMemaZavyqUVJZ0+99RQQVu/R4E3aCXOWItuQB6pA/+RiUqfOZXeP7ayy
      07 /xQTrnYDeFmycR4aaASDwqeiqwe098123mkacsdlkmcadioadsjafsFASdfkjSDL
      08 +K7jKUPmYPfsuLh+uYlxSFMi6pAHwTX9TUNLLvwiH2MD6W2nkHNozL+e3vd0QO7b
      09 yAq04ivdGC8PRG9TwwXdJdRrNxWutZNzYHL975JW37RaWJ5Mdf0F22JIR5L8YezT
      10 Qwrsm68slWdfhowEu8qbtgUw4cJp3rkUez5bqbP3jeTX7LkPnwmbrGwSNwE2n0ti
      11 eBgpXpZINdIgXI17wlEEFVweYv6YbQdsgldO7xezm6tsRELklL+0cKKY5xSj6xLJ
      12 PEdBIbWVvKfEJs04xaZtPNi4sgNodNCxYH37ohLiRN90FI8nSFOUHB2Q3VHiirE1
      13 fUsdbDNXUTMNWPlo+M7dxOO4bxhD5jy7jiOn4Dr+vbjGuMNFZHSvzixiX3cymM5f
      14 In1MsFIlp28xdB1h8tUE7vvDwvCaJFF9D1w36nYzpqephjQNxsw8kkLNxoDwcnkN
      15 R9mUund/5vqokBpb9U8ZuOd/RuRsU6v3mUnMctaZPqRy7QBzc3WC7YsCAwEAAQ==
      16 -----END RSA PUBLIC KEY-----
      
  2. NodoInventado agrega el archivo de configuración de NodoNuevo a su directorio /etc/tinc/bal/hosts

Y eso es todo! Ahora NodoFalso y NodoEjemplo tienen una ruta directa por VPN hasta NodoNuevo, sin tener que tocar ninguna configuración.

Referencias

Otros enfoques de VPN en BAL

  • con OpenVPN
  • con SSH

Otras redes comunitarias que usan olsrd sobre Tinc

  • Ninux
  • Freifunk