Base de Conhecimento
Como instalar o Tinc e configurar uma VPN básica no Ubuntu 18.04 Imprimir este Artigo
Introdução
O Tinc é um daemon de rede virtual privada (VPN) de código-fonte aberto com recursos úteis como criptografia, compactação opcional e roteamento de malha automático que podem rotear oportunisticamente o tráfego da VPN diretamente entre os servidores. Esses recursos diferenciam o tinc de outras soluções de VPN e o tornam uma boa opção para criar uma VPN a partir de muitas redes pequenas e geograficamente distribuídas.
Neste tutorial, veremos como usar o tinc para criar uma VPN segura na qual seus servidores possam se comunicar como se estivessem em uma rede local. Também demonstraremos como usar o tinc para configurar um túnel seguro em uma rede privada. Usaremos servidores Ubuntu 18.04, mas as configurações podem ser adaptadas para uso com qualquer outro sistema operacional.
Metas
Para cobrir vários casos de uso, este tutorial descreve como conectar um nó cliente à VPN por uma interface de rede privada e outro por uma pública. No entanto, você pode adaptar essa configuração para atender às suas próprias necessidades. Você só precisa planejar como deseja que seus servidores acessem um ao outro e adaptar os exemplos apresentados neste tutorial às suas próprias necessidades. Se você estiver adaptando isso à sua própria configuração, substitua os valores destacados nos exemplos por seus próprios valores. Pode ser do seu interesse, no entanto, seguir primeiro o tutorial, como está escrito, para garantir que você entenda os componentes e processos envolvidos antes de modificar essas instruções.
Para ajudar a manter as coisas claras, este tutorial fará referência a servidores como este:
- server-01 : Todos os nós da VPN se conectam a esta máquina e a conexão deve ser mantida para a funcionalidade VPN adequada. Servidores adicionais podem ser configurados da mesma maneira que este para fornecer redundância, se desejado
- client-01 : conecta-se ao nó da VPN server-01 usando sua interface de rede privada
- client-02 : conecta-se ao nó VPN server-01 pela interface de rede pública
Nota : O próprio Tinc não diferencia entre servidores (máquinas que hospedam e fornecem serviços VPN) e clientes (as máquinas que se conectam e usam a rede privada segura), mas pode ser útil entender e visualizar como o tinc funciona, pensando em seus servidores assim.
Aqui está um diagrama da VPN que queremos configurar:
A caixa azul representa nossa VPN e o rosa representa a rede privada subjacente. Todos os três servidores podem se comunicar na VPN, mesmo que a rede privada seja inacessível ao cliente-02 .
Pré-requisitos
Se você deseja seguir exatamente este tutorial, provisione dois servidores Ubuntu 18.04 ( server-01 e client-01 ) no mesmo datacenter e ative a rede privada em cada um. Em seguida, crie outro servidor Ubuntu 18.04 ( client-02 ) em um datacenter separado. Cada servidor deve ter um usuário administrativo e um firewall configurado com ufw
. Para configurar isso, siga nosso guia inicial de configuração do servidor para o Ubuntu 18.04 .
Além disso, mais adiante neste tutorial, precisaremos transferir alguns arquivos entre cada máquina usando scp
. Devido a isso, você precisa gerar chaves SSH em cada um dos servidores, adicione ambos cliente-01 e cliente-02 ‘chaves SSH s para servidor-01 ‘s authorized_keys
arquivo, e depois adicionar servidor-01 ‘s chaves SSH para ambos cliente-01 e cliente-02 ‘s authorized_keys
arquivos. Para obter ajuda na configuração, consulte nosso guia sobre Como configurar chaves SSH no Ubuntu 18.04 .
Etapa 1 - Instalando o Tinc
O Tinc está disponível nos repositórios padrão do Ubuntu APT, o que significa que podemos instalá-lo com apenas alguns comandos.
Se você não fez isso recentemente, execute o seguinte comando em cada servidor para atualizar seus respectivos índices de pacotes:
- sudo apt update
Em seguida, instale o tinc em cada servidor executando o seguinte comando:
- sudo apt install tinc
Com isso, você instalou o tinc em cada um de seus servidores. No entanto, você precisará fazer algumas alterações na configuração do tinc em cada máquina para colocar sua VPN em funcionamento. Vamos começar com a atualização do server-01 .
Etapa 2 - Configurando o Tinc Server
O Tinc exige que todas as máquinas que farão parte da VPN tenham os três componentes de configuração a seguir:
- Arquivos de configuração do Tinc : Existem três arquivos distintos que configuram o daemon do tinc:
tinc.conf
, que define o nome da rede, o dispositivo de rede no qual a VPN será executada e outras opções da VPN;tinc-up
, um script que ativa o dispositivo de rede definidotinc.conf
após o início do tinc;tinc-down
, que desativa o dispositivo de rede sempre que o tinc pára.
- Pares de chaves públicas / privadas : o Tinc usa pares de chaves públicas / privadas para garantir que apenas usuários com chaves válidas possam acessar a VPN.
- Arquivos de configuração do 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 o servirá.
Tinc usa um nome de rede para distinguir uma VPN de tinc de outra. Isso é útil nos casos em que você deseja configurar várias VPNs, mas é recomendável que você use um nome de rede, mesmo que esteja pensando apenas em configurar uma VPN. Você pode dar à sua VPN o nome de rede que quiser, mas, por simplicidade, chamaremos nossa VPN netname
.
No server-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 tinc.conf
arquivo. Aqui, usaremos nano
:
- sudo nano /etc/tinc/netname/tinc.conf
Adicione as seguintes linhas ao arquivo vazio. Eles configuram um nó tinc nomeado server_01
com uma interface de rede chamada tun0
que usará o IPv4:
Name = server_01
AddressFamily = ipv4
Interface = tun0
Aviso: Observe como o valor após a Name
diretiva inclui um sublinhado ( _
) em vez de um hífen ( -
). Isso é importante, pois o tinc exige que o Name
valor contenha apenas caracteres alfanuméricos ou sublinhados. Se você usar um hífen aqui, encontrará um erro ao tentar iniciar a VPN posteriormente neste guia.
Salve e feche o arquivo depois de adicionar essas linhas. Se você usou nano
, fazê-lo pressionando CTRL+X
, Y
e, em seguida ENTER
.
Em seguida, crie um arquivo de configuração do host nomeado server_01
no hosts
subdiretório. Por fim, os nós do cliente usarão esse arquivo para se comunicar com o server-01 :
- sudo nano /etc/tinc/netname/hosts/server_01
Novamente, observe que o nome desse arquivo contém um sublinhado em vez de um hífen. Dessa forma, ele se alinha à Name
diretiva no tinc.conf
arquivo, que permitirá que o tinc acrescente automaticamente a chave pública RSA do servidor a esse arquivo quando gerarmos mais tarde.
Adicione as seguintes linhas ao arquivo, certificando-se de incluir o endereço IP público do server-01 :
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32
O Address
campo especifica como outros nós se conectarão a este servidor e Subnet
especifica qual sub-rede esse daemon servirá. Salve e feche o arquivo.
Em seguida, gere um par de chaves RSA públicas e privadas para este host com o seguinte comando:
- sudo tincd -n netname -K4096
Após executar este comando, você será solicitado a digitar os nomes dos arquivos em que o tinc salvará as chaves RSA públicas e privadas:
. . .
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; isso fará com que o tinc armazene a chave privada em um arquivo nomeado rsa_key.priv
e adicione a chave pública ao server_01
arquivo de configuração do host.
Em seguida, crie tinc-up
o script que será executado sempre que a netname
VPN for iniciada:
- sudo nano /etc/tinc/netname/tinc-up
Adicione as seguintes linhas:
#!/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
Aqui está o que cada uma dessas linhas faz:
ip link …
: define o status da interface de rede virtual do tinc comoup
ip addr …
: adiciona o endereço IP10.0.0.1
com uma máscara de32
rede à interface de rede virtual do tinc, o que fará com que as outras máquinas na VPN vejam o endereço IP do servidor-01 como10.0.0.1
ip route …
: adiciona uma rota (10.0.0.0/24
) que pode ser acessada na interface de rede virtual do tinc
Salve e feche o arquivo depois de adicionar essas linhas.
Em seguida, crie um script para remover a interface de rede virtual quando sua VPN estiver parada:
- sudo nano /etc/tinc/netname/tinc-down
Adicione as seguintes linhas:
#!/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
Essas linhas têm efeitos opostos aos do tinc-up
script:
ip route …
: exclui a10.0.0.0/24
rotaip addr …
: exclui o endereço IP10.0.0.1
da interface de rede virtual do tincip link …
: define o status da interface de rede virtual do tinc comodown
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 etapa final da configuração do server-01 , adicione uma regra de firewall que permita o tráfego pela porta 655
, a porta padrão do tinc:
- sudo ufw allow 655
server-01 agora está totalmente configurado e você pode prosseguir para configurar os nós do cliente.
Etapa 3 - Configurando os nós do cliente
As duas máquinas clientes exigirão uma configuração ligeiramente diferente da do servidor, embora o processo geralmente seja bastante semelhante.
Devido à configuração que pretendemos neste guia, configuraremos o cliente-01 e o cliente-02 quase de forma idêntica, com apenas algumas pequenas diferenças entre eles. Portanto, muitos dos comandos dados nesta etapa devem ser executados nas duas máquinas. Observe, porém, que se o cliente-01 ou o cliente-02 exigir um comando específico ou uma configuração especial, essas instruções serão mostradas em um bloco de comandos em azul ou vermelho, respectivamente.
No cliente 01 e no cliente 02 , replique a estrutura de diretórios criada no servidor 01 :
- sudo mkdir -p /etc/tinc/netname/hosts
Em seguida, crie um tinc.conf
arquivo:
- sudo nano /etc/tinc/netname/tinc.conf
Adicione as seguintes linhas ao arquivo nas duas máquinas:
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01
Substitua node_name
pelo nome do respectivo nó do cliente. Novamente, verifique se esse nome usa sublinhado ( _
) em vez de hífen.
Observe que este arquivo contém uma ConnectTo
diretiva apontando para server_01
, enquanto o arquivo do server-01tinc.conf
não incluiu essa diretiva. Ao não incluir uma ConnectTo
declaração no servidor-01 , significa que o servidor-01 apenas escutará as conexões de entrada. Isso funciona para a nossa configuração, pois não se conecta a nenhuma outra máquina.
Salve e feche o arquivo.
Em seguida, crie um arquivo de configuração do host em cada nó do cliente. Novamente, verifique se o nome do arquivo está escrito com um sublinhado em vez de um hífen:
- sudo nano /etc/tinc/netname/hosts/node_name
Para client-01 , adicione esta linha:
Subnet = 10.0.0.2/32
Para o cliente-02 , adicione esta linha:
Subnet = 10.0.0.3/32
Observe que cada cliente tem uma sub-rede diferente que o tinc servirá. Salve e feche o arquivo.
Em seguida, gere os pares de chaves em cada máquina cliente:
- sudo tincd -n netname -K4096
Novamente, como você fez com o server-01, quando solicitado a selecionar arquivos para armazenar as teclas RSA, pressione ENTER
para aceitar as opções padrão.
Em seguida, crie o script inicial da interface de rede em cada cliente:
- sudo nano /etc/tinc/netname/tinc-up
Para client-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 de rede em cada cliente:
- sudo nano /etc/tinc/netname/tinc-down
No cliente-01 , adicione o seguinte conteúdo ao arquivo vazio:
#!/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 executando o seguinte comando em cada máquina cliente :
- sudo chmod 755 /etc/tinc/netname/tinc-*
Por fim, abra a porta 655
em cada cliente :
- sudo ufw allow 655
Nesse ponto, os nós do cliente estão quase, embora não totalmente, configurados. Eles ainda precisam da chave pública que criamos no servidor-01 na etapa anterior para autenticar a conexão com a VPN.
Etapa 4 - Distribuindo as chaves
Cada nó que deseja se comunicar diretamente com outro nó deve ter trocado chaves públicas, que estão dentro dos arquivos de configuração do host. No nosso caso, o server-01 precisa trocar chaves públicas com os outros nós.
Trocar chaves entre server-01 e client-01
No cliente-01 , copie seu arquivo de configuração do host para o servidor-01 . Como o cliente-01 e o servidor-01 estão no mesmo datacenter e ambos têm a rede privada ativada, 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 server-01 , copie o client-01
arquivo de configuração do host no diretório:/etc/tinc/netname/hosts/
- sudo cp /tmp/client_01 /etc/tinc/netname/hosts/
Em seguida, enquanto ainda estiver no server-01 , copie seu arquivo de configuração do host para o client-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 Address
campo seja definido como 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
Alterar a Address
directiva para apontar para servidor-01 é privado endereço IP:
Address = server-01_private_IP
Subnet = 10.0.0.1/32
Salve e saia. Agora vamos para o nó restante, client-02 .
Trocar chaves entre server-01 e client-02
No cliente-02 , copie seu arquivo de configuração do host para o servidor-01 :
- scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp
Em seguida, no server-01 , copie o client_02
arquivo de configuração do host no local apropriado:
- sudo cp /tmp/client_02 /etc/tinc/netname/hosts/
Em seguida, copie o arquivo de configuração 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/
Supondo que você esteja configurando apenas dois nós clientes, você terminou de distribuir chaves públicas. Se, no entanto, você estiver criando uma VPN maior, agora é um bom momento para trocar as chaves entre esses outros nós. Lembre-se de que, se você deseja que dois nós se comuniquem diretamente entre si (sem um servidor de encaminhamento entre eles), eles precisam ter trocado seus arquivos de configuração de chaves / hosts e precisam poder acessar as interfaces de rede reais um do outro. Além disso, é bom copiar apenas o arquivo de configuração de cada host para cada nó na VPN.
Etapa 5 - Testando a configuração
Em cada nó, começando com server-01 , inicie o tinc com o seguinte comando:
- sudo tincd -n netname -D -d3
Este comando inclui a -n
bandeira, que aponta para o nome da rede da nossa VPN netname
,. Isso é útil se você tiver mais de uma VPN configurada e precisar especificar qual deseja iniciar. Ele também inclui a -D
bandeira, que evita que o tinc bifurque e desconecte, além de desativar o mecanismo de reinício automático do tinc. Por fim, inclui a -d
flag, que informa ao tinc para executar no modo de depuração, com um nível de depuração de 3
.
Nota: Quando se trata do daemon tinc, um nível de depuração 3
mostrará todas as solicitações trocadas entre dois servidores, incluindo solicitações de autenticação, trocas de chaves e atualizações da lista de conexões. Níveis mais altos de depuração mostram mais informações sobre o tráfego de rede, mas, por enquanto, estamos preocupados apenas com a possibilidade de os nós se comunicarem entre si, portanto, um nível 3
será suficiente. No entanto, em um cenário de produção, você deseja alterar para um nível de depuração mais baixo para não preencher discos com arquivos de log.
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ê deverá ver a saída com os nomes de cada nó conforme eles se conectam ao server-01 . Agora vamos testar a conexão pela VPN.
Em uma janela separada, no cliente-02 , execute o ping no endereço IP da VPN do cliente-01 . Atribuímos isso 10.0.0.2
antes:
- ping 10.0.0.2
O ping deve funcionar corretamente e você deve ver algumas saídas de depuração nas outras janelas sobre a conexão na VPN. Isso indica que o cliente-02 é capaz de se comunicar pela VPN através do servidor-01 para o cliente-01 . Pressione CTRL+C
para sair do ping.
Você também pode usar as interfaces VPN para realizar qualquer outra comunicação de rede, como conexões de aplicativos, cópia de arquivos e SSH.
Em cada janela de depuração do daemon tinc, feche o daemon pressionando CTRL+\
.
Etapa 6 - Configurando o Tinc para iniciar na inicialização
Os servidores Ubuntu usam systemd
como o gerenciador de sistema padrão para controlar os processos de inicialização e execução. Por esse motivo, podemos ativar a netname
VPN para iniciar automaticamente na inicialização com um único systemctl
comando.
Execute o seguinte comando em cada nó para configurar a VPN tinc para iniciar sempre que as máquinas inicializarem:
- sudo systemctl enable tinc@netname
O Tinc está configurado para iniciar na inicialização em cada uma de suas máquinas e você pode controlá-lo com o systemctl
comando Se você deseja iniciá-lo agora, execute o seguinte comando em cada um de seus nós:
- sudo systemctl start tinc@netname
Nota : Se você tiver várias VPNs, ative ou inicie cada uma delas de uma vez, assim:
- sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n
Com isso, sua VPN totalmente configurada e em execução em cada um de seus nós.
Conclusão
Agora que você passou por este tutorial, deve ter uma boa base para criar sua VPN para atender às suas necessidades. O Tinc é muito flexível e qualquer nó pode ser configurado para conectar-se a qualquer outro nó (que ele possa acessar pela rede), para que possa atuar como uma VPN de malha sem depender de um nó individual.