OpenVPN: Servidor de VPN no Linux

Saudações. Nesse tutorial vou ensinar como montar um servidor OpenVPN (OVPN) compatível com clientes diversos: Windows, Linux, MacOS, Mikrotik e afins.

Pré-requisitos (constam em outros artigos aqui do blog):

  • Instalação do Linux (Debian 12);
  • Internet no servidor;
  • Firewall (nftables) com NAT de IPs privados;

1 – Sobre o OpenVPN

O OpenVPN é um software de provisionamento de túneis (VPN) de camada 2 (TAP) e camada 3 (TUN).

Antigamente, o OpenVPN era extremamente flexível porem operava exclusivamente em user-space. Com a implementação do OpenVPN Data Channel Offload (DCO) as VPNs agora passam a ser aceleradas no kernel, o que torna a conexão rápida, com baixa latência.

Como o modo DCO atende quase todas as implementações normais de conectividade entre CPEs e clientes, esse será o método oficial utilizado aqui.

Até a conclusão desse tutorial o Debian 13 não tinha o modulo DCO funcional. Erro “Note: Kernel support for ovpn-dco missing, disabling data channel offload“.

Instalando

Bash
# Atualizar base do sistema:
apt -y update;
apt -y upgrade;
apt -y dist-upgrade;

# Instalar OpenVPN:
apt -y install openssl;
apt -y install openvpn;
apt -y install openvpn-dco-dkms;

# Conferindo a versão:
openvpn --version;
    # OpenVPN 2.6.14 x86_64-pc-linux-gnu
    # [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
    # library versions: OpenSSL 3.5.1 1 Jul 2025, LZO 2.10

Preparativos

Para que o OpenVPN seja executado corretamente, os módulos do kernel devem estar carregados durante o boot.

Bash
# Carregando modulos do kernel durante o boot
# - Modulo TUN para conexoes de camada 3
echo "tun" > /etc/modules-load.d/tun.conf;

# Carregando imediatamente:
systemctl restart systemd-modules-load.service;

O OpenVPN no Debian não cria nenhum serviço para executar o OpenVPN, é necessário criá-los.

Vou criar o mesmo servidor OVPN com transporte UDP.

O uso de VPNs sobre TCP é desaconselhado em produção por conta de problemas de dupla repetição de pacotes perdidos chamado TCP Meltdown. O pacote é repetido pelo cliente que usa a VPN e a própria VPN acaba por também repetir o pacote que não foi entregue, resultando em lapsos de tráfego e medição de banda extremamente volátil.

2 – Certificados – Autoridade Certificadora

O OpenVPN utiliza SSL/TLS com camada de segurança: autenticação e criptografia.

Para tal, requer a implementação de PKI – Public Key Infrastructure – Infraestrutura de Chave Pública.

Não é necessário, nem viável, conectar sua PKI à árvore de ROOT-CA global. A montagem é 100% privada.

Em um ambiente seguro, o usuário e servidores geram cada um sua chave privada, criam o certificado auto-assinado contendo sua chave pública (CSR) e enviam à CA para que ela gere um certificado final assinado (CRT), que será reconhecido por todos os signatários da CA.

Em um ambientes OVPN genérico, a CA e o servidor e os clientes estão sob o poder da mesma pessoa (administrador de redes). Por conta disso ignora-se o isolamento de chaves privadas entre essas entidades: CA, servidor OVPN, cliente OVPN.

Resumindo: no servidor OpenVPN iremos criar tudo.

Criar unidade certificadora privada

Bash
# Diretorio para unidade certificadora
mkdir -p /etc/ssl/ovpn-ca;

# Pasta para armazenar a CA:
mkdir -p /etc/ssl/ovpn-ca/certs;
mkdir -p /etc/ssl/ovpn-ca/crl;
mkdir -p /etc/ssl/ovpn-ca/csr;
mkdir -p /etc/ssl/ovpn-ca/newcerts;
mkdir -p /etc/ssl/ovpn-ca/private;

