Como instalar e configurar o servidor OpenVPN no Ubuntu 22.04
Uma Rede Privada Virtual (VPN) permite-lhe aceder à Internet mascarando a sua localização, permitindo-lhe aceder à Internet com segurança em redes não confiáveis e contornar restrições geográficas e censura. OpenVPN é uma solução VPN de segurança de camada de transporte (TLS) de código aberto para atingir esse objetivo.
Em nosso tutorial, iremos instalar o OpenVPN em um servidor Ubuntu 22.04, configurá-lo para ser acessível a partir de uma máquina cliente e criar uma conexão VPN entre eles para redirecionar todo o tráfego do cliente através do servidor OpenVPN.
Pré-requisitos
Um servidor executando Ubuntu 22.04 com suporte para conexões IPv4 e IPv6. Iremos nos referir a isso como servidor OpenVPN. O Firewall descomplicado (UFW) está habilitado e em execução nele.
Um servidor executando Ubuntu 22.04 com suporte para conexões IPv4 e IPv6. Iremos configurá-lo como uma Autoridade de Certificação (CA) privada, à qual nos referiremos como servidor CA.
Um usuário não root com privilégios sudo no OpenVPN e no servidor CA.
Uma máquina cliente para se conectar ao servidor OpenVPN. Você pode usar seu dispositivo local como máquina cliente. OpenVPN possui clientes para Windows, Linux, macOS, Android e iOS. Você pode usar qualquer um deles para se conectar. Usaremos um PC cliente Ubuntu 22.04 para o tutorial.
Tudo é atualizado no OpenVPN e no servidor CA.
$ sudo apt update && sudo apt upgrade
Passo 1 – Configurando o servidor CA
Uma Autoridade Certificadora (CA) é uma entidade responsável pela emissão de certificados digitais para verificar identidades na Internet. Neste tutorial, usaremos um servidor autônomo como servidor CA privado que validará o servidor OpenVPN e os certificados do cliente. Seu servidor CA não deve executar nenhum outro serviço além de importação, assinatura e validação de certificados.
Passo 1.1 - Instale o Easy-RSA
A primeira etapa é instalar o conjunto de scripts easy-rsa
. easy-rsa
é uma ferramenta de gerenciamento de autoridade de certificação usada para gerar uma chave privada e um certificado raiz público.
$ sudo apt install easy-rsa
Passo 1.2 - Criar um Diretório de Infraestrutura de Chave Pública
A próxima etapa é criar uma estrutura de infraestrutura de chave pública (PKI) no servidor CA.
$ mkdir ~/easy-rsa
Crie links simbólicos apontando para os arquivos do pacote easy-rsa
instalados.
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Restrinja o acesso ao diretório PKI.
$ chmod 700 /home/<username>/easy-rsa
Inicialize a PKI.
$ cd ~/easy-rsa
$ ./easyrsa init-pki
Você obterá a seguinte saída.
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/<username>/easy-rsa/pki
Passo 1.3 - Criar uma Autoridade Certificadora
Antes de poder criar a chave privada e o certificado da sua CA, você precisa configurar as informações da organização para ela. Crie o arquivo vars
para armazenar as informações dentro do diretório easy-rsa
e abra-o para edição.
$ cd ~/easy-rsa
$ nano vars
Cole o seguinte código nele.
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "NewYork"
set_var EASYRSA_REQ_CITY "New York City"
set_var EASYRSA_REQ_ORG "Howtoforge"
set_var EASYRSA_REQ_EMAIL "[email "
set_var EASYRSA_REQ_OU "Community"
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Execute o comando a seguir para criar o par de chaves raiz pública e privada para sua Autoridade de Certificação.
$ ./easyrsa build-ca
Você será solicitado a inserir uma senha para o seu par de chaves. Escolha uma senha forte e anote-a para usar mais tarde. Também será solicitado o nome comum (CN) da sua CA. Você pode inserir qualquer string, mas para simplificar a aposta, pressione ENTER para aceitar o nome padrão.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/<username>/easy-rsa/pki/ca.crt
Se não quiser que uma senha seja solicitada sempre que interagir com sua CA, você pode usar o seguinte comando.
$ ./easyrsa build-ca nopass
Isso criará dois arquivos:
~/easy-rsa/pki/ca.crt
é o arquivo de certificado público da CA. Cada usuário e o servidor OpenVPN precisarão de uma cópia deste arquivo.~/easy-rsa/pki/ca.key
é a chave privada usada pela CA para assinar certificados para o servidor e cliente OpenVPN. Se um invasor obtiver acesso à sua CA e, por sua vez, ao seu arquivoca.key
, você precisará destruir sua CA. É por isso que seu arquivoca.key
deve somente estar em sua máquina CA e que, idealmente, sua máquina CA deve ser mantida offline quando não estiver assinando solicitações de certificado como uma segurança extra medir.
Passo 2 – Instalando OpenVPN e Easy-RSA no servidor OpenVPN
Faça login no seu servidor OpenVPN e instale os pacotes OpenVPN e Easy-RSA.
$ sudo apt install openvpn easy-rsa
Crie o diretório ~/easy-rsa
.
$ mkdir ~/easy-rsa
Crie um link simbólico a partir do script easy-rsa
que instalamos como no servidor CA.
$ ln -s /usr/share/easy-rsa/* ~/easy-rsa/
Restrinja o acesso ao diretório.
$ chmod 700 ~/easy-rsa
Passo 3 - Criando uma PKI para Servidor OpenVPN
Crie um arquivo vars
dentro do diretório ~/easy-rsa
para armazenar as informações necessárias para criar a PKI e abri-la para edição.
$ cd ~/easy-rsa
$ nano vars
Cole as seguintes linhas nele.
set_var EASYRSA_ALGO "ec"
set_var EASYRSA_DIGEST "sha512"
Como não estamos usando este servidor como CA, esses são os únicos valores de que precisamos. Isso configura seus servidores OpenVPN e CA para usar ECC, o que significa que quando um cliente e servidor tentam estabelecer uma chave simétrica compartilhada, eles usam algoritmos de curva elíptica para fazer sua troca. É significativamente mais rápido do que usar Diffie-Hellman simples com o algoritmo RSA clássico, pois os números são muito menores e os cálculos são mais rápidos.
A próxima etapa é criar o diretório PKI usando a opção init-pki
. Embora você já tenha executado este comando no servidor CA como parte dos pré-requisitos, é necessário executá-lo aqui porque o servidor OpenVPN e o servidor CA têm diretórios PKI separados.
$ ./easyrsa init-pki
A PKI no servidor OpenVPN é usada como um local centralizado para armazenar solicitações de certificados e certificados públicos.
Passo 4 - Criar solicitação de certificado de servidor OpenVPN e chave privada
Mude para o diretório ~/easy-rsa
no servidor OpenVPN.
$ cd ~/easy-rsa
A próxima etapa é gerar uma chave privada e uma solicitação de assinatura de certificado (CSR) em seu servidor OpenVPN. Execute o comando easy-rsa
com a opção gen-req
seguida por um Nome Comum (CN) para o servidor. Para nosso tutorial, usaremos server
como CN para o servidor OpenVPN. Também usaremos a opção nopass
para evitar problemas de permissão.
$ ./easyrsa gen-req server nopass
Você obterá a seguinte saída.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
..........+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....................+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+..+......+.......+...+..+.+.....+....+..+...+............+.+...+.....+....+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+......+.....+....+...........+...+..........+..+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*............+.+..+....+..............+.....................+....+......+..............+.+.....+....+............+..+............+....+..+...+.......+.....+....+...+..+.........+.+.........+..+...+.+..............+.+.........+...........+.+.....+.........+...+......+.+......+.....+..........+...+..............+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /home/<username>/easy-rsa/pki/reqs/server.req
key: /home/<username>/easy-rsa/pki/private/server.key
Isso cria uma chave privada para o servidor e um arquivo de solicitação de certificado chamado server.req
. Copie a chave do servidor para o diretório /etc/openvpn/server
.
$ sudo cp /home/<username>/easy-rsa/pki/private/server.key /etc/openvpn/server/
A Solicitação de Assinatura de Certificado (CSR) agora está pronta para assinatura pela CA.
Passo 5 – Assinando o CSR do Servidor OpenVPN
A próxima etapa é copiar o arquivo CSR para o servidor CA para assinatura. Se seus servidores tiverem autenticação por senha habilitada, você pode simplesmente usar o seguinte comando para copiar o arquivo.
$ scp /home/username/easy-rsa/pki/reqs/server.req username@your_ca_server_ip:/tmp
Se não quiser usar autenticação por senha, você precisará gerar um par de chaves SSH para cada servidor e, em seguida, adicionar a chave SSH pública do servidor OpenVPN ao arquivo authorized_keys
da máquina CA e vice-versa.
Se não quiser passar por tudo isso, basta copiar os arquivos. Abra o arquivo no servidor OpenVPN, copie seu conteúdo, crie o arquivo no servidor CA e cole o conteúdo.
Faça login novamente no servidor CA, mude para o diretório ~/easy-rsa
e importe o arquivo CSR.
$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/server.req server
Você obterá a seguinte saída.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
The request has been successfully imported with a short name of: server
You may now use this name to perform signing operations on this request.
Assine a solicitação usando o seguinte comando. Como estamos assinando o CSR do servidor OpenVPN, usaremos seu Nome Comum (CN).
$ ./easyrsa sign-req server server
Você será solicitado a verificar se a solicitação vem de uma fonte confiável. Digite yes
e pressione a tecla ENTER
para confirmar.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a server certificate for 825 days:
subject=
commonName = server
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Em seguida, será solicitada a senha da chave privada da CA que você configurou anteriormente.
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-13476.9IC4QC/tmp.lPVwQo
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
40975B6A677F0000:error:0700006C:configuration file routines:NCONF_get_string:no value:../crypto/conf/conf_lib.c:315:group=<NULL> name=unique_subject
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'server'
Certificate is to be certified until May 8 12:41:46 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/<username>/easy-rsa/pki/issued/server.crt
O certificado resultante contém a chave de criptografia pública do servidor OpenVPN, bem como a assinatura do servidor CA. Copie os certificados de volta para o servidor OpenVPN.
$ scp pki/issued/server.crt username@your_vpn_server_ip:/tmp
$ scp pki/ca.crt username@your_vpn_server_ip:/tmp
No seu servidor OpenVPN, copie os arquivos para o diretório /etc/openvpn/server
.
$ sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/server
Passo 6 – Configurar material criptográfico OpenVPN
Adicionaremos uma chave secreta compartilhada extra que o servidor e todos os clientes usarão com a diretiva tls-crypt
do OpenVPN. Isso garante que o servidor OpenVPN seja capaz de lidar com tráfego não autenticado, varreduras de portas e ataques de negação de serviço. Também torna mais difícil identificar o tráfego de rede OpenVPN.
Mude para o diretório ~/easy-rsa
.
$ cd ~/easy-rsa
Gere a chave pré-compartilhada tls-crypt
. Isso criará um arquivo chamado ta.key
$ openvpn --genkey secret ta.key
Copie o ta.key
para o diretório /etc/openvpn/server
.
$ sudo cp ta.key /etc/openvpn/server
Passo 7 - Gerar um Certificado de Cliente e um Par de Chaves
Crie um diretório para armazenar o certificado do cliente e os arquivos de chave.
$ mkdir -p ~/client-configs/keys
Restrinja as permissões no diretório para protegê-lo.
$ chmod -R 700 ~/client-configs
Em seguida, mude para o diretório ~/easy-rsa
.
$ cd ~/easy-rsa
Gere uma chave de cliente com client1
como o nome comum do cliente. Você pode usar qualquer CN para o cliente.
$ ./easyrsa gen-req client1 nopass
Pressione ENTER
para confirmar o nome comum. Você obterá a seguinte saída.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
.......+.+.....+.+........+.+...+...+........+....+..+....+.........+....................+......+.......+...+.....+.+.........+...............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*............+......+.........+......+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+........+...+...................+...........+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
..........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...........+......+.......+..+..........+.....+.......+.....+....+.....+....+...+.....+...+....+...........+....+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [client1]:
Keypair and certificate request completed. Your files are:
req: /home/username/easy-rsa/pki/reqs/client1.req
key: /home/username/easy-rsa/pki/private/client1.key
Em seguida, copie o arquivo client1.key
para o diretório ~/client-configs/keys
.
$ cp pki/private/client1.key ~/client-configs/keys/
Transfira o arquivo client1.req
para o servidor CA.
$ scp pki/reqs/client1.req username@your_ca_server_ip:/tmp
Faça login novamente no servidor CA e importe a solicitação do servidor.
$ cd ~/easy-rsa
$ ./easyrsa import-req /tmp/client1.req client1
Você obterá a seguinte saída.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
The request has been successfully imported with a short name of: client1
You may now use this name to perform signing operations on this request.
Assine a solicitação usando o seguinte comando. Estamos usando client
como tipo de solicitação.
$ ./easyrsa sign-req client client1
Quando solicitado, digite yes
para confirmar a assinatura da solicitação e se ela veio de uma fonte confiável.
Using SSL: openssl OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a client certificate for 825 days:
subject=
commonName = client1
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Você será solicitado a fornecer a senha da CA.
Using configuration from /home/<username>/easy-rsa/pki/easy-rsa-13573.uI2Vi8/tmp.q1RnLo
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client1'
Certificate is to be certified until May 8 12:50:23 2025 GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Certificate created at: /home/username/easy-rsa/pki/issued/client1.crt
Transfira o certificado criado de volta para o servidor OpenVPN.
$ scp pki/issued/client1.crt username@your_server_ip:/tmp
No servidor OpenVPN, copie o certificado do cliente para o diretório ~/client-configs/keys
.
$ cp /tmp/client1.crt ~/client-configs/keys/
Copie os arquivos ca.crt
e ta.key
para o diretório ~/client-configs/keys
e defina as permissões apropriadas para seu login atualmente -no servidor.
$ cp ~/easy-rsa/ta.key ~/client-configs/keys/
$ sudo cp /etc/openvpn/server/ca.crt ~/client-configs/keys/
$ sudo chown username.username ~/client-configs/keys/*
Passo 8 – Configurar OpenVPN
Copie o arquivo server.conf
de amostra como ponto de partida para configurar o OpenVPN.
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/server/
Abra o arquivo para edição.
$ sudo nano /etc/openvpn/server/server.conf
Encontre a seção HMAC
do arquivo procurando pela diretiva tls-auth
. Comente a linha adicionando um ponto e vírgula (;) no início da linha. Adicione uma nova linha abaixo dela, conforme mostrado.
;tls-auth ta.key 0 # This file is secret
tls-crypt ta.key
Em seguida, altere o valor da cifra criptográfica procurando as linhas cipher
. O valor padrão é definido como AES-256-CBC
. Comente o valor padrão e adicione outra linha com a criptografia AES-256-GCM
que oferece um melhor nível de criptografia e desempenho conforme mostrado.
;cipher AES-256-CBC
cipher AES-256-GCM
Logo abaixo, adicione a diretiva auth
para selecionar o algoritmo de resumo da mensagem HMAC.
auth SHA256
Como estamos usando criptografia de curva elíptica, precisamos desligar a criptografia Diffie-Hellman. Comente a linha dh dh2048.pem
e adicione dh none
abaixo dela.
;dh dh2048.pem
dh none
O OpenVPN deve ser executado sem privilégios depois de iniciado. Para habilitar isso, encontre e descomente as linhas user none
e group none
e altere-as conforme mostrado.
user nobody
group nogroup
O Ubuntu possui o grupo nogroup
e não nobody
que está disponível na distribuição CentOS.
Redirecione todo o tráfego através da VPN
As configurações acima criam a conexão VPN entre o cliente e o servidor, mas não forçarão nenhuma conexão a usar o túnel. Para fazer isso, comece encontrando a linha push "redirect-gateway def1 bypass-dhcp"
. Esta linha informa ao cliente para redirecionar todo o seu tráfego através do servidor OpenVPN. Remova o comentário da linha para ativar a funcionalidade.
push "redirect-gateway def1 bypass-dhcp"
Encontre a seção dhcp-option
abaixo desta linha. Remova o ponto e vírgula do início de ambas as linhas. Isso diz ao cliente para usar os resolvedores OpenDNS.
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
Alterar porta e protocolo
OpenVPN usa a porta 1194 e o protocolo UDP por padrão para aceitar conexões de clientes. Você pode alterar a porta dependendo de suas necessidades. Se você não estiver hospedando conteúdo da web em seu servidor OpenVPN, poderá usar a porta 443.
Encontre a linha port 1194
e altere seu valor.
# Optional!
port 443
Encontre a linha proto udp
e comente-a adicionando um ponto e vírgula na frente dela. E remova o comentário da linha proto tcp
removendo o ponto e vírgula conforme mostrado.
proto tcp
;proto udp
Como estamos usando o protocolo TCP, precisamos alterar o valor da diretiva explicit-exit-notify
de 1
para 0
, pois isso A diretiva é usada apenas pelo UDP.
explicit-exit-notify 0
Apontar para credenciais não padrão
Se você selecionou um nome diferente durante o comando ./easy-rsa gen-req server
anteriormente, será necessário modificar o cert
e a key
linhas para que apontem para os arquivos .crt
e .key
apropriados. Como estamos usando o nome do servidor
padrão, o valor padrão está correto.
cert server.crt
key server.key
Quando terminar, salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Passo 9 - Ajustar a configuração de rede do servidor OpenVPN
A próxima etapa é definir a configuração de rede do servidor para permitir que o OpenVPN roteie o tráfego corretamente. A primeira coisa que precisamos configurar é o encaminhamento de porta.
Abra o arquivo /etc/sysctl.conf
para edição.
$ sudo nano /etc/sysctl.conf
Adicione a seguinte linha na parte inferior do arquivo.
net.ipv4.ip_forward = 1
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Para ler o arquivo e carregar os novos valores para a sessão atual, use o seguinte comando.
$ sudo sysctl -p
net.ipv4.ip_forward = 1
Esta configuração roteará todo o tráfego da web do seu cliente através do endereço IP do seu servidor, e o endereço IP público do seu cliente ficará efetivamente oculto.
Passo 10 - Configurar Firewall
Para permitir o OpenVPN através do firewall, você precisa habilitar o mascaramento, um conceito de iptables que fornece tradução dinâmica de endereços de rede (NAT) em tempo real para rotear corretamente as conexões do cliente.
Antes de abrir o arquivo de configuração do firewall para adicionar as regras de mascaramento, primeiro encontre a interface de rede pública da sua máquina usando o seguinte comando.
$ ip route list default
Você receberá uma saída semelhante.
default via 64.225.64.1 dev eth0 proto static
Isso nos diz que o nome da interface é eth0
. Abra o arquivo /etc/ufw/before.rules
para edição.
$ sudo nano /etc/ufw/before.rules
Essas regras são lidas e implementadas antes que as regras convencionais do UFW sejam carregadas. Adicione as seguintes linhas no início do arquivo, conforme mostrado.
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#
# START OPENVPN RULES
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Allow traffic from OpenVPN client to eth0 (change to the interface you discovered!)
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT
# END OPENVPN RULES
# Don't delete these required lines, otherwise there will be errors
*filter
. . .
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
A seguir, precisamos configurar o UFW para permitir pacotes encaminhados por padrão. Abra o arquivo /etc/default/ufw
para edição.
$ sudo nano /etc/default/ufw
Encontre a diretiva DEFAULT_FORWARD_POLICY
e altere seu valor de DROP
para ACCEPT
.
DEFAULT_FORWARD_POLICY="ACCEPT"
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
E finalmente, abra a porta 443 que você configurou anteriormente para o servidor OpenVPN.
$ sudo ufw allow 443/tcp
Desative e ative o firewall para aplicar a nova configuração.
$ sudo ufw disable
$ sudo ufw enable
Passo 11 – Inicie o OpenVPN
Habilite o serviço OpenVPN para iniciar na inicialização.
$ sudo systemctl -f enable [email
Inicie o serviço OpenVPN.
$ sudo systemctl start [email
Verifique o status do serviço.
$ sudo systemctl status [email
Você receberá uma saída semelhante.
? [email - OpenVPN service for server
Loaded: loaded (/lib/systemd/system/[email ; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-02-03 13:40:28 UTC; 32s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 15492 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 1116)
Memory: 1.8M
CPU: 29ms
CGroup: /system.slice/system-openvpn\x2dserver.slice/[email
??15492 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --config server.conf
Feb 03 13:40:28 vpnserver openvpn[15492]: Listening for incoming TCP connection on [AF_INET][undef]:443
Feb 03 13:40:28 vpnserver openvpn[15492]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443
Feb 03 13:40:28 vpnserver openvpn[15492]: TCPv4_SERVER link remote: [AF_UNSPEC]
Feb 03 13:40:28 vpnserver openvpn[15492]: GID set to nogroup
Feb 03 13:40:28 vpnserver openvpn[15492]: UID set to nobody
Feb 03 13:40:28 vpnserver openvpn[15492]: MULTI: multi_init called, r=256 v=256
Feb 03 13:40:28 vpnserver openvpn[15492]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Feb 03 13:40:28 vpnserver openvpn[15492]: IFCONFIG POOL LIST
Feb 03 13:40:28 vpnserver openvpn[15492]: MULTI: TCP INIT maxclients=1024 maxevents=1028
Feb 03 13:40:28 vpnserver openvpn[15492]: Initialization Sequence Completed
Passo 12 - Criar Configuração do Cliente
Antes de testar um cliente, precisamos criar arquivos de configuração para o cliente que utilizaremos. Crie um diretório para armazenar arquivos de configuração do cliente.
$ mkdir -p ~/client-configs/files
Copie o arquivo de configuração do cliente de exemplo para o diretório.
$ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
Abra o arquivo de configuração para edição.
$ nano ~/client-configs/base.conf
Encontre a diretiva remote
e configure-a para apontar para o endereço IP público do seu servidor OpenVPN. Além disso, altere a porta para corresponder à porta escolhida anteriormente.
. . .
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote your_server_ip 443
. . .
Defina o protocolo que você escolheu anteriormente.
proto tcp
Remova o comentário das diretivas user
e group
removendo o ponto e vírgula na frente delas. Além disso, altere o valor da diretiva group
para nogroup
.
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nogroup
Encontre as diretivas ca
, cert
e key
e comente-as colocando um ponto e vírgula na frente delas. Isso ocorre porque adicionaremos os certificados e chaves ao arquivo de configuração do cliente.
# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
;ca ca.crt
;cert client.crt
;key client.key
Comente a diretiva tls-auth
, pois adicionaremos ta.key
diretamente no arquivo de configuração do cliente.
# If a tls-auth key is used on the server
# then every client must also have the key.
;tls-auth ta.key 1
Combine as configurações de cipher
e auth
definidas no arquivo `/etc/openvpn/server/server.conf
.
cipher AES-256-GCM
auth SHA256
Adicione a diretiva key-direction
e defina-a como 1
para que a VPN funcione corretamente.
key-direction 1
A seguir, adicione algumas linhas comentadas para lidar com os diferentes métodos usados pelos clientes VPN para resolução de DNS. Adicione o seguinte conjunto de linhas para clientes que não usam systemd-resolved
mas dependem do utilitário resolvconf
para gerenciar DNS.
; script-security 2
; up /etc/openvpn/update-resolv-conf
; down /etc/openvpn/update-resolv-conf
Adicione o seguinte conjunto de linhas para clientes que usam systemd-resolved
para resolução de DNS.
; script-security 2
; up /etc/openvpn/update-systemd-resolved
; down /etc/openvpn/update-systemd-resolved
; down-pre
; dhcp-option DOMAIN-ROUTE .
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Crie um script para compilar a configuração base com o certificado, a chave e os arquivos de criptografia relevantes e, em seguida, copie o arquivo de configuração gerado no diretório ~/client-configs/files
.
Crie e abra o arquivo make_config.sh
dentro do diretório ~/client-configs
.
$ nano ~/client-configs/make_config.sh
Cole o seguinte código nele.
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-crypt>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-crypt>') \
> ${OUTPUT_DIR}/${1}.ovpn
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Torne o arquivo executável e restrinja as permissões a ele.
$ chmod 700 ~/client-configs/make_config.sh
Este script faz uma cópia do arquivo base.conf
, coleta todos os certificados e arquivos de chave, extrai seu conteúdo, anexa-os ao arquivo de configuração base e exporta tudo isso para criar um novo arquivo de configuração do cliente . Cada vez que você adiciona um novo cliente, é necessário gerar novas chaves e certificados para ele e, em seguida, executar este script para criar um arquivo de configuração do cliente.
Já criamos o certificado do cliente e os arquivos de chave na etapa 7. Vamos criar o arquivo de configuração para o mesmo.
Mude para o diretório ~/client-configs
.
$ cd ~/client-configs
Execute o script para criar o arquivo de configuração do cliente.
$ ./make_config.sh client1
Isso criará um arquivo chamado client1.ovpn
. Altere o parâmetro se desejar um nome de arquivo diferente. Verifique o conteúdo do diretório.
$ ls ~/client-configs/files
client1.ovpn
Este é o arquivo de configuração que você precisa transferir para o cliente que será então usado para conectar-se ao servidor OpenVPN. Você pode usar qualquer protocolo/programa SFTP para transferir o arquivo para o cliente.
Passo 13 - Instalar e testar a conexão do cliente
Para nosso tutorial, estamos usando uma máquina cliente Ubuntu 22.04. Instale o OpenVPN através do seguinte comando.
$ sudo apt install openvpn
Verifique se o seu sistema está usando systemd-resolved
para gerenciar consultas DNS executando o seguinte comando.
$ cat /etc/resolv.conf
Você obterá uma saída semelhante.
Output
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
. . .
nameserver 127.0.0.53
options edns0 trust-ad
search .
Se o sistema estiver usando systemd-resolved
, o endereço IP acima será 127.0.0.53
. Além disso, o comentário no topo do arquivo confirmará o mesmo. Se o endereço IP for diferente de 127.0.0.53
, então o sistema não está usando systemd-resolved
e você precisa seguir as etapas mencionadas posteriormente.
Para clientes com resolvido pelo systemd
Instale o pacote openvpn-systemd-resolved
que fornece scripts que forçam o systemd-resolved
a usar o servidor VPN para DNS.
$ sudo apt install openvpn-systemd-resolved
Abra o arquivo de configuração do cliente para edição.
$ nano client1.ovpn
Remova o comentário das seguintes linhas do arquivo removendo o ponto e vírgula na frente delas.
script-security 2
up /etc/openvpn/update-systemd-resolved
down /etc/openvpn/update-systemd-resolved
down-pre
dhcp-option DOMAIN-ROUTE .
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Para clientes com update-resolv-conf
Primeiro, confirme se sua distribuição está usando update-resolv-conf
.
$ ls /etc/openvpn
client server update-resolv-conf
Se o seu sistema contém o arquivo update-resolv-conf
, abra o arquivo de configuração do cliente para edição.
$ nano client1.ovpn
Remova o comentário das seguintes linhas do arquivo removendo o ponto e vírgula na frente delas.
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
Se você estiver usando uma distribuição baseada em CentOS, altere a diretiva group
de nogroup
para nobody
.
group nobody
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Conectar cliente
Execute o seguinte comando para conectar o cliente ao servidor VPN.
$ sudo openvpn --config client1.ovpn
Você deve obter uma saída semelhante.
2023-02-06 15:18:37 OpenVPN 2.5.5 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 14 2022
2023-02-06 15:18:37 library versions: OpenSSL 3.0.2 15 Mar 2022, LZO 2.10
2023-02-06 15:18:37 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
2023-02-06 15:18:37 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-06 15:18:37 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-06 15:18:37 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-06 15:18:37 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-06 15:18:37 TCP/UDP: Preserving recently used remote address: [AF_INET]64.225.66.226:443
2023-02-06 15:18:37 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-02-06 15:18:37 Attempting to establish TCP connection with [AF_INET]64.225.66.226:443 [nonblock]
2023-02-06 15:18:38 TCP connection established with [AF_INET]64.225.66.226:443
2023-02-06 15:18:38 TCP_CLIENT link local: (not bound)
2023-02-06 15:18:38 TCP_CLIENT link remote: [AF_INET]64.225.66.226:443
2023-02-06 15:18:38 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-02-06 15:18:38 TLS: Initial packet from [AF_INET]64.225.66.226:443, sid=b6459c4e 0e23d362
2023-02-06 15:18:38 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-02-06 15:18:38 VERIFY KU OK
2023-02-06 15:18:38 Validating certificate extended key usage
2023-02-06 15:18:38 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-02-06 15:18:38 VERIFY EKU OK
2023-02-06 15:18:38 VERIFY OK: depth=0, CN=server
2023-02-06 15:18:38 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256
2023-02-06 15:18:38 [server] Peer Connection Initiated with [AF_INET]64.225.66.226:443
2023-02-06 15:18:39 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
2023-02-06 15:18:39 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1 bypass-dhcp,dhcp-option DNS 208.67.222.222,dhcp-option DNS 208.67.220.220,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM'
2023-02-06 15:18:39 OPTIONS IMPORT: timers and/or timeouts modified
2023-02-06 15:18:39 OPTIONS IMPORT: --ifconfig/up options modified
2023-02-06 15:18:39 OPTIONS IMPORT: route options modified
2023-02-06 15:18:39 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-02-06 15:18:39 OPTIONS IMPORT: peer-id set
2023-02-06 15:18:39 OPTIONS IMPORT: adjusting link_mtu to 1626
2023-02-06 15:18:39 OPTIONS IMPORT: data channel crypto options modified
2023-02-06 15:18:39 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-06 15:18:39 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-06 15:18:39 net_route_v4_best_gw query: dst 0.0.0.0
2023-02-06 15:18:39 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-02-06 15:18:39 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:84:e2:0b
2023-02-06 15:18:39 TUN/TAP device tun0 opened
2023-02-06 15:18:39 net_iface_mtu_set: mtu 1500 for tun0
2023-02-06 15:18:39 net_iface_up: set tun0 up
2023-02-06 15:18:39 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-02-06 15:18:39 /etc/openvpn/update-systemd-resolved tun0 1500 1626 10.8.0.6 10.8.0.5 init
<14>Feb 6 15:18:39 update-systemd-resolved: Link 'tun0' coming up
<14>Feb 6 15:18:39 update-systemd-resolved: Adding DNS Routed Domain .
<14>Feb 6 15:18:39 update-systemd-resolved: Adding IPv4 DNS Server 208.67.222.222
<14>Feb 6 15:18:39 update-systemd-resolved: Adding IPv4 DNS Server 208.67.220.220
<14>Feb 6 15:18:39 update-systemd-resolved: SetLinkDNS(5 2 2 4 208 67 222 222 2 4 208 67 220 220)
<14>Feb 6 15:18:39 update-systemd-resolved: SetLinkDomains(5 1 . true)
2023-02-06 15:18:39 net_route_v4_add: 64.225.66.226/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-02-06 15:18:39 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-06 15:18:39 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-06 15:18:39 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-06 15:18:39 GID set to nogroup
2023-02-06 15:18:39 UID set to nobody
2023-02-06 15:18:39 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
2023-02-06 15:18:39 Initialization Sequence Completed
Abra outro terminal para verificar as configurações de DNS.
$ systemd-resolve --status tun0
Você obterá a seguinte saída, onde poderá ver os servidores DNS que configuramos antes. Isso garante que a VPN esteja funcionando corretamente.
Link 4 (tun0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 208.67.222.222
DNS Servers: 208.67.222.222 208.67.220.220
DNS Domain: ~.
Você pode verificar ainda mais a conexão visitando o URL https://whatismyip.com
em seu navegador e você verá seu endereço IP e a localização do seu servidor OpenVPN.
Você também pode verificar ainda mais realizando um teste padrão no site https://www.dnsleaktest.com/
.
Você pode ver os nomes de host OpenDNS que configuramos antes e a localização do servidor corresponde à localização do servidor OpenVPN.
O comando acima executa o OpenVPN em primeiro plano, o que significa que o terminal será bloqueado. Para encerrar a conexão, você precisa pressionar Ctrl + C. No entanto, você também pode executar o OpenVPN em segundo plano. Use o seguinte comando para fazer isso.
sudo openvpn --config client1.ovpn --daemon
Para encerrar a conexão, encontre o ID do processo.
$ ps aux | grep openvpn
Você obterá uma saída semelhante.
nobody 4357 0.3 0.0 13468 8432 ? Ss 15:35 0:00 openvpn --config client1.ovpn --daemon
username 4406 0.0 0.0 17732 2432 pts/0 S+ 15:35 0:00 grep --color=auto openvpn
Como você pode ver, o ID do processo correspondente ao processo OpenVPN é 4357
. Desligue a conexão VPN usando o seguinte comando para encerrar o processo.
$ sudo kill -9 4357
OpenVPN oferece clientes GUI para plataformas Windows, macOS, Android e iOS onde você pode importar o arquivo de configuração do cliente para se conectar.
Passo 14 – Revogando Certificados de Cliente
Se quiser revogar o certificado de um cliente para impedir o acesso, você pode fazer isso fazendo login no servidor CA.
Mude para o diretório ~/easy-rsa
.
$ cd ~/easy-rsa
Execute o script com a opção revoke
seguida do nome do cliente.
$ ./easyrsa revoke client1
Você será questionado se deseja revogar o certificado.
Please confirm you wish to revoke the certificate with the following subject:
subject=
commonName = client1
Type the word 'yes' to continue, or any other input to abort.
Continue with revocation: yes
. . .
Revoking Certificate 8348B3F146A765581946040D5C4D590A
. . .
Isso revoga o certificado no servidor CA. No entanto, o servidor OpenVPN não tem como verificar o status de revogação. Para isso, precisamos gerar uma Lista de Revogação de Certificados (CRL) e transferi-la para o servidor OpenVPN.
Gere a CRL.
$ ./easyrsa gen-crl
Você será solicitado a fornecer sua senha da CA. O comando acima gera um arquivo crl.pem
.
Copie este arquivo para o servidor OpenVPN.
$ scp ~/easy-rsa/pki/crl.pem username@your_server_ip:/tmp
Faça login novamente no servidor OpenVPN e copie o arquivo CRL para o diretório /etc/openvpn/server
.
$ sudo cp /tmp/crl.pem /etc/openvpn/server/
Abra o arquivo de configuração do servidor OpenVPN para edição.
$ sudo nano /etc/openvpn/server/server.conf
Adicione a seguinte linha na parte inferior do arquivo. Isso instrui o servidor OpenVPN a verificar a lista de revogação de clientes que foram restritos.
crl-verify crl.pem
Salve o arquivo pressionando Ctrl + X e digitando Y quando solicitado.
Reinicie o servidor OpenVPN para aplicar as alterações.
sudo systemctl restart [email
O cliente não pode mais se conectar ao servidor OpenVPN.
Conclusão
Isso conclui nosso tutorial sobre instalação e configuração do servidor OpenVPN em um servidor Ubuntu 22.04. Também conectamos o cliente OpenVPN Linux ao servidor. Se você tiver alguma dúvida, poste-a nos comentários abaixo.