Tutorial

Como instalar o Tinc e configurar um VPN básico no Ubuntu 18.04

Published on March 5, 2020
Português
Como instalar o Tinc e configurar um VPN básico no Ubuntu 18.04

Introdução

O Tinc é um programa daemon para Rede Virtual Privada (VPN), de código aberto,com recursos úteis como a criptografia, compressão opcional e o roteamento em malha automático que pode, de maneira oportuna, rotear o tráfego da VPN diretamente entre os servidores. Tais recursos diferenciam o tinc de outras soluções para VPN e fazem com que ele seja uma boa escolha para a criação de uma VPN a partir das diversas redes pequenas, geograficamente distribuídas.

Neste tutorial, vamos revisar como usar o tinc para criar uma VPN segura na qual seus servidores podem se comunicar como se estivessem em uma rede local. Também vamos demonstrar como usar o tinc para configurar um túnel seguro em uma rede privada. Vamos usar servidores Ubuntu 18.04, mas as configurações podem ser adaptadas para uso com qualquer outro SO.

Objetivos

Para abranger vários casos de uso, este tutorial define como conectar um nó de cliente à VPN em uma interface de rede privada e outro à uma pública. No entanto, você pode adaptar essa configuração para atender às suas próprias necessidades. Você precisará apenas planejar como vai querer que seus servidores acessem uns aos outros, adaptando os exemplos apresentados neste tutorial às suas próprias necessidades. Se você estiver adaptando esses procedimentos à sua própria configuração, certifique-se de substituir os valores destacados nos exemplos pelos seus próprios valores. Porem, pode ser que você prefira primeiro seguir o tutorial da forma como foi escrito, no intuito de garantir que você entenda os componentes e processos envolvidos, antes de modificar essas instruções.

Para ajudar a deixar as coisas claras, este tutorial irá referir-se aos servidores desta forma:

  • servidor-01: todos os nós da VPN serão conectados a esse computador e a conexão deverá ser mantida para o funcionamento adequado da VPN. Se quiser, servidores adicionais podem ser configurados da mesma maneira para proporcionar redundância.
  • cliente-01: conecta-se ao nó da VPN do server-01, usando sua interface de rede privada.
  • cliente-02: conecta-se ao nó da VPN no servidor-01 por uma interface de rede pública.

Nota: o próprio Tinc não sabe diferenciar os servidores (computadores que hospedam e entregam os serviços da VPN) dos clientes (as máquinas que se conectam à rede privada segura e a utilizam). Porém, pode ser ser útil entender e visualizar como o tinc funciona, pensando nos seus servidores dessa forma.

Apresentamos abaixo, um diagrama da VPN que queremos configurar:

Configuração da VPN Tinc

A caixa azul representa nossa VPN e a rosa representa a rede privada subjacente. Todos os três servidores podem se comunicar na VPN, embora a rede privada, de qualquer forma, fique inacessível para o cliente-02.

Pré-requisitos

Caso queira seguir de maneira exata este, providencie dois servidores Ubuntu 18.04. (servidor-01 e cliente-01) no mesmo datacenter e habilite a conexão em rede privada em cada um. Depois, crie outro servidor Ubuntu 18.04 (cliente-02) em um datacenter separado. Cada servidor deverá ter um usuário administrativo e um firewall configurado com o ufw. Para configurar isso, siga nosso guia de configuração inicial de servidor para o Ubuntu 18.04.

Além disso, mais adiante, neste tutorial, precisaremos transferir alguns arquivos entre cada computador usando o scp. Por isso, você precisará gerar chaves SSH em cada um dos seus servidores, adicionar ambas chaves SSH do cliente-01 e do cliente-02 ao arquivo authorized-keys do servidor-01 e, em seguida, adicionar a chave SSH do servidor-01 a ambos arquivos authorized_keys - do cliente-01 e do cliente-02. Para ajudar na configuração disso tudo, consulte nosso guia sobre Como configurar chaves SSH no Ubuntu 18.04.

Passo 1 — Instalando o Tinc

O Tinc está disponível nos repositórios padrão da ferramenta APT do Ubuntu, o que significa que podemos instalá-lo com apenas alguns comandos.

Caso não tenha feito isso recentemente, execute o seguinte comando em cada servidor para atualizar seus respectivos índices de pacotes:

All servers
  1. sudo apt update

Então, instale o tinc em cada servidor executando o seguinte comando:

All servers
  1. sudo apt install tinc

Com isso, você instalou o tinc em cada um dos seus servidores. No entanto, para colocar sua VPN em funcionamento, você precisará fazer algumas alterações na configuração do tinc em cada máquina. Vamos começar atualizando o servidor-01.

Passo 2 — Configurando o servidor do Tinc