# Restringir o acesso da pasta de chave privada:
chmod  700 /etc/ssl/ovpn-ca/private;

# Número de série inicial automático:
[ -f /etc/openssl/ovpn-ca/serial    ] || echo 1000 > /etc/ssl/ovpn-ca/serial;
[ -f /etc/openssl/ovpn-ca/crlnumber ] || echo 1000 > /etc/ssl/ovpn-ca/crlnumber;

# Índice de auditoria:
touch  /etc/ssl/ovpn-ca/index.txt;

# Configuração do openssl para geração de certificados:
(
    echo '[ ca ]';
    echo 'default_ca	 = CA_default';
    echo;
    echo '[ CA_default ]';
    echo 'dir              = /etc/ssl/ovpn-ca';
    echo 'certificate      = $dir/certs/ca.cert.pem';
    echo 'private_key      = $dir/private/ca.key.pem';
    echo 'database         = $dir/index.txt';
    echo 'serial           = $dir/serial';
    echo 'new_certs_dir    = $dir/newcerts';
    echo 'crlnumber        = $dir/crlnumber';
    echo 'crl              = $dir/crl/ca.crl.pem';
    echo 'default_days     = 3650';
    echo 'default_md       = sha256';
    echo 'policy           = policy_loose';
    echo 'default_crl_days = 30';
    echo;
    echo '[ policy_loose ]';
    echo 'countryName             = optional';
    echo 'stateOrProvinceName     = optional';
    echo 'organizationName        = optional';
    echo 'organizationalUnitName  = optional';
    echo 'commonName              = supplied';
    echo 'emailAddress            = optional';
    echo;
    echo '[ req ]';
    echo 'distinguished_name = req_distinguished_name';
    echo 'x509_extensions = v3_ca';
    echo 'prompt = no';
    echo;
    echo '[ req_distinguished_name ]';
    echo 'C  = BR';
    echo 'ST = Minas Gerais';
    echo 'L  = Belo Horizonte';
    echo 'O  = Intranet-Company';
    echo 'OU = TI';
    echo 'CN = intranet.br';
    echo 'emailAddress = root@intranet.br';
    echo;
    echo '[ v3_ca ]';
    echo 'basicConstraints = critical, CA:true';
    echo 'keyUsage = critical, digitalSignature, cRLSign, keyCertSign';
    echo 'subjectKeyIdentifier = hash';
    echo 'authorityKeyIdentifier = keyid:always,issuer';
    echo 'crlDistributionPoints = URI:http://cert.darkstar.com/darkstar-crl.pem';
    echo;
) > /etc/ssl/ovpn-ca/openssl.cnf;

Criar chave privada da Autoridade Certificadora (CA);

Bash
# Pasta para armazenar CA, criar e acessar:
cd /etc/ssl/ovpn-ca;

# Gerar chave privada da CA:
CA_PRIVKEY="/etc/ssl/ovpn-ca/private/ca.key.pem";
[ -f "$CA_PRIVKEY" ] || \
    openssl genpkey \
        -algorithm RSA \
        -out "$CA_PRIVKEY" \
        -pkeyopt rsa_keygen_bits:4096;

# Exibir detalhes da chave privada:
openssl asn1parse -in $CA_PRIVKEY -inform PEM;
openssl rsa -noout -text -in $CA_PRIVKEY;

# Extrair chave pública:
CA_PUBKEY="/etc/ssl/ovpn-ca/ca.pub.pem";
openssl rsa -pubout -in $CA_PRIVKEY -out $CA_PUBKEY;

# Detalhes da chave publica:
cat $CA_PUBKEY;
openssl asn1parse -in $CA_PUBKEY -inform PEM;
openssl rsa -pubin -in $CA_PUBKEY -text -noout;

Gerar certificado auto-assinado da CA:

Bash
# Entra na pasta da CA:
cd /etc/ssl/ovpn-ca;

# Caminho da chave privada da CA:
CA_PRIVKEY="/etc/ssl/ovpn-ca/private/ca.key.pem";

# Caminho do certificado auto-assinado da CA:
CA_CERT="/etc/ssl/ovpn-ca/certs/ca.cert.pem";

# Gerar certificado auto assinado com 10 anos (3650 dias) de validade:
[ -f $CA_CERT ] || \
    openssl req \
        -x509 -new -nodes \
        -key $CA_PRIVKEY \
        -days 3650 \
        -sha256 \
        -set_serial 0xCAFECAFECAFE \
        -extensions v3_ca \
        -config /etc/ssl/ovpn-ca/openssl.cnf \
        -out $CA_CERT;

# Exibir detalhes do certificado:
cat $CA_CERT;
openssl x509 -noout -text -in $CA_CERT;

3 – Certificados do servidor

O servidor OpenVPN deve possuir sua chave privada e seu certificado assinado pela CA com a função (restrição) de ser usado somente para finalidades de servir.

Gerar chave privada e CSR do servidor OVPN

Bash
# Pasta para armazenar os arquivos, criar e acessar:
mkdir -p /etc/ssl/ovpn-ca/ovpn-server;
cd /etc/ssl/ovpn-ca/ovpn-server;

# Chave privada do Servidor 1 usando RSA:
SRVA_PRIVKEY="/etc/ssl/ovpn-ca/ovpn-server/key.pem";

# - gerar chave privada:
[ -f "$SRVA_PRIVKEY" ] || \
    openssl genpkey \
        -algorithm RSA \
        -pkeyopt rsa_keygen_bits:4096 \
        -out "$SRVA_PRIVKEY";

# Gerando CSR de servidor:
SRVA_CSR="/etc/ssl/ovpn-ca/csr/server.pem";

[ -f "$SRVA_CSR" ] || \
    openssl req \
        -new \
        -key $SRVA_PRIVKEY \
        -subj \
        "/CN=server.intranet.br/emailAddress=srv-a@intranet.br" \
        -addext keyUsage=critical,digitalSignature \
        -addext extendedKeyUsage=serverAuth \
        -out $SRVA_CSR;

# Exibindo todos os detalhes do CSR:
openssl asn1parse -in $SRVA_CSR -inform PEM;
openssl req -in $SRVA_CSR -text -noout;

Assinar CSR e gerar certificado do servidor (CRT)

Bash
# CSR do servidor:
SRVA_CSR="/etc/ssl/ovpn-ca/csr/server.pem";

# Certificado final:
SRVA_CERT="/etc/ssl/ovpn-ca/certs/server.pem";

# Chave privada da CA:
CA_PRIVKEY="/etc/ssl/ovpn-ca/private/ca.key.pem";

# Emitir certificado baseado no CSR recebido,
# assinar usando chave privada da CA:
[ -f $SRVA_CERT ] || \
    openssl ca \
        -config /etc/ssl/ovpn-ca/openssl.cnf \
        -in $SRVA_CSR \
        -out $SRVA_CERT \
        -days 3650 \
        -batch;

    # Using configuration from /etc/ssl/ovpn-ca/openssl.cnf
    # Check that the request matches the signature
    # Signature ok
    # The Subject's Distinguished Name is as follows
    # commonName            :ASN.1 12:'server.intranet.br'
    # emailAddress          :IA5STRING:'srv-a@intranet.br'
    # Certificate is to be certified until Oct  5 12:32:52 2035 GMT (3650 days)
    # 
    # Write out database with 1 new entries
    # Database updated

Com os arquivos gerados na CA, vamos copiá-los para a pasta do servidor OVPN:

Bash
# Criar pasta do servidor OpenVPN:
mkdir -p /etc/openvpn/server;

# Copiar chave privada do servidor A:
SRVA_PRIVKEY="/etc/ssl/ovpn-ca/ovpn-server/key.pem";
cp -rav "$SRVA_PRIVKEY" /etc/openvpn/server/priv.key;

# Copiar certificado assinado pela CA:
SRVA_CERT="/etc/ssl/ovpn-ca/certs/server.pem";
cp -rav "$SRVA_CERT" /etc/openvpn/server/cert.pem;

# Copiar certificado da CA:
CA_CERT="/etc/ssl/ovpn-ca/certs/ca.cert.pem";
cp -rav "$CA_CERT" /etc/openvpn/server/ca.pem;

4 – Criar servidor OpenVPN

Uma vez que o servidor já possui seus arquivos (chave privada, certificado assinado, certificado da CA) para participar do ambiente criptográfico seguro, vamos criar as configurações para criar o processo.

Pool de IPs e portas

Pool privado para clientes:

  • 10.129.128.0/24 (gateway 10.129.128.1, clientes de .2 a .254);

Vou deixar a configuração de IPv6 pronta e comentada, visto que ativá-lo sem ter Internet em IPv6 no servidor causará problemas nos clientes.

  • 2001:db8:cafe:a128::/64;

Vamos usar a porta padrão 1194. Se seu servidor não está utilizando a porta 443/udp para HTTPs/Quick/HTTP2/HTTP3, recomendo que essa seja a porta preferida visto que há menos problemas com firewalls e QoS, porta:

  • Servidor via UDP: porta 1194/udp;

Autenticação e criptografia

O OVPN faz uso de AEAD (Authenticated Encryption with Associated Data).

A autenticação OVPN pode operar com MD5, SHA1, SHA256 e SHA512. Usar SHA2 (256 ou 512) é mais seguro.

Vou optar pelo SHA256 , alem de ser o padrão, é mais amplo.

O OVPN suporta uma lista muito grande de cifras criptografias. Em modo performance DCO somente essas cifras são suportadas:

  • AES-128-GCM;
  • AES-256-GCM;
  • ChaCha20-Poly1305;

Compatibilidade com Mikrotik RouterOS

A Mikrotik optou por manter o OpenVPN restrito no RouterOS v6 e v7 (até 7.1.1) aos seguintes recursos:

  • Somente TCP;
  • Autenticação somente MD5, SHA1;
  • Cifras AES CBC: AES128-CBC, AES192-CBC, AES256-CBC;

As cifras GCM são suportadas apenas a partir do Mikrotik RouterOS 7.8.

Se quiser que seu servidor OpenVPN com ultra-performance funcione compatível com Mikrotik você deverá fazer upgrade para a versão 7 mais recente (7.8+).

Se for imperativo atender Mikrotik velho, recomendo criar outro servidor OVPN (processo separado) em uma porta TCP só para atender essas sucatas.

Preparativos do ambiente para o servidor

Vou criar o script de preparação do ambiente para garantir que o processo encontrará todos os recursos necessários prontos quando for iniciado:

Bash
# Script de setup do ambiente:
(
    echo '#!/bin/bash';
    echo;
    echo '# Diretorio de configuracoes especificas de clientes:';
    echo 'mkdir -p /etc/openvpn/client;';
    echo;
    echo '# Criar arquivo de leases do pool:';
    echo 'touch /etc/openvpn/server/pool.dat;';
    echo;
    echo '# Criar arquivo de status e log:';
    echo 'touch /run/opvn-server.status;';
    echo;
    echo 'mkdir -p /var/log/openvpn;';
    echo 'touch /var/log/openvpn/server.log;';
    echo;
    echo '# Garantir a existencia do ponteiro de interfaces TUN:';
    echo 'modprobe tun 2>/dev/null;';
    echo '[ -d /dev/net ] || mkdir -p /dev/net;';
    echo '[ -e /dev/net/tun ] || {';
    echo '    mknod /dev/net/tun c 10 200 2>/dev/null;';
    echo '    chmod u+rw,g+rw,o+rw /dev/net/tun;';
    echo '};';
    echo 'exit 0';
    echo;
) > /etc/openvpn/server/prepare.sh;
chmod +x /etc/openvpn/server/prepare.sh;

# Rodar manualmente:
/etc/openvpn/server/prepare.sh;

Criando configuração do servidor OVPN

Bash
# Criar configuracao principal (UDP)
(
    echo 'port 1194';
    echo 'proto udp';
    echo 'dev-type tun';
    echo 'dev ovpn-a';    
    echo;
    echo 'topology subnet';
    echo 'server 10.129.128.0 255.255.255.0';
    echo;
    echo '#server-ipv6 2001:db8:cafe:a128::/64';
    echo;
    echo 'push "redirect-gateway def1 bypass-dhcp"';
    echo;
    echo '#push "redirect-gateway def1 bypass-dhcp ipv6"';
    echo '#push "dhcp-option DNS6 2001:4860:4860::8888"';
    echo '#push "dhcp-option DNS6 2001:4860:4860::8844"';
    echo;
    echo 'ifconfig-pool-persist /etc/openvpn/server/pool.dat';
    echo 'client-config-dir /etc/openvpn/client';
    echo;
    echo 'auth SHA256';
    echo 'cipher AES-128-GCM';
    echo 'data-ciphers AES-128-GCM:AES-256-GCM';
    echo 'data-ciphers-fallback AES-128-GCM';
    echo;
    echo 'tls-server';
    echo 'tls-version-min 1.2';
    echo 'tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256';
    echo '#duplicate-cn';
    echo;
    echo 'ca /etc/openvpn/server/ca.pem';
    echo 'cert /etc/openvpn/server/cert.pem';
    echo 'key /etc/openvpn/server/priv.key';
    echo;
    echo 'persist-key';
    echo 'persist-tun';
    echo 'dh none';
    echo 'tls-groups X25519:secp384r1:secp256r1';
    echo;
    echo '#enable-dco';
    echo;
    echo 'sndbuf 393216';
    echo 'rcvbuf 393216';
    echo 'push "sndbuf 393216"';
    echo 'push "rcvbuf 393216"';
    echo 'fast-io';
    echo 'txqueuelen 1000';
    echo;
    echo 'compress migrate';
    echo 'push "compress migrate"';
    echo 'explicit-exit-notify 1';
    echo 'push "explicit-exit-notify"';
    echo;
    echo 'keepalive 10 120';
    echo 'writepid /run/opvn-server.pid';
    echo 'status /run/opvn-server.status 1';
    echo 'log-append /var/log/openvpn/server.log';
    echo 'mute-replay-warnings';
    echo 'verb 3';
    echo;
    echo '#script-security 3';
    echo '#client-connect      /usr/share/openvpn-client-up.sh';
    echo '#client-disconnect   /usr/share/openvpn-client-down.sh';
    echo;
) > /etc/openvpn/server/ovpn-srv.conf;

Executar para teste:

Bash
# Executar para teste:
openvpn --config /etc/openvpn/server/ovpn-srv.conf;

# CONTROL+C para abortar

# Conferir o log:
cat /var/log/openvpn/server.log;

Conferindo logs:

/var/log/openvpn/server.log
2025-10-07 12:03:11 OpenVPN 2.6.3 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO]
2025-10-07 12:03:11 library versions: OpenSSL 3.0.17 1 Jul 2025, LZO 2.10
2025-10-07 12:03:11 DCO version: 0.0+git20231103
2025-10-07 12:03:11 net_route_v4_best_gw query: dst 0.0.0.0
2025-10-07 12:03:11 net_route_v4_best_gw result: via 45.171.63.126 dev eth0
2025-10-07 12:03:11 net_iface_new: add ovpn-a type ovpn-dco
2025-10-07 12:03:11 DCO device ovpn-a opened
2025-10-07 12:03:11 net_iface_mtu_set: mtu 1500 for ovpn-a
2025-10-07 12:03:11 net_iface_up: set ovpn-a up
2025-10-07 12:03:11 net_addr_v4_add: 10.129.128.1/24 dev ovpn-a
2025-10-07 12:03:11 Could not determine IPv4/IPv6 protocol. Using AF_INET
2025-10-07 12:03:11 Socket Buffers: R=[31457280->786432] S=[31457280->786432]
2025-10-07 12:03:11 UDPv4 link local (bound): [AF_INET][undef]:1194
2025-10-07 12:03:11 UDPv4 link remote: [AF_UNSPEC]
2025-10-07 12:03:11 MULTI: multi_init called, r=256 v=256
2025-10-07 12:03:11 IFCONFIG POOL IPv4: base=10.129.128.2 size=253
2025-10-07 12:03:11 IFCONFIG POOL LIST
2025-10-07 12:03:11 Initialization Sequence Completed

Servidor configurado e testado.

Vamos criar a UNIT no systemd para controlar o servidor:

Bash
# Criar arquivo da UNIT no SystemD
(
    echo;
    echo '[Unit]';
    echo 'Description=OpenVPN Server';
    echo 'Documentation=man:openvpn(8)';
    echo 'After=network.target';
    echo 'Before=nss-lookup.target';
    echo 'Wants=nss-lookup.target';
    echo;
    echo '[Service]';
    echo 'Type=notify';
    echo 'Restart=always';
    echo 'ExecStartPre=-/etc/openvpn/server/prepare.sh';
    echo 'ExecStart=/usr/sbin/openvpn /etc/openvpn/server/ovpn-srv.conf';
    echo;
    echo '[Install]';
    echo 'WantedBy=multi-user.target';
    echo;
) > /usr/lib/systemd/system/openvpn-server.service;

# Atualizar systemd:
systemctl daemon-reload;

# Ativar servico:
systemctl enable openvpn-server;

# Iniciar servico:
systemctl stop  openvpn-server;
systemctl start openvpn-server;

# Conferir status do servico:
systemctl status openvpn-server;

5 – Gerar configuração dos clientes

Vamos criar uma base de dados em arquivos avulsos para cadastrar usuários e a partir dessa base gerar automaticamente todos os arquivos dos clientes:

Cada cliente precisa:

  • Chave privada do usuário;
  • Certificado do usuário assinado pela CA;
  • Certificado da CA;

O software OpenVPN Client precisa:

  • Arquivo de configuração .ovpn contendo os dados do cliente (acima) e os parâmetros do servidor (endereço, porta, opções de criptografia);

Gerando cadastro de clientes:

Bash
# Funcao para criar usuario
_ovpn_add_user(){
    ouser="$1";
    oemail="$2";
    (
        echo "user=$ouser";
        echo "email=$oemail";
    ) > /etc/openvpn/client/$ouser.cnf;
}

# Criar usuarios (exemplos):
_ovpn_add_user "suporte" "suporte@intranet.br";
_ovpn_add_user "guest"   "guest@intranet.br";
_ovpn_add_user "admin"   "admin@intranet.br";
_ovpn_add_user "mk001"   "mk001@intranet.br";

Com o script, cada arquivo .cnf no diretório /etc/openvpn/client/ é a definição de um usuário.

Agora vamos criar chaves, certificados e configuração OVPN para cada usuário:

Bash
# Funcao para criar chave privada do usuario
_ovpn_gen_privkey(){
    ouser="$1";
    opkey="/etc/ssl/ovpn-ca/private/user-$1-key.pem";
    echo "# [$ouser] Chave privada $opkey";
    [ -f "$opkey" ] && return;
    openssl genpkey \
        -algorithm RSA \
        -pkeyopt rsa_keygen_bits:4096 \
        -out "$opkey";
};

# Funcao para gerar CSR do usuario
_ovpn_gen_cert_request(){
    ouser="$1";
    oemail="$2";
    opkey="/etc/ssl/ovpn-ca/private/user-$1-key.pem";
    ocsr="/etc/ssl/ovpn-ca/csr/user-$1.pem";
    echo "# [$ouser] CSR $ocsr ~ $oemail";
    [ -f "$ocsr" ] && return;
    openssl req \
       -new \
       -key $opkey \
       -subj \
       "/CN=$ouser/emailAddress=$oemail" \
       -addext keyUsage=critical,digitalSignature,keyAgreement \
       -addext extendedKeyUsage=clientAuth \
       -out $ocsr;
};

# Funcao para assinar CSR do cliente com a chave da CA e gerar certificado
_ovpn_gen_ca_certificate(){
    ouser="$1";
    opkey="/etc/ssl/ovpn-ca/private/user-$1-key.pem";
    ocsr="/etc/ssl/ovpn-ca/csr/user-$1.pem";
    ocrt="/etc/ssl/ovpn-ca/certs/user-$1.pem";
    echo "# [$ouser] CA Certificate $ocrt";
    [ -f "$ocrt" ] && return;
    openssl ca \
        -config /etc/ssl/ovpn-ca/openssl.cnf \
        -in $ocsr \
        -out $ocrt \
        -days 3650 \
        -batch;
};

# Funcao para gerar arquivo OVPN do usuario:
_ovpn_gen_openvpn_client(){
    ouser="$1";
    osrvip="$2";
    osrvport="$3";
    opkey="/etc/ssl/ovpn-ca/private/user-$1-key.pem";
    ocrt="/etc/ssl/ovpn-ca/certs/user-$1.pem";
    ocfg="/etc/openvpn/client/$ouser.ovpn";
    cacrt="/etc/ssl/ovpn-ca/certs/ca.cert.pem";
    echo "# [$ouser] Generating OpenVPN Client Config: $ocfg";
    (
        echo "remote $osrvip $osrvport";
        echo 'proto udp';
        echo 'client'; echo 'nobind';
        echo 'dev tun'; echo 'resolv-retry infinite';
        echo 'persist-key'; echo 'persist-tun';
        echo 'remote-cert-tls server';
        echo 'auth SHA256'; echo 'cipher AES-128-GCM';
        echo 'data-ciphers AES-128-GCM:AES-256-GCM';
        echo 'tls-version-min 1.2';
        echo 'tls-cipher TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256';
        echo '<key>';  cat $opkey; echo '</key>';
        echo '<cert>'; cat $ocrt;  echo '</cert>';
        echo '<ca>';   cat $cacrt; echo '</ca>';
    ) > $ocfg;
}


# Configuracao de acesso do cliente
# - Coloque aqui o nome de DNS do servidor ou o IP do servidor
SERVER_ADDR="$(hostname -f)";
SERVER_PORT="1194";

# Percorrer arquivos de cadastro de usuarios e provisionar chaves e config OVPN
cd /etc/openvpn/client;
for user_file in *.cnf; do
    USER=$(egrep '^user=' "$user_file" | cut -f2 -d=);
    EMAIL=$(egrep '^email=' "$user_file" | cut -f2 -d=);
    echo "# ------ Usuario $USER, $EMAIL";
    _ovpn_gen_privkey "$USER";
    _ovpn_gen_cert_request "$USER" "$EMAIL";
    _ovpn_gen_ca_certificate "$USER";
    _ovpn_gen_openvpn_client "$USER" "$SERVER_ADDR" "$SERVER_PORT";
done;

Os arquivos dos clientes serão criados na pasta /etc/openvpn/client/ com o nome do usuário e a extensão .ovpn. Exemplo:

  • /etc/openvpn/client/suporte.ovpn

O arquivo .ovpn deve ser cadastrado no software de cliente OpenVPN.

6 – Software OpenVPN Client

Para se conectar ao servidor OpenVPN, instale o software cliente, site:

Caso ocorra problemas, consulte os logs do cliente e do servidor.

Terminamos por hoje!

Patrick Brandão, patrickbrandao@gmail.com