Tinc

Fonte: wirelesspt.net

Este artigo visa em descrever de forma minimalista o processo de instalação do serviço de vpn com tinc em ambiente linux exclusivamente para routers que utilizem uma distribuição de firmware baseada em openwrt que utilize uci como por exemplo; mvwrt ou openwrt. Versões de firmware mais recentes do gargoyle, freifunk e outros do género que incluam suporte uci poderão também seguir este artigo e outras que não utilizem [suportem uci poderão utiliza-lo como referência. Recomenda-se o uso de uci em detrimento da linha de comandos ou editor de texto como vim sempre que possível e ou existente.

Preparação

No processo de configuração do tinc é necessário proceder a uma prepararão prévia para o seu funcionamento e criar uma estrutura de directórios.

Serão necessários os pacotes adicionais kmod-tun, liblzo e libopenssl para o funcionamento do tinc e que serão instalados adicionalmente de forma automática se não fizerem previamente parte do sistema.

Instalando o tinc

opkg update
opkg install tinc
insmod kmod-tun

A instalação do tinc depende da livraria libopenssl que tem um tamanho de pelo menos 615K e poderá impedir a instalação do resto do software. O ficheiro kmod-tun tem 9.3K e o liblzo 32K.

Directórios

Nota: na criação de directórios o nome NETNAME ou neste exemplo vpn é um nome á escolha que deverá identificar o serviço tinc em questão.

mkdir -p /etc/tinc/vpn/hosts/
touch /etc/tinc/vpn/tinc.conf
cd /etc/tinc/vpn/

Certificados ssl

A criação de certificados de digitais é indispensável e devemos proceder da seguinte forma:

 cd /etc/tinc/vpn/
 tincd -n vpn -K 

Generating 2048 bits keys:
.......+++ p
.....+++ q
Done.
Please enter a file to save private RSA key to [/etc/tinc/vpn/rsa_key.priv]: 
Please enter a file to save public RSA key to [/etc/tinc/vpn/rsa_key.pub]: 

Ou para gerar um certificado mais forte e seguro:

 tincd -n vpn -K --generate-keys=4096

Ver: certificados de criptografia para mais opções.

De seguida devemos criar um ficheiro com uma identificação dos routers que se vão servir do tinc e inserir ou copiar a chave pública rsa_key.pub para lá.

A chave rsa_key.priv deverá ficar sempre em nossa posse e nunca ser transmitida e ninguém. A chave rsa_key.pub é a que damos a quem vai estabelecer ligação á nossa chave privada. Por outras palavras isto significa que teremos de receber uma chave rsa_key.pub do outro router ou pessoa e coloca-la em /etc/tinc/vpn/ no nosso equipamento.

Podemos simplesmente copiar a chave a partir de uma página ou ficheiro ou fazer o download da mesma a partir de um servidor, página, ftp, sshd, etc. Exemplos:

A partir de uma página:

wget -P /etc/tinc/vpn/hosts/ http://wirelesspt.net/arquivos/public_keys/cmsv/tinc_rsa_key.pub
mv /etc/tinc/vpn/hosts/tinc_rsa_key.pub /etc/tinc/vpn/hosts/router2

Buscar a chave pública do router2 a partir do router1 com de scp

                     Router2                         router1
scp root@router2-ip:/etc/tinc/router2/rsa_key.pub   /etc/tinc/router1/hosts/router2

O resultado será semelhante ao seguinte e poderá ser visto digitando: cat hosts/router2

-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEAwnEr+XfWj12nDKDSkEocMwAhi0LmUzV/JHm3orjoVkAFZemREdbe
bKEiBLQ9NiS5cx0AHwoNZhEVRIcqBsoq0+rl3uOWiJ7hFqS+TTHcD3Vnz2usFj/b
jhqAZlpciAq/fhQMx0kQjM5v8m9yVtY2aCZ9ZFs947TktjHxePYH/NWg+e3QtlxE
1FfsfNSaHDb1PuCBfj1lSqkxrzzabez1ZDMI1iZ+L0rM8bjYQUSaWPvRnhhz7ukT
+p7OouZ56P7h/bKXyi0tuYlG5DyjReA2dBDfEFnbIRUGTLTrg4aFlh4cNCfs6yIp
AViYkH27WhZLgUZzPfvOAbgZZa59qFr5FjJZBVBcLxR3qWCd/Cu31vE76r1Wuh4R
5x+pOXMydVxsQtd9HWGqbCv1tOsdXT80sPlhNBMcu6fZQ6/1UmBMqcUZ7G7vjynt
4dqEFgN3Y6txSgDdcIKns9/xgS/1LntM2KllTh3J7/aaytL1i7TF9UiNIIpNYE7t
UOK3ivex5CvauJDrODipLDUaTiWr6cquYoauJ3mE0vtgdKCwFJ4fiNCbJlpa4Y8z
w+Pn4+o2r1xuQjqPxtB7hO/Y7ERUh4litr9TL32Oi2Ms2A7vCjMbiuSZivEpubJA
usb7HMCh2doc0rL5Jxd8Xu0ZUuZAStuHLCwyjTXODyb+dlWQewSOLccCAwEAAQ==
-----END RSA PUBLIC KEY-----

Nota: O outro router ou pessoa terá de proceder aos menos passos de geração e troca de chave pública. A chave pública do router1 passa para o router2 e vice versa.

Firewall

Importante: Antes de procedermos à configuração da abertura de portas na firewall; devemos verificar o numero de regras já existentes na firewall para evitar alterar alguma delas e prosseguir com um numero acima dos já existentes:

uci show firewall |grep =rule 

Criar regra via uci:

uci add firewall rule 
uci set firewall.@rule[5].name=tinc
uci set firewall.@rule[5].src=wan 
uci set firewall.@rule[5].target=ACCEPT 
uci set firewall.@rule[5].proto=tcp,udp  
uci set firewall.@rule[5].dest_port=655
uci commit firewall 

Reiniciar a firewall pode ser feito com reboot ou restart:

/etc/init.d/firewall restart

Nota: será necessário encaminhar e abrir a porta 655 no router que faz de gateway para a Internet onde ligamos este equipamento, caso exista um.

Configuração

Após a instalação o ficheiro de configuração principal do tinc no seguinte local e poderá ser visualizado e editado com um editor de texto como o vim onde se deve configurar os parâmetros que desejamos utilizar na configuração da vpn.

Configurando o router local via uci:

uci rename tinc.NETNAME=vpn

uci set tinc.vpn.enabled=1
uci set tinc.vpn.generate_keys=0
uci set tinc.vpn.key_size=2048
uci set tinc.vpn.AddressFamily=any
uci set tinc.vpn.ConnectTo=router2
uci set tinc.vpn.DirectOnly=0
uci set tinc.vpn.Forwarding=internal
uci set tinc.vpn.Hostnames=0
uci set tinc.vpn.IffOneQueue=0
uci set tinc.vpn.Interface=tun

uci set tinc.vpn.Mode=router
uci set tinc.vpn.Name=router1
uci set tinc.vpn.PingInterval=60
uci set tinc.vpn.PingTimeout=5
uci set tinc.vpn.PriorityInheritance=0
uci set tinc.vpn.PrivateKeyFile=/etc/tinc/vpn/rsa_key.priv
uci set tinc.vpn.ProcessPriority=normal
uci set tinc.vpn.ReplayWindow=16
uci set tinc.vpn.StrictSubnets=0
uci set tinc.vpn.TunnelServer=0

#uci set tinc.vpn.device=/dev/net/tun
#uci set tinc.vpn.log=/tmp/log/tinc.vpn.log
#uci set tinc.vpn.debug=3
#uci set tinc.vpn.BindToAddress=127.0.0.1
#uci set tinc.vpn.BindToInterface=lo
#uci set tinc.vpn.GraphDumpFile=/tmp/log/tinc.vpn.dot
#uci set tinc.vpn.KeyExpire=3600
#uci set tinc.vpn.MACExpire=600
#uci set tinc.vpn.MaxTimeout=900
#uci set tinc.vpn.UDPRcvBuf=x
#uci set tinc.vpn.UDPSndBuf=x

uci rename tinc.NODENAME=router2

uci set tinc.router2=tinc-host
uci set tinc.router2.enabled=1
uci set tinc.router2.net=vpn
uci set tinc.router2.Address=router2.wirelesspt.net
uci set tinc.router2.Cipher=blowfish
uci set tinc.router2.ClampMSS=yes
uci set tinc.router2.Compression=1
uci set tinc.router2.Digest=sha256
uci set tinc.router2.IndirectData=0
uci set tinc.router2.MACLength=4
uci set tinc.router2.PMTU=1514
uci set tinc.router2.PMTUDiscovery=yes
uci set tinc.router2.Port=655
uci set tinc.router2.Subnet=192.168.1.0/24
uci set tinc.vpn.debug=3
 
uci commit tinc

Os parâmetros a negrito deverão ser especificados de acordo com a rede o utilizador em questão.

Ficheiro de configuração com os parâmetros uci expostos em cima.

vi /etc/config/tinc 
config tinc-net 'vpn'
       option enabled '1'
       option generate_keys '0'
       option key_size '2048'
       option AddressFamily 'any'
       option DirectOnly '0'
       option Forwarding 'internal'
       option Hostnames '0'
       option IffOneQueue '0'
       option Interface 'tun'
       option Mode 'router'
       option Name 'router1'
       option PingInterval '60'
       option PingTimeout '5'
       option PriorityInheritance '0'
       option PrivateKeyFile '/etc/tinc/vpn/rsa_key.priv'
       option ProcessPriority 'normal'
       option ReplayWindow '16'
       option StrictSubnets '0'
       option TunnelServer '0'
       option ConnectTo 'router2'
       option debug '3'

config tinc-host 'router2'
       option enabled '1'
       option net 'vpn'
       option Address 'router2.wirelesspt.net'
       option Cipher 'blowfish'
       option ClampMSS 'yes'
       option Compression '1'
       option Digest 'sha256'
       option IndirectData '0'
       option MACLength '4'
       option PMTU '1514'
       option PMTUDiscovery 'yes'
       option Port '655'
       option Subnet '192.168.1.0/24'


Ficheiro de configuração original do tinc

config tinc-net NETNAME
	option enabled 0

	## Daemon Configuration	(cmd arguments)
	#option generate_keys 0
	#option key_size 2048
	#option log /tmp/log/tinc.NETNAME.log
	#option debug 3

	## Server Configuration (tinc.conf)
	#option AddressFamily any
	#option BindToAddress 127.0.0.1
	#option BindToInterface lo
	#list ConnectTo peer1
	#option DirectOnly 0
	#option Forwarding internal
	#option GraphDumpFile /tmp/log/tinc.NETNAME.dot
	#option Hostnames 0
	#option IffOneQueue 0

	#option Interface NETNAME
	#option KeyExpire 3600
	#option MACExpire 600
	#option MaxTimeout 900
	#option Mode router
	option Name NODENAME
	#option PingInterval 60
	#option PingTimeout 5
	#option PriorityInheritance 0
	#option PrivateKeyFile /etc/tinc/NETNAME/rsa_key.priv
	#option ProcessPriority normal
	#option ReplayWindow 16
	#option StrictSubnets 0
	#option TunnelServer 0
	#option UDPRcvBuf x
	#option UDPSndBuf x
 
config tinc-host NODENAME
	option enabled 0

	option net NETNAME
	#list Address example.com
	#option Cipher blowfish
	#option ClampMSS yes
	#option Compression 0
	#option Digest sha1
	#option IndirectData 0
	#option MACLength 4
	#option PMTU 1514
	#option PMTUDiscovery yes
	#option Port 655
	#option Subnet 192.168.1.0/24
  • Log: Nome to registo de log
  • BindToAddress: Endereço ip a utilizar. Se nenhum for especificado; o serviço fica activo em todos.
  • BindToInterface: Interface de rede a utilizar. Se nenhum for especificado; o serviço fica activo em todos
  • GraphDumpFile: Nome to registo de log de dump
  • Interface: Interface de rede correspondente ao interface virtual criado pelo sistema operativo.
  • UDPRcvBuf: Recomenda-se que seja gerido pelo sistema operativo
  • UDPSndBuf: Recomenda-se que seja gerido pelo sistema operativo
  • Address: Endreco ip da ligação à internet

Modo de funcionamento

O tinc possibilita 3 tipos de funcionando: router, switch ou hub. Neste artigo o exemplo usado é:

uci set tinc.vpn.Mode=router

ou

option Mode 'router'

Neste modo de sub-rede as variáveis nos ficheiros de configuração do router host vão ser utilizadas para formar uma tabela de encaminhamento e apenas pacotes unicast dos protocolos ipv4 e ipv6 são suportados. Neste modo a configuração dhcp do tinc deve ser estática em todos os router da vpn.

Neste modo, os endereços mac dos pacotes da vpn serão usados para criar uma tabela de roteamento dinâmico como um switch físico faz na rede. Pacotes de cada protocolo que transitam pela rede (unicast, multicast e broadcast) são compatíveis com este modo ao custo de transmissão frequente requisições arp e actualizações da tabela de roteamento. Este modo é útil se optarmos por construir uma ponte segmentos de rede. Neste modo devemos utilizar o serviço de dhcp automaticamente para gerir a atribuição de ips na vpn.

Este modo é basicamente o mesmo que o modo de switch, mas cada pacote será transmitido para os outros serviçoss sem se gerir nenhuma tabela de roteamento.

Activando o tinc

Os seguintes parâmetros vão activar e iniciar o serviço no router de forma efectiva.

/etc/init.d/tinc enable
/etc/init.d/tinc start

Para confirmar que de facto o tinc se encontra a funcionar e temos a porta aberta na firewall basta digitar os seguintes parâmetros que produzirão um resultado semelhante ao que podemos ver:

lsmod | grep tun

tun                    10640  2
pidof tincd

1890
netstat -napt | grep tincd

tcp        0      0 0.0.0.0:655             0.0.0.0:*               LISTEN      1710/tincd
logread | egrep  "tun|tinc"

mvwrt kern.info kernel: [  119.510000] tun: Universal TUN/TAP device driver, 1.6
mvwrt kern.info kernel: [  119.520000] tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
mvwrt daemon.notice tinc.vpn[1710]: tincd 1.0.21 (Feb 10 2014 23:44:53) starting, debug level 0
mvwrt daemon.info tinc.vpn[1710]: /dev/net/tun is a Linux tun/tap device (tun mode)
mvwrt daemon.notice tinc.vpn[1710]: Ready

Ver ainda

Links externos

Editor

--Cmsv (discussão) 09h04min de 17 de julho de 2014 (EDT)