Configurando OpenVPN no RouterOS: Versões 6 e 7


Hoje, vamos aprender a configurar o OpenVPN no RouterOS, tanto na versão 6 quanto na 7. Com vasta experiência junto a ISPs, percebo que muitos ainda utilizam protocolos como PPTP, SSTP e L2TP, que oferecem menor segurança. Optar pelo OpenVPN é uma escolha superior, pois ele não só fornece criptografia robusta e configurações altamente personalizáveis, mas também garante uma proteção mais eficaz contra as vulnerabilidades comuns nesses protocolos menos seguros.

Para configurar nosso servidor OpenVPN, precisaremos de um IP público para acessar o servidor. Uma vantagem interessante é que esse IP pode estar em “blackhole“, o que significa que ele não responderá a nenhuma porta indiscriminadamente, economizando recursos da CPU ao evitar a criação extensiva de regras de firewall. Vou ilustrar essa configuração com um exemplo prático:

Imagine que você adquiriu um MikroTik Hex RB750Gr3 para gerenciar sua rede interna. Você conecta esse dispositivo ao seu roteador de borda. Para configurar a comunicação, você estabelece um segmento de rede /30, por exemplo, 10.7.7.0/30. No roteador de borda, você configura o IP 10.7.7.1/30, e no seu Hex RB750Gr3, você configura o IP 10.7.7.2/30. Em seguida, você adiciona um gateway padrão com o IP 10.7.7.1 e configura na tabela de rotas o IP 250.250.250.250 em balckhole.

No roteador de borda, você cria uma rota estática com destino a 250.250.250.250 com gateway 10.7.7.2. Com isso, você estabelece um caminho direto para o seu IP público, mas sem responder a nenhuma solicitação de conexão externa.

Se você precisar acessar o dispositivo via Winbox, basta criar uma regra de redirecionamento (redirect) para essa porta específica, permitindo o acesso externo somente por ela. Usar um IP em “blackhole” é como ter um firewall que automaticamente descarta qualquer pacote não solicitado, proporcionando uma camada extra de segurança e eficiência.

Exemplo acima ficaria da seguinte forma:

Borda

# Adicione o IP à interface que comunica com sua HE
/ip address add address=10.7.7.1/30 comment="WAN" interface=ether1

# Cria rota estática dizendo que seu IP público está atrás do endereço "tal"
/ip route add comment="Rota_HEX" dst-address=250.250.250.250/32 gateway=10.7.7.2

Hex RB750Gr3

# Adicione o IP à interface que comunica com sua Borda
/ip address add address=10.7.7.2/30 comment="WAN" interface=ether1

# Adiciona um gateway
/ip route add comment="Gateway" dst-address=0.0.0.0/0 gateway=10.7.7.1

# Adiciona seu IP público em blackhole
/ip route add blackhole comment="Blackhole" dst-address=250.250.250.250/32

# Redirect para winbox (Não use porta padrão para segurança, ex: 61000)
/ip firewall nat add action=redirect chain=dstnat comment="Winbox" \
    dst-address=250.250.250.250 dst-port=61000 protocol=tcp to-ports=8291

Configurando o Servidor OpenVPN

Para a criação do servidor OpenVPN, será necessário gerar três certificados distintos. Seguem os passos detalhados:

Crie o certificado CA (Certificado de Autoridade)

Para iniciar, crie o certificado da Autoridade Certificadora (CA), que será a base da confiança dos certificados subsequentes:

/certificate add name=CA common-name=CA key-usage=crl-sign,key-cert-sign

Após criar o certificado CA, você deve assiná-lo. Substitua 250.250.250.250 pelo seu IP público:

/certificate sign CA ca-crl-host=250.250.250.250

Crie e assine o certificado SERVIDOR

Este certificado será usado para autenticar o servidor durante as conexões:

/certificate add name=SERVIDOR common-name=SERVIDOR key-usage=digital-signature,key-encipherment,tls-server
/certificate sign SERVIDOR ca=CA
/certificate set SERVIDOR trusted=yes

Crie e assine o certificado CLIENTE

Em seguida, crie o certificado do cliente, que será utilizado pelos clientes para estabelecer uma conexão segura com o servidor:

/certificate add name=CLIENTE common-name=CLIENTE key-usage=tls-client
/certificate sign CLIENTE ca=CA

Exportação dos certificados

Por fim, exporte os certificados para arquivos PEM, o que facilitará a importação em diferentes clientes. Não se esqueça de substituir sup3s3nha0p3nvpn pela senha que protegerá o certificado do cliente:

/certificate export-certificate CA type=pem file-name=CA
/certificate export-certificate CLIENTE type=pem file-name=CLIENTE export-passphrase=sup3s3nha0p3nvpn

Este processo garante que tanto o servidor quanto os clientes possam estabelecer uma conexão VPN segura através do uso de certificados confiáveis.

Irá ser criado 3 arquivos CA.crt, CLIENTE.crt e CLIENTE.key

/file print 
 # NAME                             TYPE                                   SIZE CREATION-TIME       
 0 CA.crt                           .crt file                              1180 apr/12/2024 14:33:11
 1 CLIENTE.crt                      .crt file                              1143 apr/12/2024 14:33:16
 2 CLIENTE.key                      .key file                              1858 apr/12/2024 14:33:16

Pelo menu FILE do winbox faça download do mesmo se você estiver utilizando a versão 6 do RouterOS, para versão 7 não é necessário baixar, pois o mesmo tem um gerador que iremos ver mais a frente.

Agora vamos as configurações que serão entregues ao cliente. Crie uma pool qual será entregue.

/ip pool 
add name=POOL_OpenVPN ranges=192.168.250.128/25

Crie um o profile especifico para OPEN_VPN, no exemplo estou definindo também uma velocidade de 50MB de upload e download.

/ppp profile
add change-tcp-mss=yes local-address=192.168.250.1 name=OPEN_VPN rate-limit=50m/50m remote-address=POOL_OpenVPN use-encryption=yes

Se você deseja ser notificado via Telegram sempre que alguém se conectar ao seu servidor VPN (algo que eu recomendo e costumo fazer), você pode facilmente configurar essa integração editando o perfil no servidor e incluindo um script para enviar alertas. Para isso, siga os passos abaixo:

1. Acesse o perfil do servidor VPN (OPEN_VPN) e localize a aba “Scripts”.
2. Insira o script fornecido, substituindo `XXXXXXXXXXXXXXXXXXXXXX` pelo token do seu bot no Telegram, e `-10000000000` pelo ID do seu grupo ou usuário do Telegram.
# On Up:

:local callerId $"caller-id"
/tool fetch url="https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXX/sendMessage\?parse_mode=HTML&chat_id=-10000000000&text=%E2%9D%8E%20OpenVPN%20ON%20USUARIO:%20<code>$user</code>%20ORIGEM:%20<code>$callerId</code>&disable_web_page_preview=true" keep-result=no

# On Down:

:local callerId $"caller-id"
/tool fetch url="https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXXX/sendMessage\?parse_mode=HTML&chat_id=-10000000000&text=%E2%9D%8C%20OpenVPN%20OFF%20USUARIO:%20<code>$user</code>%20ORIGEM:%20<code>$callerId</code>&disable_web_page_preview=true" keep-result=no

Esse ajuste permitirá que você receba uma notificação imediata sempre que ocorrer uma conexão, aumentando o controle e a segurança da sua rede.

Faça uma regra de NAT (src-nat) para fornecer internet ao cliente, onde 250.250.250.250 é nosso querido IP que está em blackhole, e ether1 seria minha interface WAN (Upstream)

/ip firewall nat
add action=src-nat chain=srcnat comment="NAT_OpenVPN" out-interface=ether1 \
    src-address=192.168.250.128/25 to-addresses=250.250.250.250

Iremos ativar o servidor OpenVPN agora, a porta padrão é a 1194, porem estarei adotando a boa pratica de utilizar outra como a 61194

Para RouterOS v7 (Recomendado) ✅

/interface ovpn-server server
set auth=sha1 certificate=SERVIDOR cipher=aes256-cbc,aes256-gcm default-profile=OPEN_VPN \
    enabled=yes netmask=24 redirect-gateway=def1,ipv6 require-client-certificate=yes port=61194

Para RouterOS v6 (Não recomendo) ❌

/interface ovpn-server server
set auth=sha1 certificate=SERVIDOR cipher=aes256 default-profile=OPEN_VPN \
    enabled=yes require-client-certificate=yes port=61194

Crie seus usuários, vou criar um de exemplo:

/ppp secret add comment="Key: sup3s3nha0p3nvpn" name=remontti@remontti.vpn profile=OPEN_VPN service=ovpn password=su4senhAparaL0gar 

Você pode também utilizar os usuários via Radius, basta fazer a integração. Exemplo:

/ppp aaa set interim-update=5m use-radius=yes
/radius add address=10.10.10.10 secret=senha service=ppp

Na versão 7 do routerOS podemos criar nosso arquivo.ovpn direto pelo botão Export .ovpn

Altere server-address para seu endereço de ip público.

/interface ovpn-server server export-client-configuration \
    server-address=250.250.250.250 
    ca-certificate=CA.crt \
    client-certificate=CLIENTE.crt \
    client-cert-key=CLIENTE.key 

Se estiver utilizando o ip em blackhole vc precisa fazer o redirect para porta que irá utilizar ex.: “61194”

/ip firewall nat add action=redirect chain=dstnat comment="OpenVPN" \
    dst-address=250.250.250.250 dst-port=61194 protocol=tcp to-ports=61194

Veja os arquivos novamente.

/file print 

Perceba que temos agora um novo arquivo client1712413538.ovpn, faça donwload do mesmo e pule a próxima etapa da versão 6 direto para configuração do cliente OpenVPN.

#  NAME                   TYPE        SIZE  CREATION-TIME      
0  CLIENTE.key            .key file   1858  2024-04-06 10:53:13
1  client1712413538.ovpn  .ovpn file  4393  2024-04-06 11:25:38
2  CLIENTE.crt            .crt file   1090  2024-04-06 10:53:13
3  CA.crt                 .crt file   1123  2024-04-06 10:53:07

Para versão 6 do RouterOS você ira precisar baixar os arquivos CA.crt CLIENTE.crt CLIENTE.key para criar o arquivo de configuração do OpneVPN.
Abra os arquivos CA.crt CLIENTE.crt CLIENTE.key em um editor de texto (recomendo o sublime-text, ou VS code) em seguida crie um novo arquivo e adicione as seguintes informações, fazendo a alteração do seu IP público bem como a porta, e pegando o que tem dentro de cada arquivo CA.crt CLIENTE.crt CLIENTE.key e adiconao aos respectivos CA.crt, CLIENTE.crt e CLIENTE.key

client
dev tun
remote 250.250.250.250 61194 tcp
nobind
user nobody
group nogroup
persist-tun
persist-key
tls-client
remote-cert-tls server
verb 4
mute 10
cipher AES-256-CBC
auth SHA1
pull
auth-user-pass
connect-retry 1
reneg-sec 3600
remote-cert-tls server
redirect-gateway def1
<ca>
-----BEGIN CERTIFICATE-----
CA.crt
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
CLIENTE.crt
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN ENCRYPTED PRIVATE KEY-----
CLIENTE.key
-----END ENCRYPTED PRIVATE KEY-----
</key>

Vai ficar um arquivo parecido com esse:

client
dev tun
remote 250.250.250.250 61194 tcp
nobind
user nobody
group nogroup
persist-tun
persist-key
tls-client
remote-cert-tls server
verb 4
mute 10
cipher AES-256-CBC
auth SHA1
pull
auth-user-pass
connect-retry 1
reneg-sec 3600
remote-cert-tls server
redirect-gateway def1
<ca>
-----BEGIN CERTIFICATE-----
MIIDNzCCAh+gAwIBAgIIEa583zOzhvEwDQYJKoZIhvcNAQELBQAwDTELMAkGA1UE
AwwCQ0EwHhcNMjQwNDEyMTUyNDM1WhcNMjUwNDEyMTUyNDM1WjANMQswCQYDVQQD
DAJDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMIYmmWcnfNemX4y
qoMtDdHC38QKisZm9STkEAA2O5mt+5MXOLabl/EaQ7d6A/2VdErfLmtrFJawMe9d
t17MIR5zx21kiU517oYP/N8kGAnBaS9T7ykm+0QADoCNkwvY3QgLaPlQ+zqxdLRs
GQazmVZs56WuVs+dMw3xFaLfRQ0Uo6f06ZNvkNb8cwwWgYmNvtsu1bVoC5Qze7tN
7cFFITzP/9bZ+PDI7MXOGu4+TdtvdXqkwoT+xIDJWyrtltGf12kpnug68wImuULB
hj20xUu7JIriC548fiITsCuCQMXrDqmD198uO1vua1bT5TG66MUoOt4JlNpA3lDE
GkEVmTsCAwEAAaOBmjCBlzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
BjAdBgNVHQ4EFgQUQc5chT+ppPMFLhJzgHG1IpI/n4wwLwYDVR0fBCgwJjAkoCKg
IIYeaHR0cDovLzE5Mi4xNjguODcuNzgvY3JsLzQuY3JsMCQGCWCGSAGG+EIBDQQX
FhVHZW5lcmF0ZWQgYnkgUm91dGVyT1MwDQYJKoZIhvcNAQELBQADggEBADM/SWAb
hr92v8HPSN16X+OpW+UeECfW3AgrhvKQS+fND3Q9prpaDkjoT4nDjrJugQDoUYPk
/lS8JYNtYJTD4TZCkBWP+MuU28f5LauPEts6SVPDZtYULyzhucUEMc2jOlfvEG7A
Gwsx7A7u4rpPqxosc+hsIKmQH76ek9Z28mehqMJy9DBovsiXX1r1CVwXkLWDh7jd
djSAZtGoFectyi6+o8An9apgowZNZ+JCWVBmrYTO4qK92+IxHADQjvaEzOCxCtyg
QgQbPjAKOvm24ula5oBklkiZm2Rm0Yoz+7L80MOIa6TR1OjhxO5GyiD18P31hDOQ
e6HtZo2SNOZzCdY=
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIIDHjCCAgagAwIBAgIIN0BpgvHnwhUwDQYJKoZIhvcNAQELBQAwDTELMAkGA1UE
AwwCQ0EwHhcNMjQwNDEyMTUyNDUyWhcNMjUwNDEyMTUyNDUyWjASMRAwDgYDVQQD
DAdDTElFTlRFMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv4bHxnI/
yXgt9YZPm3PFXqIRrPp6uQ/LMtIKzRDzNLIwvaYt/CCG5IJhypCQ5RRwJT4mXgfZ
EAZMFheAxSpicMW+PMPb1wxsaY5ScLHadFZAjTr6jX03DcHYNTYbp7vjmwub2l2i
H5uspiNVd8vfhDbWLHWWVF7AQr3JhvpfqfwuQOumKS2YMgclm8gvS6xOK3yzjbJN
haInSxW/dZ+K5TvHQoWI0Sed1CnwclqaNlZ3ZnBEo+AQsmZAdPIGMBAUzSce0IWG
gdJ5aJcLGyyBFtD7dKiu6Edw3VXYPYL5BxYZZmuCxRBrMsF/pn7PysL8c+zQHVMG
G0N+2CNl2QMvswIDAQABo30wezATBgNVHSUEDDAKBggrBgEFBQcDAjAdBgNVHQ4E
FgQU+BGSwQZzquO78TqnOuVThda5rBMwHwYDVR0jBBgwFoAUQc5chT+ppPMFLhJz
gHG1IpI/n4wwJAYJYIZIAYb4QgENBBcWFUdlbmVyYXRlZCBieSBSb3V0ZXJPUzAN
BgkqhkiG9w0BAQsFAAOCAQEAtBx/v0gK77wfZ9FF8HRamSq+AlFVfhG/U1F7QFet
7lFuUFaHVsthuZd0hl+5ROGg6PYY3hBqlxSRTIpIJbc1SagYN/VWQII4WmSbOsH9
JJ+acT7/50jP6lupGgm3D7NWA4TuAgj4zM6JGGs3mSZC5wopcTaNHQdYWEcgTxTZ
sLdGdqed6uwhzgd2WJkHodw/VBWZY3DCEhdSQrL28EdUTTL5GPjL808XYDmZxNY1
i/ETg1rgqRCyVK4PxTsv9Q+Uojm5VCrtFE9RbhOOJ6mQbc2A89jUJjOePyiibNrR
O9Grbfxs7X+McwFY2L3brEhvVOXcCYSlvPwAeVMrfoMBnQ==
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIKvlmN1xHRN0CAggA
MB0GCWCGSAFlAwQBKgQQ0p5lAo+C1IcQl5tWd6V/0wSCBNC5KBKl3fXKbE39nPKP
09W1bx5E5HIjQsTFvZ42hMVq26tSj6uAnwSkclb2C1AMbsUq+f/39n4ljOyc7cIh
H8ekZuMiUEwXORj5slJtL/XfaelsWFC23jSwJa+DOzMTW9NKY0yCRjhV8DWHlHbu
ykfmELXTBQ1AKavjijpF2PBo0KGBzVM/osmMUtTBmUG4NxUKeFndncgDFAm3BZXZ
gqRsntzB9YlWujVh6VLaBOoZMs3w7kctPLsXb76k6MHszXGEQSUGelRQf4rzwbem
aO8hb/UVpZsOZBuR1bBDxY8gVlfaAl7qM8Wqa7xT5joq2YfbJkmK7z33JxFdqF5E
FVkEEulX0BhklPPzxa7XTO1Cf+AWTp2J1AGA+zX23kiGOoQHCuQUjxapLcLnjgni
ySqPKgTjKKM8gH/G+2OiUSew5Pev0pCwSKxXYI1Mih+2dT2dn4aQ6C7RqCyacs5t
lKsWk++FuBu9yjdht59OGfYnqw3NC7Drj5HtTupHA1KhMWAPSA/8Pf0Qht3Dyxtb
4OtpqZWig26Iuj5rYvFEQuUaIsHARkLFS9a2CCDziv0w1bMYqCXvTEHuK8Ur/ilr
zmLxYvd5G5DQxro9LO7/Y5tZViTXNXbbprq0/EM6eq103y3ihe1PLKLOivnHYqTI
+yx3wER+Q4aCuTka38PnYI1U2Vtg+YYVcKSiihSboZjXaZgQt3BMf+ImuKpYs9tL
oKkVG/R0Ox1o/2zfD7QkBa7eKhloX4h7/1bMmzfFxSI1BTCAHYx1LsvLqLskxEiI
oE1EDGmho+B/Y6q37V5vYilXNBeYPgHlK1xa+zJIBT1q0OWGGy41jKmp8EVUNt5v
2D3Eq03Mn75WCKk4lWnYTYGXREFpymHmdgyj8W4WsEnOF3YHsummGDfQC8xiforj
JJ+kJYVDALhAFlNsUH2tg6e2Y6mzkoBB6nNftEwymBPTT4fLJ17+cw8uCQGnPS7f
+ESSpTv0UVudkkh5BNLxFaFgbBR+KlZzrhofidgul3QxwEjG0euLnFhxayWTYPyp
7lPtaDyqQr/3Ugr004UtyW6ke7pdifXaMSy3RgMB8FGucXsulrMs1rXH5L3oo0WE
j9l9YhVlSXRVT4v3SX0qhenBSeqM0wRyzQ7WkXtSoDhvxB+Aq9e643ukTr8i0CVX
uIsahiZDRne2ZQjABdl6wH405kLNNyHLllxt+Zq/DR8K32bzX2M7Z4tHGsDfUKQA
7xul6vy6C2fDcysIwQ063HX20ijgsz6J5JUOUksvmxlWvo+QNrd6I83AMd5txth7
IWIxkxa1/Pg5MnZDgU4xE98k4daDyZZhP4bukgwNh6I8XTpUhJJ1pGJBTcJGhtOE
6106QzFZmFJmYfNzipJLj9VYT3gg0BZ+RvdnI/ys9AuDwStHHTYL4PVyviTCFiEK
7Ht9fE7ZbJIN7Wn1GHtblBHN6UfMo8LrOKjc6Mwd72xgt31y/yvu6GJ8ogrE6Eld
Jut0hQFe56DUUZGypT60V6FhicMpmGITV7rWerqi1dUOjxtnu/0qjmFSNh9BkO8D
R6/Hu/sO0NQ3DEoFfBsvFEJEoKE42bu/77bmf/fRAlSVlkkCACfadriWsnAgsPpN
Bx9ydlEvJUDqxyfgA1jbK3c5/A==
-----END ENCRYPTED PRIVATE KEY-----
</key>

</key>

Cliente OpenVPN

Acessando https://openvpn.net/client/ voce encontra cliente para Windows, MacOS, Linux, Android, iOS e ChromeOS.

Com o cliente instalado basta você importar o arquivo .ovpn e infomar seu usuário e senha, ao conectar pela primeira vez irá solicitar a chave do certificado.

No linux você pode configurar também automaticamente nas configurações de rede sem a necessidade de instalar nenhum programa.

Gostou? Quer ajudar manter o blog? 🙂

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

8 Resultados

  1. No meu caso consegui fazer rodar criando a CA sem ip publico no ROS 6.46.7 – funcionou em blackhole com redirect!!

  2. Seu Remontti, teria alguma “solução” para quem não tem ip publico mas usando algum serviço com no-ip ou duckdns?

  3. Jonas disse:

    Remontti, eu estou usando gnome 43.9 , e ao importar o arquivo .ovpn preenche tudo certo, mas a hora de conectar fica pedindo autenticação em loop, não passa disso e não conecta

  4. Iuri Silveira Santos disse:

    e é possivel fazer funcionar não só com ipv4, mas com ipv6 também

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *