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.
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:
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:
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.
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.
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:
- sudo apt update
Então, instale o tinc em cada servidor executando o seguinte comando:
- 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.
O Tinc exige que cada computador que fizer parte da VPN tenha os três componentes de configuração a seguir:
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.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:
- sudo mkdir -p /etc/tinc/netname/hosts
Use seu editor de texto preferido para criar um arquivo tinc.conf
. Aqui, usaremos o nano
:
- 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:
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
,Y
e, 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:
- 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:
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:
- 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:
- sudo nano /etc/tinc/netname/tinc-up
Adicione as linhas seguintes:
#!/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:
- sudo nano /etc/tinc/netname/tinc-down
Adicione as linhas seguintes:
#!/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 tincip 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:
- 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:
- 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.
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:
- sudo mkdir -p /etc/tinc/netname/hosts
Depois, crie um arquivo tinc.conf
:
- sudo nano /etc/tinc/netname/tinc.conf
Adicione as linhas a seguir ao arquivo de ambas as máquinas:
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:
- sudo nano /etc/tinc/netname/hosts/node_name
Para o cliente-01, adicione esta linha:
Subnet = 10.0.0.2/32
Para o cliente-02, adicione esta linha:
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:
- 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:
- sudo nano /etc/tinc/netname/tinc-up
Para o cliente-01, adicione estas linhas:
#!/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:
#!/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:
- sudo nano /etc/tinc/netname/tinc-down
No cliente-01, adicione o seguinte conteúdo ao arquivo em branco:
#!/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:
#!/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:
- sudo chmod 755 /etc/tinc/netname/tinc-*
Por fim, abra a porta 655
em cada cliente:
- 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.
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.
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:
- 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/
:
- 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:
- 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:
- 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:
- 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:
Address = server-01_private_IP
Subnet = 10.0.0.1/32
Salve e saia. Agora, vamos prosseguir com o nó restante, no cliente-02.
No cliente-02, copie seu arquivo de configuração de host para o servidor-01.
- 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:
- 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:
- 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:
- 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.
Em cada nó, começando pelo servidor-01, inicie o tinc com o seguinte comando:
- 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
:
- 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+\
.
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:
- 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:
- sudo systemctl start tinc@netname
Nota: se tiver várias VPNs, habilite ou inicie cada um deles de uma vez, desta forma:
- 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.
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.
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!