Ubuntu openvpn


Esta página dará um ideia de como subir um openvpn server, é mais simples do que parece mas requer uma porção de passos, a parte do ubuntu fica limitada ao comando para instalar o serviço, portanto você pode usar esse conhecimento outros OS tb :)

Sobre o OpenVPN

O Open vpn é uma solução gratuita para VPN - se você não faz ideia do que seja isso, utilize um dos links abaixo para saber mais

Objetivo

Vamos configurar um servidor remoto, na internet, para permitir que um determinado usuário faça parte da rede remota com um certificado (para melhorar a segurança)

  • (também irei criar um tutorial para integrar autenticação de usuário e senha com ldap / servidor linux) - quando o fizer deixo o link embaixo

Mãos a Obra

Para ajudar, um pequeno “flow” do que vamos fazer:

  1. Instalar o Servidor
  2. Copiar uns arquivos base para não perder tempo escrevendo tudo
  3. Executar uns scripts
  4. Gerar a chave do servidor e Clientes
  5. Configurar o servidor
  6. Testado

Instalar o Servidor

Digite o comando

sudo apt-get install openssh

Copiando arquivos Modelos

Agora que já instalamos, precisamos copiar uns arquivos de configuração, o openvpn não é um programa que você instala e pronto, é necessário configurar tudo (talvez por segurança)

Arquivos Padrões

Copiando e já renomeando tudo

cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn
mv /etc/openvpn/openssl-1.0.0.cnf /etc/openvpn/openssl.cnf

Agora precisamos editar umas variáveis padrões, não é tão necessário assim, mas é bom deixar tudo certo

* Editar o arquivo /etc/openvpn/vars (as últimas linhas)

Os campos são auto explicativos, 3650 no KEY_EXPIRE vale 10 anos, mas é referente a chave do servidor.

# generation process.
export KEY_SIZE=1024

# In how many days should the root CA key expire?
export CA_EXPIRE=3650

# In how many days should certificates expire?
export KEY_EXPIRE=3650

# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="BR"
export KEY_PROVINCE="SP"
export KEY_CITY="Campinas"
export KEY_ORG="RagazziD"
export KEY_EMAIL="d@ragazzid.com.br"
export KEY_CN="RagazziD.com"
export KEY_NAME="ServidorVPN.ragazzid.com.br"
export KEY_OU="RagazziD - TI"
#export PKCS11_MODULE_PATH=changeme (aqui é pra qndo for usar token)
#export PKCS11_PIN=1234 (aqui também)

Executar uns scripts

Esses scripts que vamos gerar servem para limpar o servidor e preparar ele para receber novas chaves, sabemos que ele está limpo, mas isso serve pra pegar a config existente e aplicar pra tudo, é necessário fazer isso pelo menos 1 vez (ou sempre que você quiser dar uma limpa):

  • No build-ca ele vai pedir para você configurar ou editar uns valores que configuramos no vars
  • No build-dh ele irá criar a chave diffie hellman para troca de chaves (necessária pra vpn)
cd /etc/openvpn
source /etc/openvpn/vars
/etc/openvpn/clean-all
/etc/openvpn/build-ca
/etc/openvpn/build-dh

Agora temos algum conteúdo novo dentro de /etc/openvpn/keys/

  1. ca.crt - Certificado Público de sua CA - Temos que compartilhar esse certificado com os clientes VPN
  2. ca.key - Chave Privada de sua CA.
  3. dh1024.pem - Parâmetros do Diffie-Hellman.
  4. index.txt - Controle das chaves geradas pela nova CA.
  5. serial - Controle de número serial das chaves geradas pela nova CA.

Gerando Chaves

É utilizado 2 comandos diferentes para criar arquivos que vão para a mesma pasta, vai entender né? Mas aqui vão eles:

  • /etc/openvpn/build-key-server
  • /etc/openvpn/build-key-pass
build-key-server

É o comando utilizado para criar as chaves do servidor, que iremos configurar posteriormente no /etc/openvpn/server.conf (eu sei que ainda não criamos ele)

Aqui vai meu output:

root@ragazzid:/etc/openvpn# ./build-key-server server
Generating a 1024 bit RSA private key
..++++++
.........................++++++
writing new private key to 'server.key'
-----
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.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Campinas]:
Organization Name (eg, company) [RagazziD]:
Organizational Unit Name (eg, section) [RagazziD - TI]:
Common Name (eg, your name or your server's hostname) [server]:
Name [RagazziD]:
Email Address [d@ragazzid.com.br]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'BR'
stateOrProvinceName   :PRINTABLE:'SP'
localityName          :PRINTABLE:'Campinas'
organizationName      :PRINTABLE:'RagazziD'
organizationalUnitName:PRINTABLE:'RagazziD - TI'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'RagazziD'
emailAddress          :IA5STRING:'d@ragazzid.com.br'
Certificate is to be certified until Jul 25 20:39:56 2024 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Em “A challenge password []:” se você digitar algo ai, todos os certificados dos usuários

Quando esses comandos forem concluídos, teremos 2 arquivos novos no keys (para cada que você digitar)

  • .crt
  • .key
build-key-pass

Para cada novo cliente que você quiser que alcance sua vpn, faça o procedimento execute o comando abaixo:

/etc/openvpn/build-key-pass

Insira as informações do usuário, na verdade essa parte pode ser feita no máquina do usuário, ai você só coloca a chave pública e certificado dele no seu servidor, assina eles e pronto, mas ok.

Aqui vai meu output:

root@ragazzid:/etc/openvpn# ./build-key-pass DiegoR
Generating a 1024 bit RSA private key
..++++++
........++++++
writing new private key to 'DiegoR.key'
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.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Campinas]:
Organization Name (eg, company) [RagazziD]:
Organizational Unit Name (eg, section) [RagazziD - TI]:
Common Name (eg, your name or your server's hostname) [DiegoR]:
Name [RagazziD]:Diego Ragazzi
Email Address [d@ragazzid.com.br]:    

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'BR'
stateOrProvinceName   :PRINTABLE:'SP'
localityName          :PRINTABLE:'Campinas'
organizationName      :PRINTABLE:'RagazziD'
organizationalUnitName:PRINTABLE:'RagazziD - TI'
commonName            :PRINTABLE:'DiegoR'
name                  :PRINTABLE:'Diego Ragazzi'
emailAddress          :IA5STRING:'d@ragazzid.com.br'
Certificate is to be certified until Jul 25 20:51:04 2024 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries

Agora 3 novos arquivos foram criados dentro do keys:

  • DiegoR.csr - Solicitação do novo certificado
  • DiegoR.crt - Certificado público
  • DiegoR.key - Chave privada

Quando o usuário cria esses arquivos, ele manda apenas o .csr e o .crt para o servidor, o .key NUNCA deve ser compartilhado, nesse caso o servidor precisa mandar os 3 arquivos pro cliente, mas fazer oq né?

Também é necessário mandar o certificado público do sevidor, ca.crt para que haja comunicação e troca de chaves. Se você configurou uma chave TLS tem que enviar também!

Configurando o Servidor

Se quiser configurar a chave tls:

openvpn --genkey --secret /etc/openvpn/keys/ta.key

Para configurar o servidor teremos de ter um arquivo ponto conf (.conf) na pasta /etc/openssh/ então vamos usar o nome server.conf (porque eu quero), mas não iremos criar do nada, vamos pegar algo pronto da lib :)

zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz > /etc/openvpn/server.conf

Agora vamos editar esse arquivo ai, qundo você o abrir ele já vai ser auto explicativo, mas vou deixar em baixo os campos mais importantes:

  • local 10.0.0.1 #muda isso ai pro IP da interface que vai receber as conexões VPN
  • server 10.15.0.0 255.255.255.0 # rede que os clientes vpn irão fazer parte
  • push “route 10.0.0.0 255.0.0.0” #adicionar umas rotas para os clientes
  • push “dhcp-option DNS 10.0.0.10” #adicionar um servidor DNS
  • push “dhcp-option DOMAIN blogdonerd.com.br” #adicionar um domínio
  • tls-auth /etc/openvpn/keys/ta.key 0 # se tiver criado

Feito isso, basta iniciar o serviço

service openvpn start

Testando

Vá no seu cliente, windows / mac / linux e tente se conectar, lembrando que o cliente deve ter os seguintes 3 arquivos:

  • ca.crt (certificado do servidor)
  • cliente.key (chave privada do cliente)
  • cliente.crt (certificado do cliente)

É um parto configurar openvpn no windows, no linux é instalar umas coisas e tudo fica fácil, no mac eu não lembro, porém vou deixar um link para que você possa configurar por você mesmo:

Windows

Ubuntu Considerar a partir de GUI Tools for Connecting to OpenVPN

Vou ficar de vendo pra MAC :(