O Tinc exige que cada computador que fizer parte da VPN tenha os três componentes de configuração a seguir:

  • Arquivos de configuração do Tinc: há três arquivos distintos que configuram o daemon do tinc:
    • tinc.conf, que define o netname, o dispositivo de rede no qual a VPN irá executar e outras opções da VPN;
    • tinc-up, um script que ativa o dispositivo de rede definido em tinc.conf após a inicialização do tinc;
    • tinc-down, que desativa o dispositivo de rede sempre que o tinc parar.
  • Pares de chaves públicas/privadas: o Tinc usa pares de chaves públicas/privadas para garantir que apenas os usuários com chaves válidas possam acessar a VPN.
  • Arquivos de configuração de host: cada máquina (ou host) na VPN tem seu próprio arquivo de configuração que contém o endereço IP real do host e a sub-rede onde o tinc a atenderá.

O Tinc usa um netname para distinguir uma VPN da outra. Isso é útil nos casos em que você queira configurar várias VPN. Porém, é recomendável que você use um netname, mesmo se você estiver planejando configurar apenas uma VPN. Você pode dar à sua VPN o nome que quiser, mas, para simplificar, vamos chamar nossa VPN de netname.

No servidor-01, crie a estrutura de diretórios de configuração para a VPN:

server-01
  1. sudo mkdir -p /etc/tinc/netname/hosts

Use seu editor de texto preferido para criar um arquivo tinc.conf. Aqui, usaremos o nano:

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

Adicione as linhas a seguir ao arquivo em branco. Essas linhas configuram um nó do tinc chamado server_01 com uma interface de rede chamada tun0, a qual usará o IPv4:

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

Aviso: note que o valor depois da diretriz Name inclui um sublinhado (_) em vez de um hífen (-). Isso é importante, pois o tinc exige que o valor Name contenha apenas caracteres alfanuméricos ou sublinhados. Se usar um hífen aqui, você encontrará um erro quando tentar iniciar a VPN mais tarde neste guia.

Salve e feche o arquivo após adicionar essas linhas. Se usou o nano, salve e feche o arquivo, pressionando as teclas CTRL+X,Ye, depois ENTER.

Em seguida, crie um arquivo de configuração do host, chamado server_01 no subdiretório hosts. No fim das contas, os nós do cliente usarão este arquivo para se comunicar com o servidor-01:

server-01
  1. sudo nano /etc/tinc/netname/hosts/server_01

Novamente, note que o nome desse arquivo contém um sublinhado, em vez de um hífen. Dessa forma, ele se alinha com a diretiva de Name no arquivo tinc.conf, o que permitirá que o tinc anexe automaticamente a chave RSA pública do servidor a esse arquivo quando a gerarmos mais tarde.

Adicione as linhas a seguir ao arquivo, certificando-se de incluir o endereço IP público do servidor-01:

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

O campo Address especifica como outros nós se conectarão a esse servidor e o campo Subnet especifica qual sub-rede este daemon irá atender. Salve e feche o arquivo.

Em seguida, gere um par de chaves RSA - pública e privada - para esse host, com o seguinte comando:

server-01
  1. sudo tincd -n netname -K4096

Após executar esse comando, você será solicitado a digitar os nomes dos arquivos onde o tinc salvará as chaves RSA pública e 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]:

Pressione ENTER para aceitar os locais padrão em cada prompt; fazer isso dirá ao tinc para armazenar a chave privada em um arquivo chamado rsa_key.priv e anexar a chave pública ao arquivo de configuração de host do server_01.

Em seguida, crie o tinc-up, o script que será executado sempre que a VPN netname for iniciada:

server-01
  1. sudo nano /etc/tinc/netname/tinc-up

Adicione as linhas seguintes:

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

Descrevemos abaixo o que cada uma dessas linhas faz:

  • ip link ...: define o status da interface de rede virtual do tinc como up
  • ip addr ...: adiciona o endereço IP 10.0.0.1 com uma máscara de rede de 32 à interface da rede virtual do tinc, o que fará com que as outras máquinas na VPN vejam o endereço IP do servidor-01 como 10.0.0.1
  • ip route ...: adiciona uma rota (10.0.0.0/24), a qual pode ser alcançada na interface da rede virtual do tinc.

Salve e feche o arquivo após adicionar essas linhas.

Em seguida, crie um script para remover a interface da rede virtual quando sua VPN for interompida:

server-01
  1. sudo nano /etc/tinc/netname/tinc-down

Adicione as linhas seguintes:

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 linhas causam os efeitos opostos aos do script tinc-up:

  • ip route ...: exclui a rota 10.0.0.0/24
  • ip addr ...: exclui o endereço IP 10.0.0.1 da interface da rede virtual do tinc
  • ip link ...: define o status da interface da rede virtual do tinc como down

Salve e feche o arquivo e, em seguida, torne esses dois novos scripts de rede executáveis:

server-01
  1. sudo chmod 755 /etc/tinc/netname/tinc-*

Como passo final na configuração do servidor-01, adicione uma regra de firewall que permitirá o tráfego pela porta 655 - porta padrão do tinc:

server-01
  1. sudo ufw allow 655

O servidor-01 agora está totalmente configurado e você pode prosseguir com a configuração dos nós do seu cliente.

Passo 3 — Configurando os nós do cliente

Ambas as máquinas do seu cliente precisarão de uma configuração ligeiramente diferente da configuração do servidor, embora o processo seja no geral bastante parecido.

Por conta da configuração que estamos almejando neste guia, vamos configurar o cliente-01 e cliente-02 de maneira quase idêntica, com apenas pequenas diferenças entre eles. Assim, muitos dos comandos dados neste passo devem ser executados em ambas as máquinas. Note, entretanto, que se o cliente-01 ou** cliente-02** precisarem de um comando específico ou de uma configuração especial, essas instruções serão exibidas em um bloco de comandos azul ou vermelho, respectivamente.

Replique a estrutura de diretórios que você criou no servidor-01 no cliente-01 e no cliente-02:

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

Depois, crie um arquivo tinc.conf:

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

Adicione as linhas a seguir ao arquivo de ambas as máquinas:

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

Certifique-se de substituir o node_name pelo nome de nó do cliente respectivo. Novamente, certifique-se de que esse nome use um sublinhado (_) em vez de um hífen.

Note que esse arquivo contém uma diretiva ConnectTo apontando para o servidor_01, ao passo que o arquivo tinc.conf do servidor-01 não incluiu essa diretiva. Ao deixar de incluir uma instrução ConnectTo no servidor-01, isso significa que o servidor-01 escutará apenas as conexões de entrada. Isso funcionará para a nossa configuração, uma vez que ela não se conectará a nenhuma outra máquina.

Salve e feche o arquivo.

Em seguida, crie um arquivo de configuração de host no nó de cada cliente. Novamente, certifique-se de que o nome do arquivo seja escrito com um sublinhado em vez de um hífen:

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

Para o cliente-01, adicione esta linha:

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

Para o cliente-02, adicione esta linha:

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

Note que cada cliente tem uma sub-rede diferente que o tinc atenderá. Salve e feche o arquivo.

Em seguida, gere os pares de chaves na máquina de cada cliente:

client-01 & client-02
  1. sudo tincd -n netname -K4096

Novamente, assim como você fez com o servidor-01, quando foi solicitado a selecionar arquivos para armazenar as chaves RSA, pressione ENTER para aceitar as escolhas padrão.

Em seguida, crie o script de inicialização da interface da rede em cada cliente:

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

Para o cliente-01, adicione estas linhas:

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 o cliente-02, adicione o seguinte:

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

Salve e feche cada arquivo.

Em seguida, crie o script de parada da interface da rede em cada cliente:

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

No cliente-01, adicione o seguinte conteúdo ao arquivo em branco:

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

No cliente-02, adicione o seguinte:

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

Salve e feche os arquivos.

Torne os scripts de rede executáveis, usando o comando a seguir na máquina de cada cliente:

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

Por fim, abra a porta 655 em cada cliente:

client-01 & client-02
  1. sudo ufw allow 655

Neste ponto, os nós do cliente estarão quase prontos - mas não totalmente. Eles ainda precisam da chave pública que criamos no servidor-01 no passo anterior para autenticar a conexão com a VPN.

Passo 4 — Distribuindo as chaves

Cada nó que quiser se comunicar diretamente com outro nó deve ter trocado as chaves públicas, as quais ficam dentro dos arquivos de configuração do host. No nosso caso, o servidor-01 precisa trocar chaves públicas com os outros nós.

Troque as chaves entre o servidor-01 e o cliente-01

No cliente-01, copie seu arquivo de configuração de host para o servidor-01. Como tanto o cliente-01 quanto o servidor-01 estão no mesmo datacenter e ambos têm a rede privada habilitada, você pode usar o endereço IP privado do server01 aqui:

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

Em seguida, no servidor-01, copie o arquivo de configuração do host do cliente-01 para o diretório /etc/tinc/netname/hosts/:

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

Na sequência, enquanto ainda estiver no servidor-01, copie seu arquivo de configuração do host para o cliente-01:

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

No cliente-01, copie o arquivo do servidor-01 para o local apropriado:

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

No cliente-01, edite o arquivo de configuração de host do** servidor-01** para que o campo Address seja definido para o endereço IP privado do servidor-01. Dessa forma, o cliente-01 se conectará à VPN através da rede privada:

client-01
  1. sudo nano /etc/tinc/netname/hosts/server_01

Altere a diretiva de Address para que aponte para o endereço IP privado do servidor-01:

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

Salve e saia. Agora, vamos prosseguir com o nó restante, no cliente-02.

Troque as chaves entre o servidor-01 e o cliente-02

No cliente-02, copie seu arquivo de configuração de host para o servidor-01.

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

Na sequência, no servidor-01, copie o arquivo de configuração de host do client_02 para o local adequado:

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

Depois, copie o arquivo de configuração de host do servidor-01 para o cliente-02:

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

No cliente-02, copie o arquivo do servidor-01 para o local apropriado:

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

Presumindo-se que você esteja configurando apenas dois nós de cliente, neste ponto você terá terminado de distribuir as chaves públicas. No entanto, se estiver criando uma VPN maior, agora é uma boa hora para trocar as chaves entre esses outros nós. Lembre-se de que, caso queira que dois nós se comuniquem diretamente entre si (sem um servidor de encaminhamento entre eles), eles precisarão ter trocado seus arquivos de configuração de chaves/hosts e um precisará ter acesso à interface da rede real do outro. Além disso, é aceitável copiar apenas o arquivo de configuração de cada host para todo nó na VPN.

Passo 5 — Testando a configuração

Em cada nó, começando pelo servidor-01, inicie o tinc com o seguinte comando:

All servers
  1. sudo tincd -n netname -D -d3

Esse comando inclui um sinalizador -n, que aponta para o netname de nossa VPN, netname. Isso será útil se você tiver mais de uma VPN configurada e precisar especificar qual deles você deseja iniciar. Ele também inclui o sinalizador -D, que impede o tinc de bifurcar e desconectar, bem como desabilita o mecanismo de reinício automático do tinc. Por fim, ele inclui o sinalizador -d, que diz ao tinc para ser executado no modo de depuração, com um nível de depuração de 3.

Nota: em se tratando do daemon do tinc, um nível de depuração de 3 mostrará cada pedido trocado entre quaisquer dois servidores, incluindo pedidos de autenticação, troca de chaves e atualizações da lista de conexão. Os níveis de depuração mais elevados mostram mais informações acerca do tráfego de rede, mas, por enquanto, estamos preocupados apenas se os nós podem se comunicar entre si, de modo que um nível de 3 será suficiente. Entretanto, em um cenário de produção, você talvez queira mudar para um nível de depuração inferior, de modo a não sobrecarregar os discos com arquivos de registro.

Você pode aprender mais sobre os níveis de depuração do tinc, revisando a documentação oficial.

Após iniciar o daemon em cada nó, você deve ver o resultado com os nomes de cada nó à medida em que se conectam ao servidor-01. Agora, vamos testar a conexão através da VPN.

Numa janela separada, no cliente-02, execute um ping para o endereço IP daVPN do cliente-01. Anteriormente, nós atribuímos o endereço 10.0.0.2:

client-02
  1. ping 10.0.0.2

O ping deverá funcionar corretamente e você deverá ver algum resultado de depuração nas outras janelas sobre a conexão na VPN. Isso indica que o cliente-02 consegue se comunicar pela VPN, através do servidor-01 com o cliente-01. Pressione CTRL+C para parar o ping.

Você também pode usar as interfaces com a VPN para fazer qualquer outra comunicação em rede, como conexões de aplicativo, copiar arquivos e SSH.

Em cada janela de depuração do daemon do tinc, saia do daemon pressionando CTRL+\.

Passo 6 — Configurando o tinc para iniciar na inicialização

Os servidores com Ubuntu usam o systemd como o gerenciador de sistema padrão para controlar os processos de inicialização e execução. Por conta disso, podemos habilitar a VPN netname para iniciar automaticamente na inicialização com um único comando systemctl.

Execute o comando a seguir em cada nó para configurar a VPN do tinc para iniciar sempre que a máquina for inicializada:

All servers
  1. sudo systemctl enable tinc@netname

O tinc está configurado para iniciar na inicialização de cada uma das suas máquinas e você pode controlar isso com o comando systemctl. Caso queira iniciá-lo agora, execute o seguinte comando em cada um dos seus nós:

All servers
  1. sudo systemctl start tinc@netname

Nota: se tiver várias VPNs, habilite ou inicie cada um deles de uma vez, desta forma:

All servers
  1. sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n

Com isso, sua VPN do tinc estará totalmente configurada e em funcionamento em cada um dos seus nós.

Conclusão

Agora que você concluiu este tutorial, já deve ter uma boa base para criar sua própria VPN para atender às suas necessidades. O tinc é bastante flexível e qualquer nó pode ser configurado para se conectar a qualquer outro nó (que ele possa acessar através de rede), de modo que ele pode atuar como uma malha de VPN, sem depender de um nó específico.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar

Manager, Developer Education

Technical Writer @ DigitalOcean



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


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!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel