Como instalar e configurar o servidor OpenVPN no Rocky Linux 9
Uma Rede Privada Virtual (VPN) permite-lhe aceder à Internet mascarando a sua localização, o que lhe dá a liberdade de 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 código aberto Transport Layer Security (TLS) para atingir esse objetivo.
Em nosso tutorial, iremos instalar o OpenVPN em um servidor Rocky Linux 9 e 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 Rocky Linux 9 com suporte para conexões IPv4 e IPv6. Iremos nos referir a isso como servidor OpenVPN. O Firewalld Firewall está habilitado e em execução nele.
Um servidor executando Rocky Linux 9 com suporte para conexões IPv4 e IPv6. Configuraremos isso 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 Rocky Linux 9 para o tutorial.
Tudo é atualizado no OpenVPN e no servidor CA.
$ sudo dnf update
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.
Mas primeiro, precisamos habilitar o repositório EPEL que contém o pacote easy-rsa
.
$ sudo dnf install epel-release
Instale o Easy-RSA.
$ sudo dnf 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/3/* ~/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. Também será solicitada uma senha PEM. Escolha uma senha forte para ambos 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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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. Além disso, instale o repositório EPEL antes deles.
$ sudo dnf install epel-release
$ sudo dnf 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/3/* ~/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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
.....+.................+.+.....+....+........+...+.+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+.+...+..+......+...+....+.....+...+.........+......+.......+...+.....+.......+.....+.....................+.+...+...+...............+........+..........+......+.....+...+.......+........+.+...........+...+.+.....+......+.+...+.........+...+........+.+...........+...+....+..+...+............+.............+.....+...+.......+...+...+...........+.+..+.......+.....+...................+..+...+......+....+..+.......+......+......+......+..+......+....+............+...............+.....+..........+...+..+....+..+.........+....+...............+..............+.......+...+..+...+......+.+....................................+........+....+...+...+.........+.....+.+..+...+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
................+...+....+............+...+...+.....+...+....+...............+......+.....+....+.....+.+.........+...+.................+......+.........+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*........+...+..+.......+..+...+.+.....+.........+.+..+....+...+.....+......+.......+.........+........+......+.+.....+.+............+..+..........+........+.+..+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.........+...+..+.+........+....+..+......+....+.........+..+............+...+...+.........+.............+..+...+...+.+......+.....+....+.....+.+...+..............................+......+........+..........+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
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-5673.9KntVf/tmp.P5JqSD
Enter pass phrase for /home/<username>/easy-rsa/pki/private/ca.key:
802BB2829D7F0000: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 12 01:34:35 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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
........+.+.........+.........+...+...+..+.........+......+...+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+..+...+....+........+.......+........+............+...+......+.......+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+...............+..........+......+......+.....+....+...........+.+..+......+.+.....................+.........+.........+..+.........+..+...+.+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+.....+.+..................+...........+...+.+............+..+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+.....+.+.........+...+..+.........+....+..+..................+.+......+...+...+.....+...+......+..........+........+...+...+......+...+...+...+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*...+...+.....+.......+........+.......+........+.+.........+...........+.......+...............+.....+....+.........+.....+.+...+........+...+.+...+..+.+........+............+.........+.+.........+.....+.++.......+.....+.......+.....+....+......+.....+.............+...........+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-----
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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
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.1 14 Dec 2021 (Library: OpenSSL 3.0.1 14 Dec 2021)
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-5908.XM2MNt/tmp.SGLqAt
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 12 01:41:45 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/sample/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 nobody
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
, remova o comentário removendo o ponto e vírgula e altere seu valor.
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 # This file should be kept secret
Alterar localização do arquivo de log para SELinux
Encontre a linha status openvpn-status.log
e altere-a para o seguinte.
status /var/log/openvpn-status.log
Por padrão, o servidor OpenVPN gera e armazena o log no diretório /run/openvpn/openvpn-status.log
que, se o SELinux estiver habilitado, causa problemas. A solução fácil é alterar o local para o diretório de log do sistema.
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
Instalamos e configuramos o OpenVPN, mas não o configuramos para lidar com o tráfego de entrada do cliente. Precisamos configurar o Firewall para isso.
Primeiro, verifique as zonas ativas em seu firewall firewalld
.
$ sudo firewall-cmd --get-active-zones
Você receberá uma saída semelhante.
public
interfaces: eth0 eth1
Se você não vir a interface tun0
como uma zona confiável
, execute os comandos a seguir para adicionar o servidor a essa zona.
$ sudo firewall-cmd --zone=trusted --add-interface=tun0
$ sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0
Em seguida, adicione o serviço OpenVPN à lista de serviços permitidos na zona ativa. E então torne as configurações permanentes.
$ sudo firewall-cmd --permanent --add-service openvpn
$ sudo firewall-cmd --permanent --zone=trusted --add-service openvpn
Recarregue o Firewall para aplicar as alterações.
$ sudo firewall-cmd --reload
Confirme se o serviço OpenVPN foi adicionado.
$ sudo firewall-cmd --list-services --zone=trusted
openvpn
Em seguida, precisamos adicionar uma regra de mascaramento ao firewall. Isso permite que o servidor OpenVPN traduza os endereços dos clientes no endereço público do servidor e, em seguida, faça o inverso com o tráfego enviado de volta aos clientes. Este processo também é chamado de Tradução de Endereço de Rede (NAT).
Adicione regras de mascaramento com os comandos a seguir.
$ sudo firewall-cmd --add-masquerade
$ sudo firewall-cmd --add-masquerade --permanent
Confirme se a máscara foi adicionada corretamente.
$ sudo firewall-cmd --query-masquerade
yes
Por fim, crie a regra de mascaramento específica para a sub-rede OpenVPN. Isso é feito criando uma variável shell (DEVICE
em nosso tutorial) que representa a interface de rede primária usada pelo servidor e, em seguida, usando essa variável para adicionar permanentemente a regra de roteamento.
$ DEVICE=$(ip route | awk '/^default via/ {print $5}')
$ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE
Finalmente, abra a porta definida para OpenVPN acima.
$ sudo firewall-cmd --permanent --add-port=443/tcp
Recarregue o firewall para aplicar a alteração.
$ sudo firewall-cmd --reload
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 (/usr/lib/systemd/system/[email ; enabled; vendor preset: disabled)
Active: active (running) since Tue 2023-02-07 02:09:36 UTC; 13s ago
Docs: man:openvpn(8)
https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
https://community.openvpn.net/openvpn/wiki/HOWTO
Main PID: 4789 (openvpn)
Status: "Initialization Sequence Completed"
Tasks: 1 (limit: 4443)
Memory: 1.7M
CPU: 21ms
CGroup: /system.slice/system-openvpn\x2dserver.slice/[email
??4789 /usr/sbin/openvpn --status /run/openvpn-server/status-server.log --status-version 2 --suppress-timestamps --cipher AES-256-GCM --data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC:AES-128-CBC:BF-CBC --config server.conf
Feb 07 02:09:36 openvpn-server openvpn[4789]: Listening for incoming TCP connection on [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link local (bound): [AF_INET][undef]:443
Feb 07 02:09:36 openvpn-server openvpn[4789]: TCPv4_SERVER link remote: [AF_UNSPEC]
Feb 07 02:09:36 openvpn-server openvpn[4789]: GID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: UID set to nobody
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: multi_init called, r=256 v=256
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL IPv4: base=10.8.0.4 size=62
Feb 07 02:09:36 openvpn-server openvpn[4789]: IFCONFIG POOL LIST
Feb 07 02:09:36 openvpn-server openvpn[4789]: MULTI: TCP INIT maxclients=1024 maxevents=1028
Feb 07 02:09:36 openvpn-server openvpn[4789]: 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/sample/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.
# Downgrade privileges after initialization (non-Windows only)
user nobody
group nobody
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
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 Rocky Linux 9. Instale o OpenVPN através do seguinte comando.
$ sudo dnf install openvpn
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-07 11:42:05 OpenVPN 2.5.8 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov 1 2022
2023-02-07 11:42:05 library versions: OpenSSL 3.0.1 14 Dec 2021, LZO 2.10
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Outgoing Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 Incoming Control Channel Encryption: Cipher 'AES-256-CTR' initialized with 256 bit key
2023-02-07 11:42:05 Incoming Control Channel Encryption: Using 256 bit message hash 'SHA256' for HMAC authentication
2023-02-07 11:42:05 TCP/UDP: Preserving recently used remote address: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 Socket Buffers: R=[131072->131072] S=[16384->16384]
2023-02-07 11:42:05 Attempting to establish TCP connection with [AF_INET]142.93.225.189:443 [nonblock]
2023-02-07 11:42:05 TCP connection established with [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 TCP_CLIENT link local: (not bound)
2023-02-07 11:42:05 TCP_CLIENT link remote: [AF_INET]142.93.225.189:443
2023-02-07 11:42:05 NOTE: UID/GID downgrade will be delayed because of --client, --pull, or --up-delay
2023-02-07 11:42:05 TLS: Initial packet from [AF_INET]142.93.225.189:443, sid=7c9feddd a75e1d1f
2023-02-07 11:42:06 VERIFY OK: depth=1, CN=Easy-RSA CA
2023-02-07 11:42:06 VERIFY KU OK
2023-02-07 11:42:06 Validating certificate extended key usage
2023-02-07 11:42:06 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
2023-02-07 11:42:06 VERIFY EKU OK
2023-02-07 11:42:06 VERIFY OK: depth=0, CN=server
2023-02-07 11:42:06 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bit RSA, signature: RSA-SHA256
2023-02-07 11:42:06 [server] Peer Connection Initiated with [AF_INET]142.93.225.189:443
2023-02-07 11:42:06 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-07 11:42:06 OPTIONS IMPORT: timers and/or timeouts modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ifconfig/up options modified
2023-02-07 11:42:06 OPTIONS IMPORT: route options modified
2023-02-07 11:42:06 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
2023-02-07 11:42:06 OPTIONS IMPORT: peer-id set
2023-02-07 11:42:06 OPTIONS IMPORT: adjusting link_mtu to 1626
2023-02-07 11:42:06 OPTIONS IMPORT: data channel crypto options modified
2023-02-07 11:42:06 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
2023-02-07 11:42:06 net_route_v4_best_gw query: dst 0.0.0.0
2023-02-07 11:42:06 net_route_v4_best_gw result: via 10.0.2.2 dev enp0s3
2023-02-07 11:42:06 ROUTE_GATEWAY 10.0.2.2/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:fd:d4:94
2023-02-07 11:42:06 TUN/TAP device tun0 opened
2023-02-07 11:42:06 net_iface_mtu_set: mtu 1500 for tun0
2023-02-07 11:42:06 net_iface_up: set tun0 up
2023-02-07 11:42:06 net_addr_ptp_v4_add: 10.8.0.6 peer 10.8.0.5 dev tun0
2023-02-07 11:42:06 net_route_v4_add: 142.93.225.189/32 via 10.0.2.2 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 0.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 128.0.0.0/1 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 net_route_v4_add: 10.8.0.1/32 via 10.8.0.5 dev [NULL] table 0 metric -1
2023-02-07 11:42:06 GID set to nobody
2023-02-07 11:42:06 UID set to nobody
2023-02-07 11:42:06 Initialization Sequence Completed
Você pode verificar 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
Será solicitada 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 como instalar e configurar o servidor OpenVPN em um servidor Rocky Linux 9 . Também conectamos o cliente OpenVPN Linux ao servidor. Se você tiver alguma dúvida, poste-a nos comentários abaixo.