Pesquisa de site

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 arquivo ca.key, você precisará destruir sua CA. É por isso que seu arquivo ca.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.

Artigos relacionados: