One place for hosting & domains

      Como configurar um servidor OpenVPN no Debian 9


      Introdução

      Quer acessar a Internet com segurança do seu smartphone ou notebook, enquanto estiver conectado a uma rede não confiável como o Wi-Fi de um hotel ou café? Uma Virtual Private Network (VPN) permite que você atravesse redes não confiáveis com privacidade e segurança como se estivesse em uma rede privada. O tráfego emerge do servidor VPN e continua sua jornada para o destino.

      Quando combinado com conexões HTTPS, esta configuração permite que você proteja seus logins e transações sem fio. Você pode contornar restrições geográficas e de censura, e proteger seu local e qualquer tráfego HTTP não criptografado da rede não confiável.

      O OpenVPN é uma solução VPN de código aberto Secure Socket Layer (SSL) completa que acomoda uma ampla gama de configurações. Neste tutorial, você irá configurar um servidor OpenVPN em um servidor Debian 9 e, em seguida, configurar o acesso a ele do Windows, macOS, iOS e/ou Android. Este tutorial irá manter os passos de instalação e configuração o mais simples possível para cada uma dessas configurações.

      Nota: Se você planeja configurar um servidor OpenVPN em um Droplet DigitalOcean, fique ciente de que nós, como muitos provedores de hospedagem, cobramos por excesso de largura de banda. Por este motivo, tenha cuidado acerca de com quanto tráfego seu servidor está lidando.

      Veja esta página para maiores informações.

      Pré-requisitos

      Para completar este tutorial, você precisará de acesso a um servidor Debian 9 para hospedar seu serviço OpenVPN. Você precisará configurar um usuário não root com privilégios sudo antes de iniciar este guia. Você pode seguir nosso guia de configuração inicial do servidor Debian 9 para configurar um usuário com permissões apropriadas. O tutorial em questão também irá configurar um firewall, que assumimos que esteja em funcionamento durante todo este guia.

      Além disso, você precisará de uma máquina separada para servir como sua autoridade de certificação (CA). Embora seja tecnicamente possível usar seu servidor OpenVPN ou sua máquina local como sua CA, isso não é recomendado pois abre seu VPN para algumas vulnerabilidades de segurança. Baseando-se na documentação oficial do OpenVPN, você deve colocar sua CA em uma máquina autônoma que seja dedicada a importar e assinar pedidos de certificado. Por isso, este guia supõe que seu CA esteja em um servidor Debian 9 separado que também tenha um usuário não root com privilégios sudo e um firewall básico.

      Note que se você desativar a autenticação por senha enquanto configurar esses servidores, pode ter dificuldades ao transferir arquivos entre eles mais tarde neste guia. Para resolver este problema, você pode reativar a autenticação por senha em cada servidor. Como alternativa, você poderia gerar um par de chaves SSH para cada servidor, então adicionar a chave SSH pública do servidor OpenVPN no arquivo CA authorized_keys da máquina e vice-versa. Veja Como configurar as chaves SSH no Debian 9 para instruções sobre como utilizar qualquer uma dessas soluções.

      Quando tiver esses pré-requisitos funcionando, siga para o Passo 1 deste tutorial.

      Passo 1 — Instalando o OpenVPN e o EasyRSA

      Para começar, atualize o índice de pacotes do seu servidor VPN e instale o OpenVPN. O OpenVPN está disponível nos repositórios padrão do Debian, então você pode usar o apt para a instalação:

      • sudo apt update
      • sudo apt install openvpn

      O OpenVPN é um VPN TLS/SSL. Isso significa que o OpenVPN utiliza os certificados para criptografar o tráfego entre o servidor e os clientes. Para emitir certificados confiáveis, você irá configurar sua própria autoridade de certificação (CA) simples. Para fazer isso, vamos baixar a última versão do EasyRSA, que vamos usar para construir nossa infraestrutura de chaves públicas (PKI) CA, do repositório oficial do projeto no GitHub.

      Como mencionado nos pré-requisitos, vamos construir a CA em um servidor autônomo. A razão para esta abordagem é que, se um agressor fosse capaz de se infiltrar no seu servidor, eles seriam capazes de acessar sua chave privada CA e usá-la para assinar novos certificados, dando-lhes acesso ao seu VPN. Dessa forma, gerenciar a CA a partir de uma máquina autônoma ajuda a evitar que usuários não autorizados acessem seu VPN. Note também que é recomendado que você mantenha o servidor CA desligado quando não estiver sendo usado para assinar chaves como uma medida de precaução adicional.

      Para começar a construir a infraestrutura CA e PKI, utilize o wget para baixar a última versão do EasyRSA tanto na máquinas CA quanto no seu servidor OpenVPN. Para obter a última versão, vá até a página Releases no projeto oficial do EasyRSA no GitHub, copie o link de download para o arquivo que termina em .tgz e então cole-o no seguinte comando:

      • wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz

      Então, extraia o tarball:

      • cd ~
      • tar xvf EasyRSA-3.0.4.tgz

      Você instalou todos os softwares necessários com sucesso no seu servidor e máquina CA. Continue para configurar as variáveis usadas pelo EasyRSA e configurar um diretório CA, do qual você irá gerar as chaves e certificados necessários para que seu servidor e clientes acessem o VPN.

      Passo 2 — Configurando as variáveis do EasyRSA e construindo a CA

      O EasyRSA vem instalado com um arquivo de configuração que você pode editar para definir uma série de variáveis para sua CA.

      Na sua máquina CA, navegue até o diretório do EasyRSA:

      Dentro deste diretório há um arquivo chamado vars.example. Faça uma cópia deste arquivo, e dê à cópia o nome de vars sem uma extensão de arquivo:

      Abra este novo arquivo com seu editor de texto preferido:

      Encontre as configurações que definam padrões de campo para novos certificados. Eles se parecerão com isso:

      ~/EasyRSA-3.0.4/vars

      . . .
      
      #set_var EASYRSA_REQ_COUNTRY    "US"
      #set_var EASYRSA_REQ_PROVINCE   "California"
      #set_var EASYRSA_REQ_CITY       "San Francisco"
      #set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
      #set_var EASYRSA_REQ_EMAIL      "me@example.net"
      #set_var EASYRSA_REQ_OU         "My Organizational Unit"
      
      . . .
      

      Descomente essas linhas e atualize os valores destacados para os que preferir, mas não os deixe em branco:

      ~/EasyRSA-3.0.4/vars

      . . .
      
      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        "DigitalOcean"
      set_var EASYRSA_REQ_EMAIL      "admin@example.com"
      set_var EASYRSA_REQ_OU         "Community"
      
      . . .
      

      Quando você terminar, salve e feche o arquivo.

      Dentro do diretório do EasyRSA está um script chamado easyrsa que é chamado para realizar uma variedade de tarefas envolvidas com a construção e gerenciamento da CA. Execute este script com a opção init-pki para iniciar a infraestrutura de chaves pública no servidor CA:

      Output

      . . . init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/sammy/EasyRSA-3.0.4/pki

      Depois disso, chame o script easyrsa novamente, seguindo-o com a opção build-ca. Isso irá construir a CA e criar dois arquivos importantes — ca.crt e ca.key — que constituem os lados público e privado de um certificado SSL.

      • O ca.crt é o arquivo de certificado público CA que, no contexto do OpenVPN, é usado pelo servidor e pelo cliente para informar um ao outro que fazem parte da mesma rede de confiança e não são alguém executando um ataque man-in-the-middle. Por essa razão, seu servidor e todos os seus clientes precisarão de uma cópia do arquivo ca.crt.
      • A ca.key é a chave privada que a máquina CA usa para assinar chaves e certificados para servidores e clientes. Se um agressor ganha acesso à sua CA e, por sua vez, seu arquivo ca.key, ele poderá assinar pedidos de certificado e obter acesso ao seu VPN, impedindo sua segurança. Esse é o motivo pelo qual seu arquivo ca.key deve estar apenas na sua máquina CA e que, idealmente, sua máquina CA deve ser mantida off-line quando não estiver assinando pedidos de certificado como uma medida de segurança extra.

      Se você não quiser ser solicitado a colocar uma senha sempre que interagir com sua CA, é possível executar o comando build-ca com a opção nopass, desta maneira:

      • ./easyrsa build-ca nopass

      No resultado, será solicitado que você confirme o nome comum para sua CA:

      Output

      . . . Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

      O nome comum é o nome usado para se referir a esta máquina no contexto da autoridade de certificados. Você pode digitar qualquer string de caracteres para o nome comum da CA mas, para simplificarmos as coisas, pressione ENTER para aceitar o nome padrão.

      Com isso, sua CA está funcionando e está pronta para iniciar a assinatura de pedidos de certificados.

      Passo 3 — Criando o certificado de servidor, chaves e arquivos de criptografia

      Agora que tem uma CA pronta para uso, você pode gerar uma chave privada e um pedido de certificado do seu servidor e então transferir o pedido para sua CA ser assinada, criando o certificado necessário. Você também é livre para criar alguns arquivos adicionais usados durante o processo de criptografia.

      Inicie navegando até o diretório do EasyRSA no seu servidor OpenVPN:

      De lá, execute o script easyrsa com a opção init-pki. Embora você já tenha executado este comando na máquina CA, é necessário executá-lo aqui, pois seu servidor e CA terão diretórios PKI separados:

      Então, chame o script easyrsa novamente, desta vez com a opção gen-req seguida de um nome comum para a máquina. Novamente, pode ser o nome que você quiser, mas escolher um nome mais descritivo pode ser útil. Ao longo deste tutorial, o nome comum do OpenVPN será simplesmente “server”. Certifique-se de incluir também a opção nopass. Se não fizer isso, o arquivo de pedido será protegido por senha, o que pode levar a problemas de permissão mais tarde:

      Nota: Se escolher um nome que não seja “server”, você terá que ajustar algumas das instruções abaixo. Por exemplo, quando copiar os arquivos gerados para o diretório /etc/openvpn, terá que substituir os nomes corretos. Você também terá que modificar o arquivo /etc/openvpn/server.conf mais tarde para que aponte aos arquivos .crt e .key corretos.

      • ./easyrsa gen-req server nopass

      Isso criará uma chave privada para o servidor e um arquivo de pedido de certificado chamado server.req. Copie a chave do servidor para o diretório /etc/openvpn/:

      • sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/

      Usando um método seguro (como o SCP, no nosso exemplo abaixo), transfira o arquivo server.req para sua máquina CA:

      • scp ~/EasyRSA-3.0.4/pki/reqs/server.req sammy@your_CA_ip:/tmp

      Em seguida, na sua máquina CA, navegue até o diretório do EasyRSA:

      Utilizando o script easyrsa mais uma vez, importe o arquivo server.req seguindo o caminho do arquivo com seu nome comum:

      • ./easyrsa import-req /tmp/server.req server

      Então, assine o pedido executando o script easyrsa com a opção sign-req, seguida do tipo de pedido e do nome comum. O tipo de pedido pode ser client ou server, então para o pedido de certificado do servidor OpenVPN, certifique-se de usar o tipo de pedido do server:

      • ./easyrsa sign-req server server

      No resultado, você será solicitado a verificar se o pedido vem de uma fonte confiável. Digite yes, então pressione ENTER para confirmar:

      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 3650 days:
      
      subject=
          commonName                = server
      
      
      Type the word 'yes' to continue, or any other input to abort.
        Confirm request details: yes
      

      Caso tenha criptografado sua chave CA, você será solicitado a colocar sua senha neste ponto.

      Em seguida, transfira o certificado assinado de volta para seu servidor VPN usando um método seguro:

      • scp pki/issued/server.crt sammy@your_server_ip:/tmp

      Antes de sair da sua máquina CA, transfira também o arquivo ca.crt para seu servidor:

      • scp pki/ca.crt sammy@your_server_ip:/tmp

      Em seguida, logue novamente no seu servidor OpenVPN e copie os arquivos server.crt e ca.crt para o seu diretório /etc/openvpn/:

      • sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/

      Então, navegue até seu diretório do EasyRSA:

      Dali, crie uma chave Diffie-Hellman forte para usar durante a troca de chaves, digitando:

      Isso pode levar alguns minutos para completar. Assim que terminar, gere uma assinatura HMAC para reforçar as capacidades de verificação da integridade TLS do servidor:

      • sudo openvpn --genkey --secret ta.key

      Quando o comando terminar, copie os dois novos arquivos para seu diretório /etc/openvpn/:

      • sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/
      • sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/

      Com isso, foram gerados todos os arquivos de certificado e de chave necessários pelo seu servidor. Você está pronto para criar os certificados e chaves correspondentes que sua máquina de cliente usará para acessar seu servidor OpenVPN.

      Passo 4 — Gerando um certificado de cliente e um par de chaves

      Embora você possa gerar uma chave privada e um pedido de certificado na sua máquina de cliente e então enviá-la para a CA para ser assinada, este guia define um processo para gerar o pedido de certificado no servidor. O benefício disso é que podemos criar um script que irá gerar automaticamente arquivos de configuração do cliente que contêm todas as chaves e certificados necessários. Isso permite que você evite ter que transferir chaves, certificados e arquivos de configuração para clientes e simplifica o processo de conexão ao VPN.

      Vamos gerar um único par, chave de cliente e certificado, para este guia. Se tiver mais de um cliente, você pode repetir este processo para cada um deles. Note, porém, que você precisará passar um valor de nome único ao script para cada cliente. Ao longo deste tutorial, o primeiro par de certificado/chave é chamado de client1.

      Inicie criando uma estrutura de diretório dentro do seu diretório home para armazenar os arquivos de certificado de cliente e de chave:

      • mkdir -p ~/client-configs/keys

      Como irá armazenar os pares de certificado/chave e arquivos de configuração dos seus clientes neste diretório, você deve bloquear suas permissões agora, como uma medida de segurança:

      • chmod -R 700 ~/client-configs

      Em seguida, navegue até o diretório do EasyRSA e execute o script easyrsa com as opções gen-req e nopass, junto com o nome comum para o cliente:

      • cd ~/EasyRSA-3.0.4/
      • ./easyrsa gen-req client1 nopass

      Pressione ENTER para confirmar o nome comum. Então, copie o arquivo client1.key para o diretório /client-configs/keys/ que você criou mais cedo:

      • cp pki/private/client1.key ~/client-configs/keys/

      Em seguida, transfira o arquivo client1.req para sua máquina CA usando um método seguro:

      • scp pki/reqs/client1.req sammy@your_CA_ip:/tmp

      Faça login na sua máquina CA, navegue até o diretório do EasyRSA, e importe o pedido de certificado:

      • ssh sammy@your_CA_IP
      • cd EasyRSA-3.0.4/
      • ./easyrsa import-req /tmp/client1.req client1

      Então, assine o pedido como fez para o servidor no passo anterior. Desta vez, certifique-se de especificar o tipo de pedido do client:

      • ./easyrsa sign-req client client1

      No prompt, digite yes para confirmar que você pretende assinar o pedido de certificado e que ele veio de uma fonte confiável:

      Output

      Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes

      Novamente, caso tenha criptografado sua chave CA, você será solicitado a colocar sua senha aqui.

      Isso criará um arquivo de certificado de cliente chamado client1.crt. Transfira este arquivo de volta para o servidor:

      • scp pki/issued/client1.crt sammy@your_server_ip:/tmp

      Use o SSH de volta no seu servidor OpenVPN e copie o certificado de cliente para o diretório /client-configs/keys:

      • cp /tmp/client1.crt ~/client-configs/keys/

      Em seguida, copie também os arquivos ca.crt e ta.key para o diretório /client-configs/keys/:

      • sudo cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/
      • sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

      Com isso, todos os certificados e chaves do seu servidor e do seu cliente foram gerados e estão armazenados nos diretórios apropriados do seu servidor. Ainda existem algumas ações que precisam ser feitas com esses arquivos, mas elas aparecerão em um passo mais adiante. Por enquanto, você pode seguir em frente para configurar o OpenVPN no seu servidor.

      Passo 5 — Configurando o serviço OpenVPN

      Agora que tanto os certificados quanto as chaves do seu cliente e do seu servidor foram gerados, você pode começar a configurar o serviço OpenVPN para usar essas credenciais.

      Inicie copiando uma amostra de um arquivo de configuração do OpenVPN para o diretório de configuração e então extraia-o para usá-lo como uma base para sua configuração:

      • sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
      • sudo gzip -d /etc/openvpn/server.conf.gz

      Abra a configuração do servidor no seu editor de texto preferido:

      • sudo nano /etc/openvpn/server.conf

      Encontre a seção HMAC procurando a diretriz tls-auth. Esta linha já deve estar descomentada, mas se não estiver, remova o “;” para descomentá-la:

      /etc/openvpn/server.conf

      tls-auth ta.key 0 # This file is secret
      

      Em seguida, encontre a seção sobre cifras criptográficas, procurando as linhas comentadas cipher. A cifra AES-256-CBC oferece um bom nível de criptografia e é bastante suportada. Novamente, esta linha já deve estar descomentada, mas se não estiver remova o “;” anterior a ela:

      /etc/openvpn/server.conf

      cipher AES-256-CBC
      

      Abaixo disso, adicione uma diretriz auth para selecionar o algoritmo message digest HMAC. Para fazer isso, o SHA256 é uma boa escolha:

      /etc/openvpn/server.conf

      auth SHA256
      

      Em seguida, encontre a linha que contém uma diretriz dh que define os parâmetros Diffie-Hellman. Devido a algumas alterações recentes feitas no EasyRSA, o nome do arquivo para a chave Diffie-Hellman pode ser diferente do que está listado no arquivo de configuração do servidor exemplo. Se necessário, altere o nome do arquivo listado aqui removendo o 2048 para que ele se alinhe com a chave que você gerou no passo anterior:

      /etc/openvpn/server.conf

      dh dh.pem
      

      Por fim, encontre as configurações user e group e remova os “;” no começo de cada para descomentar essas linhas:

      /etc/openvpn/server.conf

      user nobody
      group nogroup
      

      As alterações que você fez no arquivo exemplo server.conf até este ponto são necessárias para que o OpenVPN funcione. As alterações descritas abaixo são opcionais, embora também sejam necessárias para muitos casos de uso comum.

      (Opcional) Forçar alterações no DNS para redirecionar todo o tráfego através do VPN

      As configurações acima criarão a conexão VPN entre as duas máquinas, mas não forçarão nenhuma conexão a usar o túnel. Se quiser usar o VPN para rotear todo o seu tráfego, você provavelmente irá querer forçar as configurações DNS para os computadores do cliente.

      Há algumas diretrizes no arquivo server.conf que você deve alterar para habilitar esta funcionalidade. Encontre a seção redirect-gateway e remova o ponto e vírgula “*;`” do começo da linha *redirect-gateway` para descomentá-la:

      /etc/openvpn/server.conf

      push "redirect-gateway def1 bypass-dhcp"
      

      Logo abaixo, encontre a seção dhcp-option. Novamente, remova o “;” da frente de ambas as linhas para descomentá-las:

      /etc/openvpn/server.conf

      push "dhcp-option DNS 208.67.222.222"
      push "dhcp-option DNS 208.67.220.220"
      

      Isso ajudará os clientes a reconfigurar suas configurações DNS para usar o túnel VPN como gateway padrão.

      (Opcional) Ajustar a porta e o protocolo

      Por padrão, o servidor OpenVPN usa a porta 1194 e o protocolo UDP para aceitar conexões de clientes. Se precisar usar uma porta diferente, devido a ambientes de rede restritivos em que seus clientes possam estar, você pode alterar a opção port. Se não estiver hospedando conteúdo Web no seu servidor OpenVPN, a porta 443 é uma escolha popular, uma vez que ela é geralmente permitida em de regras de firewall.

      /etc/openvpn/server.conf

      # Optional!
      port 443
      

      Geralmente, o protocolo também é restrito a essa porta. Se for, mude o proto de UDP para TCP:

      /etc/openvpn/server.conf

      # Optional!
      proto tcp
      

      Se você de fato mudar o protocolo para o TCP, precisará alterar o valor explicit-exit-notify da diretriz de 1 para 0, já que essa diretriz é usada apenas pelo UDP. Não fazer isso ao usar o TCP irá causar erros quando você iniciar o serviço OpenVPN:

      /etc/openvpn/server.conf

      # Optional!
      explicit-exit-notify 0
      

      Se não tiver necessidade de usar uma porta e protocolos diferentes, é melhor deixar essas duas opções no seu padrão.

      (Opcional) Apontar para credenciais não padrão

      Se você selecionou um nome diferente durante o comando ./build-key-server mais cedo, modifique as linhas cert e key que você vê para apontar para os arquivos .crt e .key apropriados. Se você usou o nome padrão, “server”, isso já está configurado corretamente:

      /etc/openvpn/server.conf

      cert server.crt
      key server.key
      

      Quando você terminar, salve e feche o arquivo.

      Após passar e fazer as alterações na configuração OpenVPN do seu servidor que são necessárias para seu caso de uso específico, você pode começar a fazer algumas alterações na rede do seu servidor.

      Passo 6 — Ajustando a configuração da rede do servidor

      Existem alguns aspectos da configuração de rede do servidor que precisam ser ajustados para que o OpenVPN possa rotear corretamente o tráfego pelo VPN. O primeiro desses é o encaminhamento de IP, um método para determinar onde o tráfego de IP deve ser roteado. Isso é essencial para a funcionalidade VPN que seu servidor irá fornecer.

      Ajuste a configuração padrão de encaminhamento de IP do seu servidor, modificando o arquivo /etc/sysctl.conf:

      • sudo nano /etc/sysctl.conf

      Dentro, procure a linha comentada que define o net.ipv4.ip_forward. Remova o caractere “#” do começo da linha para descomentar esta configuração:

      /etc/sysctl.conf

      net.ipv4.ip_forward=1
      

      Salve e feche o arquivo quando você terminar.

      Para ler o arquivo e ajustar os valores para a sessão atual, digite:

      Output

      net.ipv4.ip_forward = 1

      Se seguiu o guia de configuração inicial do servidor Debian 9 listado nos pré-requisitos, você deve ter um firewall UFW em funcionamento. Independentemente de você usar o firewall para bloquear tráfego indesejado (o que você quase sempre deve fazer), para este guia você precisa de um firewall para manipular uma parte do tráfego que vem para o servidor. Algumas das regras do firewall devem ser modificadas para habilitar o mascaramento, que é um conceito iptables que fornece tradução de endereço de rede (NAT) dinâmica e instantânea para rotear conexões com clientes de maneira correta.

      Antes de abrir o arquivo de configuração do firewall para adicionar as regras de mascaramento, você deve primeiro encontrar a interface de rede pública da sua máquina. Para fazer isso, digite:

      Sua interface pública é a string encontrada dentro do resultado desse comando que vem após a palavra “dev”. Por exemplo, este resultado mostra a interface chamada eth0, que está destacada abaixo:

      Output

      default via 203.0.113.1 dev eth0 onlink

      Quando tiver a interface associada à sua rota padrão, abra o arquivo /etc/ufw/before.rules para adicionar as configurações relevantes:

      • sudo nano /etc/ufw/before.rules

      As regras do UFW são normalmente adicionadas usando o comando ufw. As regras listadas no arquivo before.rules, em contrapartida, são lidas e colocadas em funcionamento antes das regras convencionais do UFW serem carregadas. Em direção ao topo do arquivo, adicione as linhas destacadas abaixo. Isso irá definir a política padrão para a cadeia POSTROUTING na tabela nat e mascarar todo o tráfego vindo do VPN. Lembre-se de substituir o eth0 na linha -A POSTROUTING abaixo pela interface que você encontrou no comando acima:

      /etc/ufw/before.rules

      #
      # 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 e feche o arquivo quando você terminar.

      Em seguida, você também precisa dizer ao UFW para permitir os pacotes redirecionados por padrão. Para fazer isso, abra o arquivo /etc/default/ufw:

      • sudo nano /etc/default/ufw

      Dentro, encontre a diretriz DEFAULT_FORWARD_POLICY e altere o valor de DROP para ACCEPT:

      /etc/default/ufw

      DEFAULT_FORWARD_POLICY="ACCEPT"
      

      Salve e feche o arquivo quando você terminar.

      Em seguida, ajuste o firewall em si para permitir o tráfego para o OpenVPN. Caso não tenha alterado a porta e o protocolo no arquivo /etc/openvpn/server.conf, você precisará abrir o tráfego UDP para a porta 1194. Se você modificou a porta e/ou o protocolo, substitua os valores que selecionou aqui.

      Caso tenha esquecido de adicionar a porta SSH ao seguir o tutorial pré-requisito, adicione-a também aqui:

      • sudo ufw allow 1194/udp
      • sudo ufw allow OpenSSH

      Após adicionar essas regras, desative e reative o UFW para reiniciá-lo e carregar as alterações de todos os arquivos que você modificou:

      • sudo ufw disable
      • sudo ufw enable

      Seu servidor agora está configurado para lidar corretamente com o tráfego OpenVPN.

      Passo 7 — Inicializando e ativando o serviço OpenVPN

      Você finalmente está pronto para inicializar o serviço OpenVPN no seu servidor. Isso é feito usando o utilitário systemctl do systemd.

      Inicie o servidor OpenVPN especificando o nome do seu arquivo de configuração como uma variável de instância após o nome do arquivo de unidade systemd. O arquivo de configuração para o seu servidor chama-se /etc/openvpn/server.conf, então adicione @server ao final do seu arquivo de unidade ao chamá-lo:

      • sudo systemctl start openvpn@server

      Verifique novamente se o serviço foi iniciado com sucesso digitando:

      • sudo systemctl status openvpn@server

      Se tudo correu bem, seu resultado se parecerá com este:

      Output

      ● openvpn@server.service - OpenVPN connection to server Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled) Active: active (running) since Tue 2016-05-03 15:30:05 EDT; 47s ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Process: 5852 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, sta Main PID: 5856 (openvpn) Tasks: 1 (limit: 512) CGroup: /system.slice/system-openvpn.slice/openvpn@server.service └─5856 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

      Você também pode verificar se a interface OpenVPN tun0 está disponível digitando:

      Isso dará como resultado uma interface configurada:

      Output

      4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100 link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever

      Após inicializar o serviço, habilite-o para que ele seja iniciado automaticamente no boot:

      • sudo systemctl enable openvpn@server

      Seu serviço OpenVPN agora está funcionando. Entretanto, antes de começar a usá-lo, você deve primeiro criar um arquivo de configuração para a máquina do cliente. Este tutorial já mostrou como criar pares de certificado/key para clientes, e no próximo passo vamos demonstrar como criar uma infraestrutura que irá gerar arquivos de configuração do cliente facilmente.

      Passo 8 — Criando a infraestrutura de configuração de clientes

      Criar arquivos de configuração para os clientes OpenVPN pode ser um desafio, já que cada cliente deve ter sua própria configuração e cada um deve se alinhar com as configurações descritas no arquivo de configuração do servidor. Ao invés de escrever um único arquivo de configuração que só pode ser usado para um cliente, este passo define um processo para a construção de uma infraestrutura de configuração de clientes que você pode usar para gerar arquivos de configuração imediatamente. Você criará primeiro um arquivo de configuração “base” e então construirá um script que permitirá que você gere arquivos únicos de configuração de clientes, certificados e chaves conforme necessário.

      Comece criando um novo diretório onde você irá armazenar arquivos de configuração de clientes no diretório client-configs que você criou mais cedo:

      • mkdir -p ~/client-configs/files

      Em seguida, copie um arquivo de configuração de cliente exemplo para o diretório client-configs para usá-lo como sua configuração base:

      • cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

      Abra este novo arquivo no seu editor de texto:

      • nano ~/client-configs/base.conf

      Dentro, localize a diretriz remote. Isso aponta o cliente para seu endereço de servidor OpenVPN — o endereço IP público do seu servidor OpenVPN. Caso tenha decidido alterar a porta em que o servidor OpenVPN está escutando, também será preciso alterar a 1194 para a porta que você selecionou:

      ~/client-configs/base.conf

      . . .
      # The hostname/IP and port of the server.
      # You can have multiple remote entries
      # to load balance between the servers.
      remote your_server_ip 1194
      . . .
      

      Certifique-se de que o protocolo corresponda ao valor que você está usando na configuração do servidor:

      ~/client-configs/base.conf

      proto udp
      

      Em seguida, descomente as diretrizes user e group removendo o “;” no começo de cada linha:

      ~/client-configs/base.conf

      # Downgrade privileges after initialization (non-Windows only)
      user nobody
      group nogroup
      

      Encontre as diretrizes que definem ca, cert e key. Comente essas diretrizes, já que você adicionará os certificados e chaves dentro do arquivo em si em breve:

      ~/client-configs/base.conf

      # 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
      

      Do mesmo modo, comente a diretriz tls-auth, já que você adicionará a ta.key diretamente no arquivo de configuração do cliente:

      ~/client-configs/base.conf

      # If a tls-auth key is used on the server
      # then every client must also have the key.
      #tls-auth ta.key 1
      

      Espelhe as configurações cipher e auth que você definiu no arquivo /etc/openvpn/server.conf:

      ~/client-configs/base.conf

      cipher AES-256-CBC
      auth SHA256
      

      Em seguida, adicione a diretriz key-direction em algum lugar no arquivo. Você deve definir isso em “1” para que o VPN funcione corretamente na máquina do cliente:

      ~/client-configs/base.conf

      key-direction 1
      

      Por fim, adicione algumas linhas comentadas. Embora possa incluir essas diretrizes em todos os arquivos de configuração de clientes, você precisa habilitá-las para clientes Linux que acompanham um arquivo /etc/openvpn/update-resolv-conf. Este script usa o utilitário resolvconf para atualizar as informações DNS para clientes Linux.

      ~/client-configs/base.conf

      # script-security 2
      # up /etc/openvpn/update-resolv-conf
      # down /etc/openvpn/update-resolv-conf
      

      Se seu cliente estiver usando o Linux e tiver um arquivo /etc/openvpn/update-resolv-conf, descomente essas linhas do arquivo de configuração do cliente após terem sido geradas.

      Salve e feche o arquivo quando você terminar.

      Em seguida, crie um script simples que irá compilar sua configuração base com os arquivos de certificado, chave, e criptografia relevantes e então colocar a configuração gerada no diretório ~/client-configs/files. Abra um novo arquivo chamado make_config.sh dentro do diretório ~/client-configs:

      • nano ~/client-configs/make_config.sh

      Dentro, adicione o seguinte conteúdo, certificando-se de alterar sammy<^> para a conta de usuário não root do seu servidor:

      ~/client-configs/make_config.sh

      #!/bin/bash
      
      # First argument: Client identifier
      
      KEY_DIR=/home/sammy/client-configs/keys
      OUTPUT_DIR=/home/sammy/client-configs/files
      BASE_CONFIG=/home/sammy/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-auth>') 
          ${KEY_DIR}/ta.key 
          <(echo -e '</tls-auth>') 
          > ${OUTPUT_DIR}/${1}.ovpn
      

      Salve e feche o arquivo quando você terminar.

      Antes de seguir em frente, certifique-se de marcar este arquivo como executável digitando:

      • chmod 700 ~/client-configs/make_config.sh

      Este script fará uma cópia do arquivo base.conf que você fez, coletará todos os arquivos de certificado e chave que você criou para seu cliente, extrairá os conteúdos deles, adicionará esse conteúdo à cópia do arquivo de configuração base e exportará tudo isso para um novo arquivo de configuração de clientes. Isso significa que, ao invés de ter que gerenciar os arquivos de configuração do cliente, certificado e chave separadamente, todas as informações necessárias são armazenadas em um só lugar. O benefício disso é que, caso tenha necessidade de adicionar um cliente no futuro, você pode executar este script para criar rapidamente o arquivo de configuração e garantir que todas as informações importantes são armazenadas em uma única localização de fácil acesso.

      Note que, sempre que adicionar um novo cliente, você precisará gerar novas chaves e certificados para ele antes de executar este script e gerar seu arquivo de configuração. Você poderá praticar um pouco a utilização deste script no próximo passo.

      Passo 9 — Gerando as configurações de clientes

      Se seguiu com o guia, você criou um certificado e chave de cliente nomeados client1.crt e client1.key, respectivamente, no passo 4. É possível gerar um arquivo de configuração para essas credenciais entrando no seu diretório ~/client-configs e executando o script que você fez no final do passo anterior:

      • cd ~/client-configs
      • sudo ./make_config.sh client1

      Isso criará um arquivo chamado client1.ovpn no seu diretório ~/client-configs/files:

      • ls ~/client-configs/files

      Output

      client1.ovpn

      Você precisa transferir esse arquivo para o dispositivo que planeja usar como cliente. Por exemplo, este poderia ser seu computador local ou um dispositivo móvel.

      Embora os aplicativos exatos usados para realizar essa transferência dependerão do sistema operacional do seu dispositivo e de suas preferências pessoais, um método confiável e seguro é usar o SFTP (protocolo SSH de transferência de arquivos) ou SCP (cópia segura) no backend. Isso transportará os arquivos de autenticação do VPN do seu cliente através de uma conexão criptografada.

      Aqui está um comando SFTP exemplo usando o exemplo client1.ovpn que você pode executar do seu computador local (macOS ou Linux). Ele coloca o arquivo .ovpn no seu diretório home:

      • sftp sammy@your_server_ip:client-configs/files/client1.ovpn ~/

      Aqui estão diversas ferramentas e tutoriais para transferir arquivos com segurança do servidor para um computador local:

      Passo 10 — Instalando a configuração do cliente

      Esta seção aborda como instalar um perfil VPN de um cliente no Windows, macOS, Linux, iOS e Android. Nenhuma dessas instruções de cliente dependem uma da outra, então sinta-se a vontade para pular para alguma que seja aplicável ao seu dispositivo.

      A conexão OpenVPN terá o mesmo nome que você chamou o arquivo .ovpn. No que diz respeito a este tutorial, isso significa que a conexão se chama client1.ovpn, de acordo com o primeiro arquivo de cliente que você gerou.

      Windows

      Instalando

      Faça download do aplicativo do cliente OpenVPN para o Windows da página de download do OpenVPN. Escolha a versão do instalador apropriada para a sua versão do Windows.

      Nota: O OpenVPN precisa de privilégios administrativos para ser instalado.

      Após instalar o OpenVPN, copie o arquivo .ovpn para:

      C:Program FilesOpenVPNconfig
      

      Quando iniciar o OpenVPN, ele verá o perfil e o disponibilizará automaticamente.

      Você deve executar o OpenVPN como administrador sempre que ele é usado, mesmo por contas administrativas. Para fazer isso sem precisar clicar com o botão direito e selecionar Executar como administrador sempre que você usar o VPN, é necessário predefinir isso de uma conta administrativa. Isso significa que os usuários padrão também precisam digitar a senha do administrador para usar o OpenVPN. Por outro lado, os usuários padrão não conseguem se conectar devidamente ao servidor a não ser que o aplicativo OpenVPN no cliente tenha direitos de administrador, então são necessários privilégios elevados.

      Para definir que o aplicativo OpenVPN sempre execute como administrador, clique com o botão direito no seu atalho e vá em Propriedades. No final da aba Compatibilidade, clique no botão para Mudar as configurações para todos os usuários. Na nova janela, marque Executar este programa como administrador.

      Conectando

      Cada vez que iniciar a OpenVPN GUI, o Windows irá perguntar se você quer permitir que o programa faça alterações no seu computador. Clique em Yes. Iniciar o aplicativo do cliente OpenVPN coloca apenas o applet na bandeja do sistema para que você possa conectar e desconectar o VPN conforme necessário; isso não cria de fato a conexão VPN.

      Assim que o OpenVPN iniciar, inicie uma conexão entrando no applet da bandeja do sistema e clicando com o botão direito no ícone do applet do OpenVPN. Isso abre o menu de contexto. Selecione client1 no topo do menu (esse é seu perfil client1.ovpn) e escolha Connect.

      Uma janela de status abrirá mostrando o registro de saída enquanto a conexão estiver estabelecida, e uma mensagem aparecerá assim que o cliente estiver conectado.

      Desconecte-se do VPN da mesma maneira: Vá até o applet da bandeja do sistema, clique com o botão direito no ícone do applet do OpenVPN, selecione o perfil do cliente e clique em Disconnect.

      macOS

      Instalando

      O Tunnelblick é um cliente OpenVPN gratuito e de código aberto para o macOS. Você pode baixar a imagem de disco mais recente da página de downloads do Tunnelblick. Clique duas vezes no arquivo baixado .dmg e siga os prompts para instalar.

      Ao final do processo de instalação, o Tunnelblick irá perguntar se você tem algum arquivo de configuração. Para simplificar, responda No e deixe o Tunnelblick terminar. Abra uma janela do Finder e clique duas vezes no client1.ovpn. O Tunnelblick instalará o perfil do cliente. São necessário privilégios administrativos.

      Conectando

      Inicie o Tunnelblick clicando duas vezes no Tunnelblick na pasta Applications. Assim que o Tunnelblick iniciar, haverá um ícone do Tunnelblick na barra do menu no canto superior direito da tela para controle de conexões. Clique no ícone e então no item do menu Connect para iniciar a conexão VPN. Selecione a conexão client1.

      Linux

      Instalando

      Se estiver usando o Linux, existe uma variedade de ferramentas que você pode usar dependendo da sua distribuição. Seu ambiente do desktop ou gerenciador de janelas também pode incluir serviços de conexão.

      Entretanto, o modo mais universal de se conectar é apenas usar o software OpenVPN.

      No Ubuntu ou Debian, você pode instalá-lo assim como fez no servidor digitando:

      • sudo apt update
      • sudo apt install openvpn

      No CentOS, você pode habilitar os repositórios EPEL e então instalá-lo digitando:

      • sudo yum install epel-release
      • sudo yum install openvpn

      Configurando

      Verifique se sua distribuição inclui um script /etc/openvpn/update-resolv-conf:

      Output

      update-resolv-conf

      Em seguida, edite o arquivo de configuração do cliente OpenVPN que você transferiu:

      Se conseguir encontrar um arquivo update-resolv-conf, descomente as três linhas que você adicionou para ajustar as configurações DNS:

      client1.ovpn

      script-security 2
      up /etc/openvpn/update-resolv-conf
      down /etc/openvpn/update-resolv-conf
      

      Se estiver usando o CentOS, altere a diretriz group de nogroup para nobody de forma a corresponder aos grupos disponíveis da distribuição:

      client1.ovpn

      group nobody
      

      Salve e feche o arquivo.

      Agora, você pode se conectar ao VPN apenas apontando o comando openvpn para o arquivo de configuração do cliente:

      • sudo openvpn --config client1.ovpn

      Isso deve conectar você ao seu VPN.

      iOS

      Instalando

      A partir da App Store do iTunes, procure e instale o OpenVPN Connect, o aplicativo oficial do cliente iOS OpenVPN. Para transferir sua configuração do cliente iOS para o dispositivo, conecte-o diretamente a um computador.

      O processo de completar a transferência com o iTunes é descrito aqui. Abra o iTunes no computador e clique em iPhone > apps. Role até o final da seção File Sharing e clique no app OpenVPN. A janela em branco à direita, OpenVPN Documents, serve para compartilhar arquivos. Arraste o arquivo .ovpn para a janela OpenVPN Documents.

      iTunes showing the VPN profile ready to load on the iPhone

      Agora, inicie o app OpenVPN no iPhone. Você receberá uma notificação de que um novo perfil está pronto para ser importado. Clique no sinal mais em verde para importá-lo.

      The OpenVPN iOS app showing new profile ready to import

      Conectando

      O OpenVPN agora está pronto para ser usado com o novo perfil. Inicie a conexão deslizando o botão Connect para a posição On. Desconecte deslizando o mesmo botão para Off.

      Nota: O switch VPN em Settings não pode ser usado para se conectar ao VPN. Se tentar fazer isso, receberá uma notificação para se conectar apenas usando o app OpenVPN.

      The OpenVPN iOS app connected to the VPN

      Android

      Instalando

      Abra a Google Play Store. Procure e instale o Android OpenVPN Connect, o aplicativo oficial do cliente Android OpenVPN.

      Você pode transferir o perfil .ovpn conectando o dispositivo Android ao seu computador por USB e copiando o arquivo. Como alternativa, caso tenha um leitor de cartões SD, você pode remover o cartão SD do dispositivo, copiar o perfil nele e então inserir o cartão de volta no dispositivo Android.

      Inicie o app OpenVPN e clique no menu para importar o perfil.

      The OpenVPN Android app profile import menu selection

      Então navegue até a localização do perfil salvo (a captura de tela usa /sdcard/Download/) e selecione o arquivo. O app criará uma nota de que o perfil foi importado.

      The OpenVPN Android app selecting VPN profile to import

      Conectando

      Para se conectar, basta apertar o botão Connect. Você será questionado se confia no aplicativo OpenVPN. Escolha OK para iniciar a conexão. Para se desconectar do VPN, volte para o app OpenVPN e escolha Disconnect.

      The OpenVPN Android app ready to connect to the VPN

      Passo 11 — Testando sua conexão VPN (opcional)

      Nota: Este método utilizado no teste da sua conexão VPN funcionará apenas se você optou por rotear todo o seu tráfego através do VPN no Passo 5.

      Assim que tudo estiver instalado, um simples visto confirma que tudo está funcionando corretamente. Sem ter uma conexão VPN habilitada, abra um navegador e vá para DNSLeakTest.

      O site irá retornar o endereço IP atribuído pelo seu provedor de serviço de Internet e como você se mostra para o resto do mundo. Para verificar suas configurações DNS através do mesmo site, clique em Extended Test e ele dirá a você quais servidores DNS você está usando.

      Agora, conecte o cliente OpenVPN ao VPN do seu servidor e atualize o navegador. Um endereço IP completamente diferente (aquele do seu servidor VPN) deve aparecer agora e é assim que você aparece para o mundo. Novamente, o Extended Test do DNSLeakTest irá verificar suas configurações DNS e confirmar que você agora está usando os resolvers DNS definidos pelo seu VPN.

      Passo 12 — Revogando certificados de clientes

      De vez em quando, você pode precisar revogar um certificado de cliente para impedir o acesso adicional ao servidor OpenVPN.

      Para fazer isso, navegue até o diretório EasyRSA na sua máquina CA:

      Em seguida, execute o script easyrsa com a opção revoke, seguida do nome do cliente que você deseja revogar:

      Isso irá pedir que você confirme a revogação digitando yes:

      Output

      Please confirm you wish to revoke the certificate with the following subject: subject= commonName = client2 Type the word 'yes' to continue, or any other input to abort. Continue with revocation: yes

      Após confirmar a ação, a CA irá revogar completamente o certificado do cliente. Entretanto, seu servidor OpenVPN ainda não tem como verificar se os certificados de clientes foram revogados e se o cliente ainda terá acesso ao VPN. Para corrigir isso, crie uma lista de revogação de certificados (CRL) na sua máquina CA:

      Isso irá gerar um arquivo chamado crl.pem. Transfira com segurança este arquivo para seu servidor OpenVPN:

      • scp ~/EasyRSA-3.0.4/pki/crl.pem sammy@your_server_ip:/tmp

      No seu servidor OpenVPN, copie este arquivo para seu diretório /etc/openvpn/:

      • sudo cp /tmp/crl.pem /etc/openvpn

      Em seguida, abra o arquivo de configuração do servidor OpenVPN:

      • sudo nano /etc/openvpn/server.conf

      No final do arquivo, adicione a opção crl-verify que irá instruir o servidor OpenVPN para verificar a lista de revogação de certificados que criamos sempre que uma tentativa de conexão for feita:

      /etc/openvpn/server.conf

      crl-verify crl.pem
      

      Salve e feche o arquivo.

      Por fim, reinicie o OpenVPN para implementar a revogação do certificado:

      • sudo systemctl restart openvpn@server

      O cliente já não deve conseguir se conectar com sucesso ao servidor usando a credencial antiga.

      Para revogar outros clientes, siga este processo:

      1. Revogue o certificado com o comando ./easyrsa revoke client_name
      2. Gere um novo CRL
      3. Transfira o novo arquivo crl.pem para seu servidor OpenVPN e copie-o para o diretório /etc/openvpn para sobrepor a lista antiga.
      4. Reinicie o serviço OpenVPN.

      Você pode usar este processo para revogar quaisquer certificados que você tenha emitido anteriormente para seu servidor.

      Conclusão

      Agora, você está navegando na Internet com segurança protegendo sua identidade, local e tráfego de bisbilhoteiros e censuradores. Se agora você já não precisa mais emitir certificados, é recomendável que desligue sua máquina CA ou desconecte-a da Internet até que precise adicionar ou revogar certificados. Isso ajudará a evitar que os agressores tenham acesso ao seu VPN.

      Para configurar mais clientes, você só precisa seguir os passos 4 e 9-11 para cada dispositivo adicional. Para revogar o acesso a clientes, siga o passo 12.



      Source link

      Como configurar um servidor OpenVPN no Ubuntu 18.04


      Uma versão anterior deste tutorial foi escrita por Justin Ellingwood.

      Introdução

      Quer acessar a Internet com segurança do seu smartphone ou notebook, enquanto estiver conectado a uma rede não confiável como o Wi-Fi de um hotel ou café? Uma Virtual Private Network (VPN) permite que você atravesse redes não confiáveis com privacidade e segurança como se estivesse em uma rede privada. O tráfego emerge do servidor VPN e continua sua jornada para o destino.

      Quando combinado com conexões HTTPS, esta configuração permite que você proteja seus logins e transações sem fio. Você pode contornar restrições geográficas e de censura, e proteger seu local e qualquer tráfego HTTP não criptografado da rede não confiável.

      O OpenVPN é uma solução VPN de código aberto Secure Socket Layer (SSL) completa que acomoda uma ampla gama de configurações. Neste tutorial, você irá configurar um servidor OpenVPN em um servidor Ubuntu 18.04 e, em seguida, irá configurar o acesso a ele do Windows, macOS, iOS e/ou Android. Este tutorial irá manter os passos de instalação e configuração o mais simples possível para cada uma dessas configurações.

      Nota: Se você planeja configurar um servidor OpenVPN em um Droplet DigitalOcean, fique ciente de que nós, como muitos provedores de hospedagem, cobramos por excesso de largura de banda. Por este motivo, tenha cuidado acerca de com quanto tráfego seu servidor está lidando.

      Veja esta página para maiores informações.

      Pré-requisitos

      Para completar este tutorial, você precisará de acesso a um servidor Ubuntu 18.04 para hospedar seu serviço OpenVPN. Você precisará configurar um usuário não root com privilégios sudo antes de iniciar este guia. Você pode seguir nosso guia de configuração inicial do servidor Ubuntu 18.04 para configurar um usuário com permissões apropriadas. O tutorial em questão também irá configurar um firewall, que assumimos que esteja em funcionamento durante todo este guia.

      Além disso, você precisará de uma máquina separada para servir como sua autoridade de certificação (CA). Embora seja tecnicamente possível usar seu servidor OpenVPN ou sua máquina local como sua CA, isso não é recomendado pois abre seu VPN para algumas vulnerabilidades de segurança. Baseando-se na documentação oficial do OpenVPN, você deve colocar sua CA em uma máquina autônoma que seja dedicada a importar e assinar pedidos de certificado. Por isso, este guia supõe que seu CA esteja em um servidor Ubuntu 18.04 separado que também tenha um usuário não root com privilégios sudo e um firewall básico.

      Note que se você desativar a autenticação por senha enquanto configurar esses servidores, poderá ter dificuldades ao transferir arquivos entre eles mais tarde neste guia. Para resolver este problema, você pode reativar a autenticação por senha em cada servidor. Como alternativa, você poderia gerar um par de chaves SSH para cada servidor, então adicionar a chave SSH pública do servidor OpenVPN no arquivo CA authorized_keys da máquina e vice-versa. Veja Como configurar as chaves SSH no Ubuntu 18.04 para instruções sobre como utilizar qualquer uma dessas soluções.

      Quando tiver esses pré-requisitos funcionando, siga para o Passo 1 deste tutorial.

      Passo 1 — Instalando o OpenVPN e o EasyRSA

      Para começar, atualize o índice de pacotes do seu servidor VPN e instale o OpenVPN. O OpenVPN está disponível nos repositórios padrão do Ubuntu, então você pode usar o apt para a instalação:

      • sudo apt update
      • sudo apt install openvpn

      O OpenVPN é um VPN TLS/SSL. Isso significa que o OpenVPN utiliza os certificados para criptografar o tráfego entre o servidor e os clientes. Para emitir certificados confiáveis, você irá configurar sua própria autoridade de certificação (CA) simplificada. Para fazer isso, vamos baixar a última versão do EasyRSA, que vamos usar para construir nossa infraestrutura de chaves públicas (PKI) CA, do repositório oficial do projeto no GitHub.

      Como mencionado nos pré-requisitos, vamos construir a CA em um servidor autônomo. A razão para esta abordagem é que, se um agressor fosse capaz de se infiltrar no seu servidor, eles seriam capazes de acessar sua chave privada CA e usá-la para assinar novos certificados, dando-lhes acesso ao seu VPN. Dessa forma, gerenciar a CA a partir de uma máquina autônoma ajuda a evitar que usuários não autorizados acessem seu VPN. Note também que é recomendado que você mantenha o servidor CA desligado quando não estiver sendo usado para assinar chaves como uma medida de precaução adicional.

      Para começar a construir a infraestrutura CA e PKI, utilize o wget para baixar a última versão do EasyRSA tanto na máquinas CA quanto no seu servidor OpenVPN. Para obter a última versão, vá até a página Releases no projeto oficial do EasyRSA no GitHub, copie o link de download para o arquivo que termina em .tgz e então cole-o no seguinte comando:

      • wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz

      Então, extraia o tarball:

      • cd ~
      • tar xvf EasyRSA-3.0.4.tgz

      Você instalou todos os softwares necessários com sucesso no seu servidor e máquina CA. Continue para configurar as variáveis usadas pelo EasyRSA e configurar um diretório CA, do qual você irá gerar as chaves e certificados necessários para que seu servidor e clientes acessem o VPN.

      Passo 2 — Configurando as variáveis do EasyRSA e construindo a CA

      O EasyRSA vem instalado com um arquivo de configuração que você pode editar para definir uma série de variáveis para sua CA.

      Na sua máquina CA, navegue até o diretório do EasyRSA:

      Dentro deste diretório há um arquivo chamado vars.example. Faça uma cópia deste arquivo, e dê à cópia o nome de vars sem uma extensão de arquivo:

      Abra este novo arquivo com seu editor de texto preferido:

      Encontre as configurações que definam padrões de campo para novos certificados. Eles se parecerão com isso:

      ~/EasyRSA-3.0.4/vars

      . . .
      
      #set_var EASYRSA_REQ_COUNTRY    "US"
      #set_var EASYRSA_REQ_PROVINCE   "California"
      #set_var EASYRSA_REQ_CITY       "San Francisco"
      #set_var EASYRSA_REQ_ORG        "Copyleft Certificate Co"
      #set_var EASYRSA_REQ_EMAIL      "me@example.net"
      #set_var EASYRSA_REQ_OU         "My Organizational Unit"
      
      . . .
      

      Descomente essas linhas e atualize os valores destacados para os que preferir, mas não os deixe em branco:

      ~/EasyRSA-3.0.4/vars

      . . .
      
      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        "DigitalOcean"
      set_var EASYRSA_REQ_EMAIL      "admin@example.com"
      set_var EASYRSA_REQ_OU         "Community"
      
      . . .
      

      Quando você terminar, salve e feche o arquivo.

      Dentro do diretório do EasyRSA está um script chamado easyrsa que é chamado para realizar uma variedade de tarefas envolvidas com a construção e gerenciamento da CA. Execute este script com a opção init-pki para iniciar a infraestrutura de chaves pública no servidor CA:

      Output

      . . . init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /home/sammy/EasyRSA-3.0.4/pki

      Depois disso, chame o script easyrsa novamente, seguindo-o com a opção build-ca. Isso irá construir a CA e criar dois arquivos importantes — ca.crt e ca.key — que constituem os lados público e privado de um certificado SSL.

      • O ca.crt é o arquivo de certificado público CA que, no contexto do OpenVPN, é usado pelo servidor e pelo cliente para informar um ao outro que fazem parte da mesma rede de confiança e não são alguém executando um ataque man-in-the-middle. Por essa razão, seu servidor e todos os seus clientes precisarão de uma cópia do arquivo ca.crt.
      • A ca.key é a chave privada que a máquina CA usa para assinar chaves e certificados para servidores e clientes. Se um agressor ganha acesso à sua CA e, por sua vez, seu arquivo ca.key, ele poderá assinar pedidos de certificado e obter acesso ao seu VPN, impedindo sua segurança. Esse é o motivo pelo qual seu arquivo ca.key deve estar apenas na sua máquina CA e que, idealmente, sua máquina CA deve ser mantida off-line quando não estiver assinando pedidos de certificado como uma medida de segurança extra.

      Se você não quiser ser solicitado a colocar uma senha sempre que interagir com sua CA, é possível executar o comando build-ca com a opção nopass, desta maneira:

      • ./easyrsa build-ca nopass

      No resultado, será solicitado que você confirme o nome comum para sua CA:

      Output

      . . . Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

      O nome comum é o nome usado para se referir a esta máquina no contexto da autoridade de certificados. Você pode digitar qualquer string de caracteres para o nome comum da CA mas, para simplificarmos as coisas, pressione ENTER para aceitar o nome padrão.

      Com isso, sua CA está funcionando e está pronta para iniciar a assinatura de pedidos de certificados.

      Passo 3 — Criando o certificado de servidor, chaves e arquivos de criptografia

      Agora que tem uma CA pronta para uso, você pode gerar uma chave privada e um pedido de certificado do seu servidor e então transferir o pedido para sua CA ser assinada, criando o certificado necessário. Você também é livre para criar alguns arquivos adicionais usados durante o processo de criptografia.

      Inicie navegando até o diretório do EasyRSA no seu servidor OpenVPN:

      De lá, execute o script easyrsa com a opção init-pki. Embora você já tenha executado este comando na máquina CA, é necessário executá-lo aqui, pois seu servidor e CA terão diretórios PKI separados:

      Então, chame o script easyrsa novamente, desta vez com a opção gen-req seguida de um nome comum para a máquina. Novamente, pode ser o nome que você quiser, mas escolher um nome mais descritivo pode ser útil. Ao longo deste tutorial, o nome comum do OpenVPN será simplesmente “server”. Certifique-se de incluir também a opção nopass. Se não fizer isso, o arquivo de pedido será protegido por senha, o que pode levar a problemas de permissão mais tarde:

      Nota: Se escolher um nome que não seja “server”, você terá que ajustar algumas das instruções abaixo. Por exemplo, quando copiar os arquivos gerados para o diretório /etc/openvpn, terá que substituir os nomes corretos. Você também terá que modificar o arquivo /etc/openvpn/server.conf mais tarde para que aponte aos arquivos .crt e .key corretos.

      • ./easyrsa gen-req server nopass

      Isso criará uma chave privada para o servidor e um arquivo de pedido de certificado chamado server.req. Copie a chave do servidor para o diretório /etc/openvpn/:

      • sudo cp ~/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/

      Usando um método seguro (como o SCP, no nosso exemplo abaixo), transfira o arquivo server.req para sua máquina CA:

      • scp ~/EasyRSA-3.0.4/pki/reqs/server.req sammy@your_CA_ip:/tmp

      Em seguida, na sua máquina CA, navegue até o diretório do EasyRSA:

      Utilizando o script easyrsa mais uma vez, importe o arquivo server.req seguindo o caminho do arquivo com seu nome comum:

      • ./easyrsa import-req /tmp/server.req server

      Então, assine o pedido executando o script easyrsa com a opção sign-req, seguida do tipo de pedido e do nome comum. O tipo de pedido pode ser client ou server, então para o pedido de certificado do servidor OpenVPN, certifique-se de usar o tipo de pedido do server:

      • ./easyrsa sign-req server server

      No resultado, você será solicitado a verificar se o pedido vem de uma fonte confiável. Digite yes, então pressione ENTER para confirmar:

      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 3650 days:
      
      subject=
          commonName                = server
      
      
      Type the word 'yes' to continue, or any other input to abort.
        Confirm request details: yes
      

      Caso tenha criptografado sua chave CA, você será solicitado a colocar sua senha neste ponto.

      Em seguida, transfira o certificado assinado de volta para seu servidor VPN usando um método seguro:

      • scp pki/issued/server.crt sammy@your_server_ip:/tmp

      Antes de sair da sua máquina CA, transfira também o arquivo ca.crt para seu servidor:

      • scp pki/ca.crt sammy@your_server_ip:/tmp

      Em seguida, logue novamente no seu servidor OpenVPN e copie os arquivos server.crt e ca.crt para o seu diretório /etc/openvpn/:

      • sudo cp /tmp/{server.crt,ca.crt} /etc/openvpn/

      Então, navegue até seu diretório do EasyRSA:

      Dali, crie uma chave Diffie-Hellman forte para usar durante a troca de chaves, digitando:

      Isso pode levar alguns minutos para completar. Assim que terminar, gere uma assinatura HMAC para reforçar as capacidades de verificação da integridade TLS do servidor:

      • openvpn --genkey --secret ta.key

      Quando o comando terminar, copie os dois novos arquivos para seu diretório /etc/openvpn/:

      • sudo cp ~/EasyRSA-3.0.4/ta.key /etc/openvpn/
      • sudo cp ~/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/

      Com isso, foram gerados todos os arquivos de certificado e de chave necessários pelo seu servidor. Você está pronto para criar os certificados e chaves correspondentes que sua máquina de cliente usará para acessar seu servidor OpenVPN.

      Passo 4 — Gerando um certificado de cliente e um par de chaves

      Embora você possa gerar uma chave privada e um pedido de certificado na sua máquina de cliente e então enviá-la para a CA para ser assinada, este guia define um processo para gerar o pedido de certificado no servidor. O benefício disso é que podemos criar um script que irá gerar automaticamente arquivos de configuração do cliente que contêm todas as chaves e certificados necessários. Isso permite que você evite ter que transferir chaves, certificados e arquivos de configuração para clientes e simplifica o processo de conexão ao VPN.

      Vamos gerar um único par, chave de cliente e certificado, para este guia. Se tiver mais de um cliente, você pode repetir este processo para cada um deles. Note, porém, que você precisará passar um valor de nome único ao script para cada cliente. Ao longo deste tutorial, o primeiro par de certificado/chave é chamado de client1.

      Inicie criando uma estrutura de diretório dentro do seu diretório home para armazenar os arquivos de certificado de cliente e de chave:

      • mkdir -p ~/client-configs/keys

      Como irá armazenar os pares de certificado/chave e arquivos de configuração dos seus clientes neste diretório, você deve bloquear suas permissões agora, como uma medida de segurança:

      • chmod -R 700 ~/client-configs

      Em seguida, navegue até o diretório do EasyRSA e execute o script easyrsa com as opções gen-req e nopass, junto com o nome comum para o cliente:

      • cd ~/EasyRSA-3.0.4/
      • ./easyrsa gen-req client1 nopass

      Pressione ENTER para confirmar o nome comum. Então, copie o arquivo client1.key para o diretório /client-configs/keys/ que você criou mais cedo:

      • cp pki/private/client1.key ~/client-configs/keys/

      Em seguida, transfira o arquivo client1.req para sua máquina CA usando um método seguro:

      • scp pki/reqs/client1.req sammy@your_CA_ip:/tmp

      Faça login na sua máquina CA, navegue até o diretório do EasyRSA, e importe o pedido de certificado:

      • ssh sammy@your_CA_ip
      • cd EasyRSA-3.0.4/
      • ./easyrsa import-req /tmp/client1.req client1

      Então, assine o pedido como fez para o servidor no passo anterior. Desta vez, certifique-se de especificar o tipo de pedido do client:

      • ./easyrsa sign-req client client1

      No prompt, digite yes para confirmar que você pretende assinar o pedido de certificado e que ele veio de uma fonte confiável:

      Output

      Type the word 'yes' to continue, or any other input to abort. Confirm request details: yes

      Novamente, caso tenha criptografado sua chave CA, você será solicitado a colocar sua senha aqui.

      Isso criará um arquivo de certificado de cliente chamado client1.crt. Transfira este arquivo de volta para o servidor:

      • scp pki/issued/client1.crt sammy@your_server_ip:/tmp

      Use o SSH de volta no seu servidor OpenVPN e copie o certificado de cliente para o diretório /client-configs/keys:

      • cp /tmp/client1.crt ~/client-configs/keys/

      Em seguida, copie também os arquivos ca.crt e ta.key para o diretório /client-configs/keys/:

      • cp ~/EasyRSA-3.0.4/ta.key ~/client-configs/keys/
      • sudo cp /etc/openvpn/ca.crt ~/client-configs/keys/

      Com isso, todos os certificados e chaves do seu servidor e do seu cliente foram gerados e estão armazenados nos diretórios apropriados do seu servidor. Ainda existem algumas ações que precisam ser feitas com esses arquivos, mas elas aparecerão em um passo mais adiante. Por enquanto, você pode seguir em frente para configurar o OpenVPN no seu servidor.

      Passo 5 — Configurando o serviço OpenVPN

      Agora que tanto os certificados quanto as chaves do seu cliente e do seu servidor foram gerados, você pode começar a configurar o serviço OpenVPN para usar essas credenciais.

      Inicie copiando uma amostra de um arquivo de configuração do OpenVPN para o diretório de configuração e então extraia-o para usá-lo como uma base para sua configuração:

      • sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
      • sudo gzip -d /etc/openvpn/server.conf.gz

      Abra a configuração do servidor no seu editor de texto preferido:

      • sudo nano /etc/openvpn/server.conf

      Encontre a seção HMAC procurando a diretriz tls-auth. Esta linha já deve estar descomentada, mas se não estiver, remova o “;” para descomentá-la:

      /etc/openvpn/server.conf

      tls-auth ta.key 0 # This file is secret
      

      Em seguida, encontre a seção sobre cifras criptográficas, procurando as linhas comentadas cipher. A cifra AES-256-CBC oferece um bom nível de criptografia e é bastante suportada. Novamente, esta linha já deve estar descomentada, mas se não estiver remova o “;” anterior a ela:

      /etc/openvpn/server.conf

      cipher AES-256-CBC
      

      Abaixo disso, adicione uma diretriz auth para selecionar o algoritmo message digest HMAC. Para fazer isso, o SHA256 é uma boa escolha:

      /etc/openvpn/server.conf

      auth SHA256
      

      Em seguida, encontre a linha que contém uma diretriz dh que define os parâmetros Diffie-Hellman. Devido a algumas alterações recentes feitas no EasyRSA, o nome do arquivo para a chave Diffie-Hellman pode ser diferente do que está listado no arquivo de configuração do servidor exemplo. Se necessário, altere o nome do arquivo listado aqui removendo o 2048 para que ele se alinhe com a chave que você gerou no passo anterior:

      /etc/openvpn/server.conf

      dh dh.pem
      

      Por fim, encontre as configurações user e group e remova os “;” no começo de cada para descomentar essas linhas:

      /etc/openvpn/server.conf

      user nobody
      group nogroup
      

      As alterações que você fez no arquivo exemplo server.conf até este ponto são necessárias para que o OpenVPN funcione. As alterações descritas abaixo são opcionais, embora também sejam necessárias para muitos casos de uso comum.

      (Opcional) Forçar alterações no DNS para redirecionar todo o tráfego através do VPN

      As configurações acima criarão a conexão VPN entre as duas máquinas, mas não forçarão nenhuma conexão a usar o túnel. Se quiser usar o VPN para rotear todo o seu tráfego, você provavelmente irá querer forçar as configurações DNS para os computadores do cliente.

      Há algumas diretrizes no arquivo server.conf que você deve alterar para habilitar esta funcionalidade. Encontre a seção redirect-gateway e remova o ponto e vírgula “;” do começo da linha redirect-gateway para descomentá-la:

      /etc/openvpn/server.conf

      push "redirect-gateway def1 bypass-dhcp"
      

      Logo abaixo, encontre a seção dhcp-option. Novamente, remova o “;” da frente de ambas as linhas para descomentá-las:

      /etc/openvpn/server.conf

      push "dhcp-option DNS 208.67.222.222"
      push "dhcp-option DNS 208.67.220.220"
      

      Isso ajudará os clientes a reconfigurar suas configurações DNS para usar o túnel VPN como gateway padrão.

      (Opcional) Ajustar a porta e o protocolo

      Por padrão, o servidor OpenVPN usa a porta 1194 e o protocolo UDP para aceitar conexões de clientes. Se precisar usar uma porta diferente, devido a ambientes de rede restritivos em que seus clientes possam estar, você pode alterar a opção port. Se não estiver hospedando conteúdo Web no seu servidor OpenVPN, a porta 443 é uma escolha popular, uma vez que ela é geralmente permitida em de regras de firewall.

      /etc/openvpn/server.conf

      # Optional!
      port 443
      

      Geralmente, o protocolo também é restrito a essa porta. Se for, mude o proto de UDP para TCP:

      /etc/openvpn/server.conf

      # Optional!
      proto tcp
      

      Se você de fato mudar o protocolo para o TCP, precisará alterar o valor explicit-exit-notify da diretriz de 1 para 0, já que essa diretriz é usada apenas pelo UDP. Não fazer isso ao usar o TCP irá causar erros quando você iniciar o serviço OpenVPN:

      /etc/openvpn/server.conf

      # Optional!
      explicit-exit-notify 0
      

      Se não tiver necessidade de usar uma porta e protocolos diferentes, é melhor deixar essas duas opções no seu padrão.

      (Opcional) Apontar para credenciais não padrão

      Se você selecionou um nome diferente durante o comando ./build-key-server mais cedo, modifique as linhas cert e key que você vê para apontar para os arquivos .crt e .key apropriados. Se você usou o nome padrão, “server”, isso já está configurado corretamente:

      /etc/openvpn/server.conf

      cert server.crt
      key server.key
      

      Quando você terminar, salve e feche o arquivo.

      Após passar e fazer as alterações na configuração OpenVPN do seu servidor que são necessárias para seu caso de uso específico, você pode começar a fazer algumas alterações na rede do seu servidor.

      Passo 6 — Ajustando a configuração da rede do servidor

      Existem alguns aspectos da configuração de rede do servidor que precisam ser ajustados para que o OpenVPN possa rotear corretamente o tráfego pelo VPN. O primeiro desses é o encaminhamento de IP, um método para determinar onde o tráfego de IP deve ser roteado. Isso é essencial para a funcionalidade VPN que seu servidor irá fornecer.

      Ajuste a configuração padrão de encaminhamento de IP do seu servidor, modificando o arquivo /etc/sysctl.conf:

      • sudo nano /etc/sysctl.conf

      Dentro, procure a linha comentada que define o net.ipv4.ip_forward. Remova o caractere “#” do começo da linha para descomentar esta configuração:

      /etc/sysctl.conf

      net.ipv4.ip_forward=1
      

      Salve e feche o arquivo quando você terminar.

      Para ler o arquivo e ajustar os valores para a sessão atual, digite:

      Output

      net.ipv4.ip_forward = 1

      Se seguiu o guia de configuração inicial do servidor Ubuntu 18.04 listado nos pré-requisitos, você deve ter um firewall UFW em funcionamento. Independentemente de você usar o firewall para bloquear tráfego indesejado (o que quase sempre se deve fazer), para este guia você precisa de um firewall para manipular uma parte do tráfego que vem para o servidor. Algumas das regras do firewall devem ser modificadas para habilitar o mascaramento, que é um conceito iptables que fornece tradução de endereço de rede (NAT) dinâmica e instantânea para rotear conexões com clientes de maneira correta.

      Antes de abrir o arquivo de configuração do firewall para adicionar as regras de mascaramento, você deve primeiro encontrar a interface de rede pública da sua máquina. Para fazer isso, digite:

      Sua interface pública é a string encontrada dentro do resultado desse comando que vem após a palavra “dev”. Por exemplo, este resultado mostra a interface chamada wlp11s0, que está destacada abaixo:

      Output

      default via 203.0.113.1 dev wlp11s0 proto static

      Quando tiver a interface associada à sua rota padrão, abra o arquivo /etc/ufw/before.rules para adicionar as configurações relevantes:

      • sudo nano /etc/ufw/before.rules

      As regras do UFW são normalmente adicionadas usando o comando ufw. As regras listadas no arquivo before.rules, em contrapartida, são lidas e colocadas em funcionamento antes das regras convencionais do UFW serem carregadas. Em direção ao topo do arquivo, adicione as linhas destacadas abaixo. Isso irá definir a política padrão para a cadeia POSTROUTING na tabela nat e mascarar todo o tráfego vindo do VPN. Lembre-se de substituir o wlp11s0 na linha -A POSTROUTING abaixo pela interface que você encontrou no comando acima:

      /etc/ufw/before.rules

      #
      # 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 wlp11s0 (change to the interface you discovered!)
      -A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
      COMMIT
      # END OPENVPN RULES
      
      # Don't delete these required lines, otherwise there will be errors
      *filter
      . . .
      

      Salve e feche o arquivo quando você terminar.

      Em seguida, você também precisa dizer ao UFW para permitir os pacotes redirecionados por padrão. Para fazer isso, abra o arquivo /etc/default/ufw:

      • sudo nano /etc/default/ufw

      Dentro, encontre a diretriz DEFAULT_FORWARD_POLICY e altere o valor de DROP para ACCEPT:

      /etc/default/ufw

      DEFAULT_FORWARD_POLICY="ACCEPT"
      

      Salve e feche o arquivo quando você terminar.

      Em seguida, ajuste o firewall em si para permitir o tráfego para o OpenVPN. Caso não tenha alterado a porta e o protocolo no arquivo /etc/openvpn/server.conf, você precisará abrir o tráfego UDP para a porta 1194. Se você modificou a porta e/ou o protocolo, substitua os valores que selecionou aqui.

      Caso tenha esquecido de adicionar a porta SSH ao seguir o tutorial pré-requisito, adicione-a também aqui:

      • sudo ufw allow 1194/udp
      • sudo ufw allow OpenSSH

      Após adicionar essas regras, desative e reative o UFW para reiniciá-lo e carregar as alterações de todos os arquivos que você modificou:

      • sudo ufw disable
      • sudo ufw enable

      Seu servidor agora está configurado para lidar corretamente com o tráfego OpenVPN.

      Passo 7 — Inicializando e ativando o serviço OpenVPN

      Você finalmente está pronto para inicializar o serviço OpenVPN no seu servidor. Isso é feito usando o utilitário systemctl do systemd.

      Inicie o servidor OpenVPN especificando o nome do seu arquivo de configuração como uma variável de instância após o nome do arquivo de unidade systemd. O arquivo de configuração para o seu servidor chama-se /etc/openvpn/server.conf, então adicione @server ao final do seu arquivo de unidade ao chamá-lo:

      • sudo systemctl start openvpn@server

      Verifique novamente se o serviço foi iniciado com sucesso digitando:

      • sudo systemctl status openvpn@server

      Se tudo correu bem, seu resultado se parecerá com este:

      Output

      ● openvpn@server.service - OpenVPN connection to server Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled) Active: active (running) since Tue 2016-05-03 15:30:05 EDT; 47s ago Docs: man:openvpn(8) https://community.openvpn.net/openvpn/wiki/Openvpn23ManPage https://community.openvpn.net/openvpn/wiki/HOWTO Process: 5852 ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/%i.conf --writepid /run/openvpn/%i.pid (code=exited, sta Main PID: 5856 (openvpn) Tasks: 1 (limit: 512) CGroup: /system.slice/system-openvpn.slice/openvpn@server.service └─5856 /usr/sbin/openvpn --daemon ovpn-server --status /run/openvpn/server.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/server.conf --writepid /run/openvpn/server.pid

      Você também pode verificar se a interface OpenVPN tun0 está disponível digitando:

      Isso dará como resultado uma interface configurada:

      Output

      4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100 link/none inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0 valid_lft forever preferred_lft forever

      Após inicializar o serviço, habilite-o para que ele seja iniciado automaticamente no boot:

      • sudo systemctl enable openvpn@server

      Seu serviço OpenVPN agora está funcionando. Entretanto, antes de começar a usá-lo, você deve primeiro criar um arquivo de configuração para a máquina do cliente. Este tutorial já mostrou como criar pares de certificado/key para clientes, e no próximo passo vamos demonstrar como criar uma infraestrutura que irá gerar arquivos de configuração do cliente facilmente.

      Passo 8 — Criando a infraestrutura de configuração de clientes

      Criar arquivos de configuração para os clientes OpenVPN pode ser um desafio, já que cada cliente deve ter sua própria configuração e cada um deve se alinhar com as configurações descritas no arquivo de configuração do servidor. Ao invés de escrever um único arquivo de configuração que só pode ser usado para um cliente, este passo define um processo para a construção de uma infraestrutura de configuração de clientes que você pode usar para gerar arquivos de configuração imediatamente. Você criará primeiro um arquivo de configuração “base” e então construirá um script que permitirá que você gere arquivos únicos de configuração de clientes, certificados e chaves conforme necessário.

      Comece criando um novo diretório onde você irá armazenar arquivos de configuração de clientes no diretório client-configs que você criou mais cedo:

      • mkdir -p ~/client-configs/files

      Em seguida, copie um arquivo de configuração de cliente exemplo para o diretório client-configs para usá-lo como sua configuração base:

      • cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

      Abra este novo arquivo no seu editor de texto:

      • nano ~/client-configs/base.conf

      Dentro, localize a diretriz remote. Isso aponta o cliente para seu endereço de servidor OpenVPN — o endereço IP público do seu servidor OpenVPN. Caso tenha decidido alterar a porta em que o servidor OpenVPN está escutando, também será preciso alterar a 1194 para a porta que você selecionou:

      ~/client-configs/base.conf

      . . .
      # The hostname/IP and port of the server.
      # You can have multiple remote entries
      # to load balance between the servers.
      remote your_server_ip 1194
      . . .
      

      Certifique-se de que o protocolo corresponda ao valor que você está usando na configuração do servidor:

      ~/client-configs/base.conf

      proto udp
      

      Em seguida, descomente as diretrizes user e group removendo o “;” no começo de cada linha:

      ~/client-configs/base.conf

      # Downgrade privileges after initialization (non-Windows only)
      user nobody
      group nogroup
      

      Encontre as diretrizes que definem ca, cert e key. Comente essas diretrizes, já que você adicionará os certificados e chaves dentro do arquivo em si em breve:

      ~/client-configs/base.conf

      # 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
      

      Do mesmo modo, comente a diretriz tls-auth, já que você adicionará a ta.key diretamente no arquivo de configuração do cliente:

      ~/client-configs/base.conf

      # If a tls-auth key is used on the server
      # then every client must also have the key.
      #tls-auth ta.key 1
      

      Espelhe as configurações cipher e auth que você definiu no arquivo /etc/openvpn/server.conf:

      ~/client-configs/base.conf

      cipher AES-256-CBC
      auth SHA256
      

      Em seguida, adicione a diretriz key-direction em algum lugar no arquivo. Você deve definir isso em “1” para que o VPN funcione corretamente na máquina do cliente:

      ~/client-configs/base.conf

      key-direction 1
      

      Por fim, adicione algumas linhas comentadas. Embora possa incluir essas diretrizes em todos os arquivos de configuração de clientes, você precisa habilitá-las para clientes Linux que acompanham um arquivo /etc/openvpn/update-resolv-conf. Este script usa o utilitário resolvconf para atualizar as informações DNS para clientes Linux.

      ~/client-configs/base.conf

      # script-security 2
      # up /etc/openvpn/update-resolv-conf
      # down /etc/openvpn/update-resolv-conf
      

      Se seu cliente estiver usando o Linux e tiver um arquivo /etc/openvpn/update-resolv-conf, descomente essas linhas do arquivo de configuração do cliente após terem sido geradas.

      Salve e feche o arquivo quando você terminar.

      Em seguida, crie um script simples que irá compilar sua configuração base com os arquivos de certificado, chave, e criptografia relevantes e então colocar a configuração gerada no diretório ~/client-configs/files. Abra um novo arquivo chamado make_config.sh dentro do diretório ~/client-configs:

      • nano ~/client-configs/make_config.sh

      Dentro, adicione o seguinte conteúdo:

      ~/client-configs/make_config.sh

      #!/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-auth>') 
          ${KEY_DIR}/ta.key 
          <(echo -e '</tls-auth>') 
          > ${OUTPUT_DIR}/${1}.ovpn
      

      Salve e feche o arquivo quando você terminar.

      Antes de seguir em frente, certifique-se de marcar este arquivo como executável digitando:

      • chmod 700 ~/client-configs/make_config.sh

      Este script fará uma cópia do arquivo base.conf que você fez, coletará todos os arquivos de certificado e chave que você criou para seu cliente, extrairá os conteúdos deles, adicionará esse conteúdo à cópia do arquivo de configuração base e exportará tudo isso para um novo arquivo de configuração de clientes. Isso significa que, ao invés de ter que gerenciar os arquivos de configuração do cliente, certificado e chave separadamente, todas as informações necessárias são armazenadas em um só lugar. O benefício disso é que, caso tenha necessidade de adicionar um cliente no futuro, você pode executar este script para criar rapidamente o arquivo de configuração e garantir que todas as informações importantes são armazenadas em uma única localização de fácil acesso.

      Note que, sempre que adicionar um novo cliente, você precisará gerar novas chaves e certificados para ele antes de executar este script e gerar seu arquivo de configuração. Você poderá praticar um pouco a utilização deste script no próximo passo.

      Passo 9 — Gerando as configurações de clientes

      Se seguiu com o guia, você criou um certificado e chave de cliente nomeados client1.crt e client1.key, respectivamente, no passo 4. É possível gerar um arquivo de configuração para essas credenciais entrando no seu diretório ~/client-configs e executando o script que você fez no final do passo anterior:

      • cd ~/client-configs
      • sudo ./make_config.sh client1

      Isso criará um arquivo chamado client1.ovpn no seu diretório ~/client-configs/files:

      • ls ~/client-configs/files

      Output

      client1.ovpn

      Você precisa transferir esse arquivo para o dispositivo que planeja usar como cliente. Por exemplo, este poderia ser seu computador local ou um dispositivo móvel.

      Embora os aplicativos exatos usados para realizar essa transferência dependerão do sistema operacional do seu dispositivo e de suas preferências pessoais, um método confiável e seguro é usar o SFTP (protocolo SSH de transferência de arquivos) ou SCP (cópia segura) no backend. Isso transportará os arquivos de autenticação do VPN do seu cliente através de uma conexão criptografada.

      Aqui está um comando SFTP exemplo usando o exemplo client1.ovpn que você pode executar do seu computador local (macOS ou Linux). Ele coloca o arquivo .ovpn no seu diretório home:

      • sftp sammy@your_server_ip:client-configs/files/client1.ovpn ~/

      Aqui estão diversas ferramentas e tutoriais para transferir arquivos com segurança do servidor para um computador local:

      Passo 10 — Instalando a configuração do cliente

      Esta seção aborda como instalar um perfil VPN de um cliente no Windows, macOS, Linux, iOS e Android. Nenhuma dessas instruções de cliente dependem uma da outra, então sinta-se a vontade para pular para alguma que seja aplicável ao seu dispositivo.

      A conexão OpenVPN terá o mesmo nome que você chamou o arquivo .ovpn. No que diz respeito a este tutorial, isso significa que a conexão se chama client1.ovpn, de acordo com o primeiro arquivo de cliente que você gerou.

      Windows

      Instalando

      Faça download do aplicativo do cliente OpenVPN para o Windows da página de download do OpenVPN. Escolha a versão do instalador apropriada para a sua versão do Windows.

      Nota: O OpenVPN precisa de privilégios administrativos para ser instalado.

      Após instalar o OpenVPN, copie o arquivo .ovpn para:

      C:Program FilesOpenVPNconfig
      

      Quando iniciar o OpenVPN, ele verá o perfil e o disponibilizará automaticamente.

      Você deve executar o OpenVPN como administrador sempre que ele é usado, mesmo por contas administrativas. Para fazer isso sem precisar clicar com o botão direito e selecionar Executar como administrador sempre que você usar o VPN, é necessário predefinir isso de uma conta administrativa. Isso significa que os usuários padrão também precisam digitar a senha do administrador para usar o OpenVPN. Por outro lado, os usuários padrão não conseguem se conectar devidamente ao servidor a não ser que o aplicativo OpenVPN no cliente tenha direitos de administrador, então são necessários privilégios elevados.

      Para definir que o aplicativo OpenVPN sempre execute como administrador, clique com o botão direito no seu atalho e vá em Propriedades. No final da aba Compatibilidade, clique no botão para Mudar as configurações para todos os usuários. Na nova janela, marque Executar este programa como administrador.

      Conectando

      Cada vez que iniciar a OpenVPN GUI, o Windows irá perguntar se você quer permitir que o programa faça alterações no seu computador. Clique em Yes. Iniciar o aplicativo do cliente OpenVPN coloca apenas o applet na bandeja do sistema para que você possa conectar e desconectar o VPN conforme necessário; isso não cria de fato a conexão VPN.

      Assim que o OpenVPN iniciar, inicie uma conexão entrando no applet da bandeja do sistema e clicando com o botão direito no ícone do applet do OpenVPN. Isso abre o menu de contexto. Selecione client1 no topo do menu (esse é seu perfil client1.ovpn) e escolha Connect.

      Uma janela de status abrirá mostrando o registro de saída enquanto a conexão estiver estabelecida, e uma mensagem aparecerá assim que o cliente estiver conectado.

      Desconecte-se do VPN da mesma maneira: Vá até o applet da bandeja do sistema, clique com o botão direito no ícone do applet do OpenVPN, selecione o perfil do cliente e clique em Disconnect.

      macOS

      Instalando

      O Tunnelblick é um cliente OpenVPN gratuito e de código aberto para o macOS. Você pode baixar a imagem de disco mais recente da página de downloads do Tunnelblick. Clique duas vezes no arquivo baixado .dmg e siga os prompts para instalar.

      Ao final do processo de instalação, o Tunnelblick irá perguntar se você tem algum arquivo de configuração. Responda I have configuration files e deixe o Tunnelblick terminar. Abra uma janela do Finder e clique duas vezes no client1.ovpn. O Tunnelblick instalará o perfil do cliente. São necessário privilégios administrativos.

      Conectando

      Inicie o Tunnelblick clicando duas vezes no ícone do Tunnelblick na pasta Applications. Assim que o Tunnelblick iniciar, haverá um ícone do Tunnelblick na barra do menu no canto superior direito da tela para controle de conexões. Clique no ícone e então no item do menu Connect client1 para iniciar a conexão VPN.

      Linux

      Instalando

      Se estiver usando o Linux, existe uma variedade de ferramentas que você pode usar dependendo da sua distribuição. Seu ambiente do desktop ou gerenciador de janelas também pode incluir serviços de conexão.

      Entretanto, o modo mais universal de se conectar é apenas usar o software OpenVPN.

      No Ubuntu ou Debian, você pode instalá-lo assim como fez no servidor digitando:

      • sudo apt update
      • sudo apt install openvpn

      No CentOS, você pode habilitar os repositórios EPEL e então instalá-lo digitando:

      • sudo yum install epel-release
      • sudo yum install openvpn

      Configurando

      Verifique se sua distribuição inclui um script /etc/openvpn/update-resolv-conf:

      Output

      update-resolv-conf

      Em seguida, edite o arquivo de configuração do cliente OpenVPN que você transferiu:

      Se conseguir encontrar um arquivo update-resolv-conf, descomente as três linhas que você adicionou para ajustar as configurações DNS:

      client1.ovpn

      script-security 2
      up /etc/openvpn/update-resolv-conf
      down /etc/openvpn/update-resolv-conf
      

      Se estiver usando o CentOS, altere a diretriz group de nogroup para nobody de forma a corresponder aos grupos disponíveis da distribuição:

      client1.ovpn

      group nobody
      

      Salve e feche o arquivo.

      Agora, você pode se conectar ao VPN apenas apontando o comando openvpn para o arquivo de configuração do cliente:

      • sudo openvpn --config client1.ovpn

      Isso deve conectar você ao seu VPN.

      iOS

      Instalando

      A partir da App Store do iTunes, procure e instale o OpenVPN Connect, o aplicativo oficial do cliente iOS OpenVPN. Para transferir sua configuração do cliente iOS para o dispositivo, conecte-o diretamente a um computador.

      O processo de completar a transferência com o iTunes é descrito aqui. Abra o iTunes no computador e clique em iPhone > apps. Role até o final da seção File Sharing e clique no app OpenVPN. A janela em branco à direita, OpenVPN Documents, serve para compartilhar arquivos. Arraste o arquivo .ovpn para a janela OpenVPN Documents.

      iTunes showing the VPN profile ready to load on the iPhone

      Agora, inicie o app OpenVPN no iPhone. Você receberá uma notificação de que um novo perfil está pronto para ser importado. Clique no sinal mais em verde para importá-lo.

      The OpenVPN iOS app showing new profile ready to import

      Conectando

      O OpenVPN agora está pronto para ser usado com o novo perfil. Inicie a conexão deslizando o botão Connect para a posição On. Desconecte deslizando o mesmo botão para Off.

      Nota: O switch VPN em Settings não pode ser usado para se conectar ao VPN. Se tentar fazer isso, receberá uma notificação para se conectar apenas usando o app OpenVPN.

      The OpenVPN iOS app connected to the VPN

      Android

      Instalando

      Abra a Google Play Store. Procure e instale o Android OpenVPN Connect, o aplicativo oficial do cliente Android OpenVPN.

      Você pode transferir o perfil .ovpn conectando o dispositivo Android ao seu computador por USB e copiando o arquivo. Como alternativa, caso tenha um leitor de cartões SD, você pode remover o cartão SD do dispositivo, copiar o perfil nele e então inserir o cartão de volta no dispositivo Android.

      Inicie o app OpenVPN e clique no menu para importar o perfil.

      The OpenVPN Android app profile import menu selection

      Então navegue até a localização do perfil salvo (a captura de tela usa /sdcard/Download/) e selecione o arquivo. O app criará uma nota de que o perfil foi importado.

      The OpenVPN Android app selecting VPN profile to import

      Conectando

      Para se conectar, basta apertar o botão Connect. Você será questionado se confia no aplicativo OpenVPN. Escolha OK para iniciar a conexão. Para se desconectar do VPN, volte para o app OpenVPN e escolha Disconnect.

      The OpenVPN Android app ready to connect to the VPN

      Passo 11 — Testando sua conexão VPN (opcional)

      Nota: Este método utilizado no teste da sua conexão VPN funcionará apenas se você optou por rotear todo o seu tráfego através do VPN no Passo 5.

      Assim que tudo estiver instalado, um simples visto confirma que tudo está funcionando corretamente. Sem ter uma conexão VPN habilitada, abra um navegador e vá para DNSLeakTest.

      O site irá retornar o endereço IP atribuído pelo seu provedor de serviço de Internet e como você se mostra para o resto do mundo. Para verificar suas configurações DNS através do mesmo site, clique em Extended Test e ele dirá a você quais servidores DNS você está usando.

      Agora, conecte o cliente OpenVPN ao seu VPN do Droplet e atualize o navegador. Um endereço IP completamente diferente (daquele do seu servidor VPN) deve aparecer agora e é assim que você aparece para o mundo. Novamente, o Extended Test do DNSLeakTest irá verificar suas configurações DNS e confirmar que você agora está usando os resolvers DNS definidos pelo seu VPN.

      Passo 12 — Revogando certificados de clientes

      De vez em quando, você pode precisar revogar um certificado de cliente para impedir o acesso adicional ao servidor OpenVPN.

      Para fazer isso, navegue até o diretório EasyRSA na sua máquina CA:

      Em seguida, execute o script easyrsa com a opção revoke, seguida do nome do cliente que você deseja revogar:

      Isso irá pedir que você confirme a revogação digitando yes:

      Output

      Please confirm you wish to revoke the certificate with the following subject: subject= commonName = client2 Type the word 'yes' to continue, or any other input to abort. Continue with revocation: yes

      Após confirmar a ação, a CA irá revogar completamente o certificado do cliente. Entretanto, seu servidor OpenVPN ainda não tem como verificar se os certificados de clientes foram revogados e se o cliente ainda terá acesso ao VPN. Para corrigir isso, crie uma lista de revogação de certificados (CRL) na sua máquina CA:

      Isso irá gerar um arquivo chamado crl.pem. Transfira com segurança este arquivo para seu servidor OpenVPN:

      • scp ~/EasyRSA-3.0.4/pki/crl.pem sammy@your_server_ip:/tmp

      No seu servidor OpenVPN, copie este arquivo para seu diretório /etc/openvpn/:

      • sudo cp /tmp/crl.pem /etc/openvpn

      Em seguida, abra o arquivo de configuração do servidor OpenVPN:

      • sudo nano /etc/openvpn/server.conf

      No final do arquivo, adicione a opção crl-verify que irá instruir o servidor OpenVPN para verificar a lista de revogação de certificados que criamos sempre que uma tentativa de conexão for feita:

      /etc/openvpn/server.conf

      crl-verify crl.pem
      

      Salve e feche o arquivo.

      Por fim, reinicie o OpenVPN para implementar a revogação do certificado:

      • sudo systemctl restart openvpn@server

      O cliente já não deve conseguir se conectar com sucesso ao servidor usando a credencial antiga.

      Para revogar outros clientes, siga este processo:

      1. Revogue o certificado com o comando ./easyrsa revoke client_name
      2. Gere um novo CRL
      3. Transfira o novo arquivo crl.pem para seu servidor OpenVPN e copie-o para o diretório /etc/openvpn para sobrepor a lista antiga.
      4. Reinicie o serviço OpenVPN.

      Você pode usar este processo para revogar quaisquer certificados que você tenha emitido anteriormente para seu servidor.

      Conclusão

      Agora, você está navegando na Internet com segurança protegendo sua identidade, local e tráfego de bisbilhoteiros e censuradores.

      Para configurar mais clientes, você só precisa seguir os passos 4 e 9-11 para cada dispositivo adicional. Para revogar o acesso a clientes, siga o passo 12.



      Source link

      Como configurar o Laravel, Nginx e MySQL com o Docker Compose


      O autor selecionou A FreeBSD Foundation para receber uma doação como parte do programa Write for DOnations.

      Introdução

      Ao longo dos últimos anos, o Docker tornou-se uma solução frequentemente usada para implantar aplicativos graças a como ele simplifica a execução e implantação de aplicativos em contêineres efêmeros. Ao usar uma pilha do aplicativo LEMP, por exemplo, com o PHP, Nginx, MySQL e o framework Laravel, o Docker pode simplificar significativamente o processo de configuração.

      O Docker Compose simplificou ainda mais o processo de desenvolvimento, permitindo que os desenvolvedores definam sua infraestrutura, incluindo serviços de aplicativo, redes e volumes em um único arquivo. O Docker Compose oferece uma alternativa eficiente para executar vários comandos docker container create e docker container run.

      Neste tutorial, você irá construir um aplicativo Web usando o framework Laravel, com o Nginx como servidor Web e o MySQL como banco de dados, todos dentro de contêineres Docker. Você definirá a configuração de toda a pilha em um arquivo docker-compose, junto com arquivos de configuração para o PHP, MySQL e Nginx.

      Pré-requisitos

      Antes de começar, será necessário:

      Passo 1 — Fazendo download do Laravel e instalando dependências

      Como primeiro passo, vamos obter a versão mais recente do Laravel e instalar as dependências para o projeto, incluindo o Composer, o gerenciador de pacotes a nível de aplicativo para o PHP. Vamos instalar essas dependências com o Docker para evitar ter que instalar o Composer globalmente.

      Primeiramente, verifique se você está no seu diretório home e faça uma cópia do último lançamento do Laravel para um diretório chamado laravel-app:

      • cd ~
      • git clone https://github.com/laravel/laravel.git laravel-app

      Vá até o diretório laravel-app:

      Em seguida, utilize a imagem do composer para montar os diretórios que você precisará para seu projeto Laravel e evite os custos de instalar o Composer globalmente:

      • docker run --rm -v $(pwd):/app composer install

      Ao usar os flag -v e --rm com o docker run, cria-se um contêiner efêmero que será montado e ligado ao seu diretório atual antes de ser removido. Isso irá copiar o conteúdo do seu diretório ~/laravel-app para o container e também irá garantir que a pasta vendor que o Composer cria dentro do container seja copiada para seu diretório atual.

      Como passo final, defina as permissões no diretório do projeto para que ele seja propriedade do seu usuário não root:

      • sudo chown -R $USER:$USER ~/laravel-app

      Isso será importante quando escrever o Dockerfile para sua imagem do aplicativo no Passo 4, uma vez que permitirá que você trabalhe com seu código do aplicativo e executar processos no seu contêiner como um usuário não root.

      Com seu código do aplicativo funcionando, você pode seguir em frente para definir seus serviços com o Docker Compose.

      Passo 2 — Criando o arquivo do Docker Compose

      Construir seus aplicativos com o Docker Compose simplifica o processo de configurar e criar uma nova versão da sua infraestrutura. Para configurar nosso aplicativo Laravel, vamos escrever um arquivo docker-compose que defina nosso servidor Web, banco de dados e serviços de aplicativo.

      Abra o arquivo:

      • nano ~/laravel-app/docker-compose.yml

      No arquivo docker-compose, você definirá três serviços: app, webserver e db. Adicione o código a seguir ao arquivo, certificando-se de substituir a senha root para o MYSQL_ROOT_PASSWORD, definida como uma variável de ambiente sob o serviço db, por uma senha forte da sua escolha:

      ~/laravel-app/docker-compose.yml

      version: '3'
      services:
      
        #PHP Service
        app:
          build:
            context: .
            dockerfile: Dockerfile
          image: digitalocean.com/php
          container_name: app
          restart: unless-stopped
          tty: true
          environment:
            SERVICE_NAME: app
            SERVICE_TAGS: dev
          working_dir: /var/www
          networks:
            - app-network
      
        #Nginx Service
        webserver:
          image: nginx:alpine
          container_name: webserver
          restart: unless-stopped
          tty: true
          ports:
            - "80:80"
            - "443:443"
          networks:
            - app-network
      
        #MySQL Service
        db:
          image: mysql:5.7.22
          container_name: db
          restart: unless-stopped
          tty: true
          ports:
            - "3306:3306"
          environment:
            MYSQL_DATABASE: laravel
            MYSQL_ROOT_PASSWORD: your_mysql_root_password
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
          networks:
            - app-network
      
      #Docker Networks
      networks:
        app-network:
          driver: bridge
      

      Os serviços aqui definidos incluem:

      • app: esta definição de serviço contém o aplicativo Laravel e executa uma imagem personalizada do Docker, digitalocean.com/php, que você definirá no Passo 4. Ela também define o working_dir no contêiner para /var/www.
      • webserver: esta definição de serviço extrai a imagem nginx:alpine do Docker e expõe as portas 80 e 443.
      • db: esta definição de serviço extrai a imagem mysql:5.7.22 do Docker e define algumas variáveis de ambiente, incluindo um banco de dados chamado laravel para seu aplicativo e a senha da root para o banco de dados. Você pode dar o nome que quiser ao banco de dados e deve substituir o your_mysql_root_password pela senha forte escolhida. Esta definição de serviço também mapeia a porta 3306 no host para a porta 3306 no contêiner.

      Cada propriedade container_name define um nome para o contêiner, que corresponde ao nome do serviço. Se não definir esta propriedade, o Docker irá atribuir um nome a cada contêiner combinando um nome de uma pessoa historicamente famosa e uma palavra aleatória separada por um underline.

      Para facilitar a comunicação entre contêineres, os serviços estão conectados a uma rede bridge chamada app-network. Uma rede bridge utiliza um software bridge que permite que os contêineres conectados à mesma rede bridge se comuniquem uns com os outros. O driver da bridge instala automaticamente regras na máquina do host para que contêineres em redes bridge diferentes não possam se comunicar diretamente entre eles. Isso cria um nível de segurança mais elevado para os aplicativos, garantindo que apenas serviços relacionados possam se comunicar uns com os outros. Isso também significa que você pode definir várias redes e serviços que se conectam a funções relacionadas: os serviços de aplicativo front-end podem usar uma rede frontend, por exemplo, e os serviços back-end podem usar uma rede backend.

      Vamos ver como adicionar volumes e bind mounts às definições do seu serviço para persistir os dados do seu aplicativo.

      Passo 3 — Persistindo os dados

      O Docker tem recursos poderosos e convenientes para persistir os dados. No nosso aplicativo, vamos usar volumes e bind mounts para persistir o banco de dados, o aplicativo e os arquivos de configuração. Os volumes oferecem flexibilidade para backups e persistência além do ciclo de vida de um contêiner, enquanto os bind mounts facilitam alterações no código durante o desenvolvimento, fazendo alterações nos arquivos do host ou diretórios imediatamente disponíveis nos seus contêineres. Nossa configuração usará ambos.

      Aviso: ao usar os bind mounts, você torna possível alterar o sistema de arquivos do host através de processos executados em um contêiner, incluindo criar, modificar ou excluir arquivos de sistema ou diretórios importantes. Esta é uma habilidade poderosa com implicações de segurança e pode ter impacto em processos além do Docker no sistema do host. Use os bind mounts com cuidado.

      No arquivo docker-compose, defina um volume chamado dbdata sob a definição do serviço db para persistir o banco de dados MySQL:

      ~/laravel-app/docker-compose.yml

      ...
      #MySQL Service
      db:
        ...
          volumes:
            - dbdata:/var/lib/mysql
          networks:
            - app-network
        ...
      

      O volume com nome dbdata persiste o conteúdo da pasta /var/lib/mysql presente dentro do container. Isso permite que você pare e reinicie o serviço db sem perder dados.

      No final do arquivo, adicione a definição para o volume dbdata:

      ~/laravel-app/docker-compose.yml

      ...
      #Volumes
      volumes:
        dbdata:
          driver: local
      

      Com esta definição no lugar, você poderá usar este volume em diferentes serviços.

      Em seguida, adicione um bind mount ao serviço db para os arquivos de configuração do MySQL que você criará no Passo 7:

      ~/laravel-app/docker-compose.yml

      ...
      #MySQL Service
      db:
        ...
          volumes:
            - dbdata:/var/lib/mysql
            - ./mysql/my.cnf:/etc/mysql/my.cnf
        ...
      

      Este bind mount vincula o ~/laravel-app/mysql/my.cnf ao /etc/mysql/my.cnf no contêiner.

      Em seguida, adicione bind mounts ao serviço webserver. Haverá dois: um para seu código do aplicativo e outro para a definição de configuração do Nginx que você criará no Passo 6:

      ~/laravel-app/docker-compose.yml

      #Nginx Service
      webserver:
        ...
        volumes:
            - ./:/var/www
            - ./nginx/conf.d/:/etc/nginx/conf.d/
        networks:
            - app-network
      

      O primeiro bind mount vincula o código do aplicativo no diretório ~/laravel-app ao diretório /var/www dentro do contêiner. O arquivo de configuração que você adicionará ao ~/laravel-app/nginx/conf.d/ também será montado em etc/nginx/conf.d/ no container, permitindo que o conteúdo do diretório de configuração seja adicionado ou modificado conforme necessário.

      Por fim, adicione os seguintes bind mounts ao serviço app para o código do aplicativo e os arquivos de configuração:

      ~/laravel-app/docker-compose.yml

      #PHP Service
      app:
        ...
        volumes:
             - ./:/var/www
             - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
        networks:
            - app-network
      

      O serviço app está vinculando a pasta ~/laravel-app, que contém o código do aplicativo, à pasta /var/www no contêiner com o uso do bind mount. Isso irá acelerar o processo de desenvolvimento, uma vez que quaisquer alterações feitas no seu diretório local do aplicativo serão refletidas instantaneamente dentro do contêiner. Você também está vinculando seu arquivo de configuração PHP, ~/laravel-app/php/local.ini, ao /usr/local/etc/php/conf.d/local.ini dentro do contêiner. Você criará o arquivo de configuração local do PHP no Passo 5.

      Seu arquivo docker-compose agora se parecerá com este:

      ~/laravel-app/docker-compose.yml

      version: '3'
      services:
      
        #PHP Service
        app:
          build:
            context: .
            dockerfile: Dockerfile
          image: digitalocean.com/php
          container_name: app
          restart: unless-stopped
          tty: true
          environment:
            SERVICE_NAME: app
            SERVICE_TAGS: dev
          working_dir: /var/www
          volumes:
            - ./:/var/www
            - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
          networks:
            - app-network
      
        #Nginx Service
        webserver:
          image: nginx:alpine
          container_name: webserver
          restart: unless-stopped
          tty: true
          ports:
            - "80:80"
            - "443:443"
          volumes:
            - ./:/var/www
            - ./nginx/conf.d/:/etc/nginx/conf.d/
          networks:
            - app-network
      
        #MySQL Service
        db:
          image: mysql:5.7.22
          container_name: db
          restart: unless-stopped
          tty: true
          ports:
            - "3306:3306"
          environment:
            MYSQL_DATABASE: laravel
            MYSQL_ROOT_PASSWORD: your_mysql_root_password
            SERVICE_TAGS: dev
            SERVICE_NAME: mysql
          volumes:
            - dbdata:/var/lib/mysql/
            - ./mysql/my.cnf:/etc/mysql/my.cnf
          networks:
            - app-network
      
      #Docker Networks
      networks:
        app-network:
          driver: bridge
      #Volumes
      volumes:
        dbdata:
          driver: local
      

      Salve o arquivo e saia do seu editor quando terminar de fazer alterações.

      Com seu arquivo docker-compose escrito, você pode agora construir a imagem personalizada para seu aplicativo.

      Passo 4 — Criando o Dockerfile

      O Docker permite que você especifique o ambiente dentro de contêineres individuais com um* Dockerfil*e. Um Dockerfile permite que você crie imagens personalizadas que você possa usar para instalar o software necessário para seu aplicativo e configurar as definições baseando-se nos seus requisitos. Você pode enviar as imagens personalizadas que você criar para o Docker Hub ou qualquer registro privado.

      Nosso Dockerfile estará localizado no nosso diretório ~/laravel-app. Crie o arquivo:

      • nano ~/laravel-app/Dockerfile

      Este Dockerfile irá definir a imagem base e especificar os comandos e instruções necessários para construir a imagem do aplicativo Laravel. Adicione o código a seguir ao arquivo:

      ~/laravel-app/php/Dockerfile

      FROM php:7.2-fpm
      
      # Copy composer.lock and composer.json
      COPY composer.lock composer.json /var/www/
      
      # Set working directory
      WORKDIR /var/www
      
      # Install dependencies
      RUN apt-get update && apt-get install -y 
          build-essential 
          mysql-client 
          libpng-dev 
          libjpeg62-turbo-dev 
          libfreetype6-dev 
          locales 
          zip 
          jpegoptim optipng pngquant gifsicle 
          vim 
          unzip 
          git 
          curl
      
      # Clear cache
      RUN apt-get clean && rm -rf /var/lib/apt/lists/*
      
      # Install extensions
      RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
      RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
      RUN docker-php-ext-install gd
      
      # Install composer
      RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
      
      # Add user for laravel application
      RUN groupadd -g 1000 www
      RUN useradd -u 1000 -ms /bin/bash -g www www
      
      # Copy existing application directory contents
      COPY . /var/www
      
      # Copy existing application directory permissions
      COPY --chown=www:www . /var/www
      
      # Change current user to www
      USER www
      
      # Expose port 9000 and start php-fpm server
      EXPOSE 9000
      CMD ["php-fpm"]
      

      Primeiramente, o Dockerfile cria uma imagem sobre a imagem Docker php:7.2-fpm. Esta é uma imagem baseada no Debian que tem a implementação FastCGI PHP-FPM do PHP instalada. O arquivo também instala os pacotes pré-requisitos para o Laravel: o mcrypt, pdo_mysql, mbstring e imagick com o composer.

      A diretriz RUN especifica os comandos para atualizar, instalar e configurar as configurações dentro do contêiner, incluindo a criação de um usuário e grupo dedicados chamados www. A instrução WORKDIR especifica o diretório /var/www como diretório de trabalho para o aplicativo.

      Criar um usuário e grupo dedicados com permissões limitadas mitiga a vulnerabilidade inerente na execução de contêineres Docker, que são executados por padrão como root. Ao invés de executar este contêiner como root, criamos o usuário www, que tem acesso de leitura/escrita à pasta /var/www graças à instrução COPY que estamos usando com a flag --chown para copiar as permissões da pasta do aplicativo.

      Por fim, o comando EXPOSE expõe uma porta no contêiner, 9000, para o servidor php-fpm. O CMD especifica o comando que deve ser executado assim que o contêiner for criado. Aqui, o CMD especifica o "php-fpm", que fará com que o servidor inicie.

      Salve o arquivo e saia do seu editor quando terminar de fazer alterações.

      Agora, você pode seguir em frente para definir sua configuração PHP.

      Passo 5 — Configurando o PHP

      Agora que você definiu sua infraestrutura no arquivo docker-compose, é possível configurar o serviço PHP para agir como um processador PHP para pedidos de entrada do Nginx.

      Para configurar o PHP, será criado o arquivo local.ini dentro da pasta php. Este é o arquivo que você vinculou ao /usr/local/etc/php/conf.d/local.ini dentro do contêiner no Passo 2. A criação deste arquivo permitirá que você substitua o arquivo padrão php.ini que o PHP lê quando inicia.

      Crie o diretório php:

      Em seguida, abra o arquivo local.ini:

      • nano ~/laravel-app/php/local.ini

      Para demonstrar como configurar o PHP, adicionaremos o código a seguir para definir limitações de tamanho para arquivos enviados:

      ~/laravel-app/php/local.ini

      upload_max_filesize=40M
      post_max_size=40M
      

      As diretrizes upload_max_filesize e post_max_size definem o tamanho máximo permitido para arquivos enviados e demonstram como você pode definir configurações php.ini a partir do seu arquivo local.ini. Você pode colocar qualquer configuração específica do PHP que queira substituir no arquivo local.ini.

      Salve o arquivo e saia do seu editor.

      Com o seu arquivo PHP local.ini no lugar, você pode seguir em frente para configurar o Nginx.

      Passo 6 — Configurando o Nginx

      Com o serviço PHP configurado, você pode modificar o serviço Nginx para usar o PHP-FPM como o servidor FastCGI a atender um conteúdo dinâmico. O servidor FastCGI baseia-se em um protocolo binário para relacionar programas interativos com um servidor Web. Para maiores informações, consulte este artigo Entendendo e implementando o proxy FastCGI no Nginx.

      Para configurar o Nginx, será criado um arquivo app.conf com a configuração do serviço na pasta ~/laravel-app/nginx/conf.d/.

      Primeiramente, crie o diretório nginx/conf.d/:

      • mkdir -p ~/laravel-app/nginx/conf.d

      Em seguida, crie o arquivo de configuração app.conf:

      • nano ~/laravel-app/nginx/conf.d/app.conf

      Adicione o código a seguir ao arquivo para especificar sua configuração do Nginx:

      ~/laravel-app/nginx/conf.d/app.conf

      server {
          listen 80;
          index index.php index.html;
          error_log  /var/log/nginx/error.log;
          access_log /var/log/nginx/access.log;
          root /var/www/public;
          location ~ .php$ {
              try_files $uri =404;
              fastcgi_split_path_info ^(.+.php)(/.+)$;
              fastcgi_pass app:9000;
              fastcgi_index index.php;
              include fastcgi_params;
              fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
              fastcgi_param PATH_INFO $fastcgi_path_info;
          }
          location / {
              try_files $uri $uri/ /index.php?$query_string;
              gzip_static on;
          }
      }
      

      O bloco de servidor define a configuração do servidor Web Nginx com as diretrizes a seguir:

      • listen: esta diretriz define a porta na qual o servidor irá escutar os pedidos de entrada.
      • error_log e access_log: estas diretrizes definem os arquivos para a criação de registros.
      • root: esta diretriz define o caminho da pasta raiz, formando o caminho completo para qualquer arquivo solicitado no sistema de arquivo local.

      No bloco de localização php, a diretriz fastcgi_pass especifica que o serviço app está escutando em um socket TCP na porta 9000. Isso faz com que o servidor PHP-FPM escute pela rede em vez de escutar por um socket Unix. Embora um socket Unix tenha uma ligeira vantagem de velocidade em relação a um socket TCP, ele não tem um protocolo de rede e, desta maneira, ignora a pilha de rede. Para casos onde os hosts estão localizados em uma máquina, um socket Unix pode fazer sentido, mas nos casos em que se tenha serviços sendo executados em hosts diferentes, um socket TCP oferece a vantagem de permitir que você se conecte a serviços distribuídos. Pelo fato do nosso contêiner app estar sendo executado em um host diferente do nosso contêiner webserver, um socket TCP faz mais sentido para nossa configuração.

      Salve o arquivo e saia do seu editor quando terminar de fazer alterações.

      Graças ao bind mount criado no Passo 2, quaisquer alterações que você faça dentro da pasta nginx/conf.d/ serão refletidas diretamente dentro do contêiner webserver.

      Em seguida, vamos olhar nossas configurações do MySQL.

      Passo 7 — Configurando o MySQL

      Com o PHP e o Nginx configurados, você pode habilitar o MySQL para agir como o banco de dados para seu aplicativo.

      Para configurar o MySQL, será criado o arquivo my.cnf na pasta mysql. Este é o arquivo que você vinculou ao /etc/mysql/my.cnf dentro do contêiner no Passo 2. Este bind mount permite que você substitua as configurações my.cnf sempre que necessário.

      Para demonstrar como isso funciona, adicionaremos as configurações ao arquivo my.cnf que habilitam o registro de consulta geral e especificam o arquivo de registro.

      Primeiramente, crie o diretório mysql:

      • mkdir ~/laravel-app/mysql

      Em seguida, crie o arquivo my.cnf:

      • nano ~/laravel-app/mysql/my.cnf

      No arquivo, adicione o código a seguir para habilitar o registro de consulta e definir a localização do arquivo de registro:

      ~/laravel-app/mysql/my.cnf

      [mysqld]
      general_log = 1
      general_log_file = /var/lib/mysql/general.log
      

      Este arquivo my.cnf habilita os registros, definindo a configuração general_log em 1 para permitir registros gerais. A configuração general_log_file especifica onde os registros serão armazenados.

      Salve o arquivo e saia do seu editor.

      Nosso próximo passo será iniciar os contêineres.

      Passo 8 — Executando os contêineres e modificando as configurações de ambiente

      Agora que definiu todos os seus serviços no seu arquivo docker-compose e criou os arquivos de configuração para esses serviços, você pode iniciar os contêineres. Como passo final, porém, vamos fazer uma cópia do arquivo .env.example que o Laravel inclui por padrão e nomear a copia .env, que é o arquivo que o Laravel espera para definir seu ambiente:

      Vamos configurar os detalhes específicos da nossa configuração neste arquivo assim que tivermos iniciado os contêineres.

      Com todos os seus serviços definidos no seu arquivo docker-compose, você precisa emitir um único comando para iniciar todos os contêineres, criar os volumes e configurar e conectar as redes:

      Quando você executar o docker-compose up pela primeira vez, ele irá baixar todas as imagens Docker necessárias, o que pode levar um tempo. Assim que as imagens forem baixadas e armazenadas na sua máquina local, o Compose criará seus contêineres. A flag -d faz o daemon do processo, executando seus contêineres em segundo plano.

      Assim que o processo for concluído, utilize o comando a seguir para listar todos os contêineres em execução:

      Você verá o seguinte resultado com detalhes sobre seus contêineres do app, webserver e db:

      Output

      CONTAINER ID NAMES IMAGE STATUS PORTS c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp 5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp

      O CONTAINER ID neste resultado é um identificador único para cada contêiner, enquanto o NAMES lista o nome do serviço associado a cada um. Você pode usar ambos esses identificadores para acessar os contêineres. IMAGE define o nome da imagem para cada contêiner, enquanto o STATUS fornece informações sobre o estado do contêiner: se ele está em execução, reiniciando ou parado.

      Você pode agora modificar o arquivo .env no contêiner app para incluir detalhes específicos sobre sua configuração.

      Abra o arquivo usando o docker-compose exec, que permite que você execute comandos específicos em contêineres. Neste caso, você está abrindo o arquivo para edição:

      • docker-compose exec app nano .env

      Encontre o bloco que especifica o DB_CONNECTION e atualize-o para refletir as especificidades da sua configuração. Você modificará os seguintes campos:

      • O DB_HOST será seu contêiner de banco de dados db.
      • O DB_DATABASE será o banco de dados laravel.
      • O DB_USERNAME será o nome de usuário que você usará para o seu banco de dados. Neste caso, vamos usar laraveluser.
      • O DB_PASSWORD será a senha segura que você gostaria de usar para esta conta de usuário.

      /var/www/.env

      DB_CONNECTION=mysql
      DB_HOST=db
      DB_PORT=3306
      DB_DATABASE=laravel
      DB_USERNAME=laraveluser
      DB_PASSWORD=your_laravel_db_password
      

      Salve suas alterações e saia do seu editor.

      Em seguida, defina a chave do aplicativo para o aplicativo Laravel com o comando php artisan key:generate. Este comando irá gerar uma chave e copiá-la para seu arquivo .env, garantindo que as sessões do seu usuário e dados criptografados permaneçam seguros:

      • docker-compose exec app php artisan key:generate

      Você tem agora as configurações de ambiente necessárias para executar seu aplicativo. Para colocar essas configurações em um arquivo de cache, que irá aumentar a velocidade de carregamento do seu aplicativo, execute:

      • docker-compose exec app php artisan config:cache

      Suas definições da configuração serão carregadas em /var/www/bootstrap/cache/config.php no contêiner.

      Como passo final, visite http://your_server_ip no navegador. Você verá a seguinte página inicial para seu aplicativo Laravel:

      Laravel Home Page

      Com os seus contêineres em funcionamento e as suas informações de configuração no lugar, você pode seguir em frente para configurar as informações do seu usuário para o banco de dados laravel no contêiner db.

      Passo 9 — Criando um usuário para o MySQL

      A instalação padrão do MySQL cria apenas a conta administrativa root, que tem privilégios ilimitados no servidor do banco de dados. Geralmente, é melhor evitar usar contas administrativas root ao interagir com o banco de dados. Ao invés disso, vamos criar um usuário de banco de dados dedicado para o banco de dados do nosso aplicativo Laravel.

      Para criar um novo usuário, execute uma bash shell interativa no contêiner db com o docker-compose exec:

      • docker-compose exec db bash

      Dentro do contêiner, logue na conta administrativa root do MySQL:

      Você será solicitado a inserir a senha que você definiu para a conta root do MySQL durante a instalação no seu arquivo docker-compose.

      Inicie procurando pelo banco de dados chamado laravel, que você definiu no seu arquivo docker-compose. Execute o comando show databases para procurar por bancos de dados existentes:

      Você verá o banco de dados laravel listado no resultado:

      Output

      +--------------------+ | Database | +--------------------+ | information_schema | | laravel | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)

      Em seguida, crie a conta de usuário que terá permissão para acessar esse banco de dados. Nosso nome de usuário será laraveluser, embora você possa substituí-lo por outro nome se preferir. Certifique-se apenas de que seu nome de usuário e senha aqui utilizados correspondam aos detalhes que você definiu no seu arquivo .env no passo anterior:

      • GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';

      Reinicie os privilégios para notificar o servidor MySQL das alterações:

      Saia do MySQL:

      Por fim, saia do contêiner:

      Você configurou a conta de usuário para seu banco de dados do aplicativo Laravel e está pronto para migrar seus dados e trabalhar com o console Tinker.

      Com seu aplicativo em execução, você pode migrar seus dados e testar o comando tinker, que iniciará um console PsySH com o Laravel pré-carregado. O PsySH é um console de desenvolvimento runtime e um corretor de bugs interativo para o PHP e o Tinker é um REPL específico para o Laravel. Usar o comando tinker permitirá que você interaja com seu aplicativo Laravel a partir da linha de comando em uma shell interativa.

      Primeiramente, teste a conexão com o MySQL executando o comando Laravel artisan migrate, que cria uma tabela migrations no banco de dados de dentro do contêiner:

      • docker-compose exec app php artisan migrate

      Este comando irá migrar as tabelas padrão do Laravel. O resultado que confirma a migração será como este:

      Output

      Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table

      Assim que a migração for concluída, você pode fazer uma consulta para verificar se está devidamente conectado ao banco de dados usando o comando tinker:

      • docker-compose exec app php artisan tinker

      Teste a conexão do MySQL obtendo os dados que acabou de migrar:

      • DB::table('migrations')->get();

      Você verá um resultado que se parece com este:

      Output

      => IlluminateSupportCollection {#2856 all: [ {#2862 +"id": 1, +"migration": "2014_10_12_000000_create_users_table", +"batch": 1, }, {#2865 +"id": 2, +"migration": "2014_10_12_100000_create_password_resets_table", +"batch": 1, }, ], }

      Você pode usar o tinker para interagir com seus bancos de dados e testar serviços e modelos.

      Com seu aplicativo Laravel funcionando, você está pronto para mais desenvolvimento e experimentação.

      Conclusão

      Você tem agora um aplicativo de pilha LEMP em execução no seu servidor, que você testou ao acessar a página inicial do Laravel e ao criar migrações de banco de dados MySQL.

      A chave para a simplicidade desta instalação é o Docker Compose, que permite que você crie um grupo de contêineres Docker, definidos em um único arquivo, com um único comando. Se você quiser aprender mais sobre como fazer integração contínua com o Docker Compose, veja Como configurar um ambiente de teste de integração contínua com o Docker e o Docker Compose no Ubuntu 16.04. Se você quiser simplificar seu processo de implantação do aplicativo Laravel, então o Como implantar aplicativos Laravel automaticamente com o Deployer no Ubuntu 16.04 será uma leitura relevante.



      Source link