Contents
Visão geral sobre OpenVPN
OpenVPN é uma solução SSL/TLS para VPN. É capaz de atravessar conexões NAT e firewalls. Esta página explica brevemente como configurar uma VPN com OpenVPN, tanto do lado do servidor quanto do lado do cliente, para diferentes configurações: de uma simples conexão bruta para fins de teste até uma conexão habilitada para TLS.
Instalação
Instale o pacote openvpn tanto para o cliente quanto para o servidor.
# apt-get install openvpn
Para habilitar o OpenVPN no miniaplicativo NetworkManager do GNOME na área de notificação da barra de tarefas, o pacote adicional network-manager-openvpn-gnome deve ser instalado no cliente:
# apt-get install network-manager-openvpn-gnome
Pré-requisitos
No firewall do servidor, abra a porta UDP 1194 (porta padrão).
Tenha em mente que 90% de todos os problemas de conexão encontrados por novos(as) usuários(as) do OpenVPN são relacionados ao firewall.
Configuração
O OpenVPN pode autenticar usuários(as) por meio de usuário(a)/senha, chave pré-compartilhada, certificados, etc.
NetworkManager / Menu de sistema do GNOME
É possível configurar totalmente as conexões OpenVPN usando a configuração padrão do Debian GNOME, juntamente com network-manager-openvpn-gnome. A conexão VPN será gerenciada como qualquer outra conexão de rede no NetworkManager e também terá um controle no Menu do Sistema GNOME ao lado dos controles WiFi e Ethernet. Para fazer com que uma determinada conexão de rede habilite automaticamente uma configuração OpenVPN no GNOME 42 (usado em bookworm), use nm-connection-editor. Encontre uma conexão de rede, abra suas configurações e, em seguida, em Geral, ative Conectar-se automaticamente à VPN. Após salvar, a linha secondaries= é adicionada ao arquivo de configuração dessa rede na seção "[connection]". Ele conterá uma lista de UUIDs de conexão secundária a serem ativadas. O arquivo de configuração é geralmente /etc/NetworkManager/system-connections/.
Conexão VPN não processada (insegura) para testes
Parte do servidor
A partir de um shell de um servidor, execute
# openvpn --remote CLIENT_IP --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
se seu cliente tem um IP estático; se não, execute
# openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2
Você deve ver uma saída de tela muito parecida com
2021-09-03 21:22:18 library versions: OpenSSL 1.1.1k 25 Mar 2021, LZO 2.10 2021-09-03 21:22:18 ******* WARNING *******: All encryption and authentication features disabled -- All data will be tunnelled as clear text and will not be protected against man-in-the-middle changes. PLEASE DO RECONSIDER THIS CONFIGURATION! 2021-09-03 21:22:18 TUN/TAP device tun1 opened ...
Enquanto o openvpn estiver executando, verifique sua configuração de rede com ip a. A saída deve incluir
9: tun1: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500 link/none inet 10.9.8.1 peer 10.9.8.2/32 scope global tun1 valid_lft forever preferred_lft forever inet6 fe80::dc71:3707:693c:5017/64 scope link stable-privacy valid_lft forever preferred_lft forever
Note que, se você terminar (kill) openvpn (por exemplo, com Control-c no console), não verá a interface de rede acima.
Parte do cliente
# openvpn --remote SERVER_IP --dev tun1 --ifconfig 10.9.8.2 10.9.8.1 ... 2021-09-03 21:32:32 Peer Connection Initiated with [AF_INET]SERVER_IP:PORT 2021-09-03 21:32:32 2012 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this 2021-09-03 21:32:32 Initialization Sequence Completed ...
Você também pode fazer um ping no servidor para testá-lo e tentar alcançá-lo: ping 10.9.8.1.
Conexão VPN de chave estática
Configuração de servidor VPN de chave estática
No diretório /etc/openvpn do servidor, execute o seguinte comando para gerar uma chave estática:
# openvpn --genkey secret static.key
Nota: para o OpenVPN 2.4 no Debian 10, use --secret em vez de secret.
Copie esta chave estática para o diretório /etc/openvpn dos clientes usando um canal seguro como scp ou sftp.
No servidor, crie um arquivo /etc/openvpn/tun0.conf e adicione o seguinte:
dev tun0 ifconfig 10.9.8.1 10.9.8.2 secret /etc/openvpn/static.key
Onde 10.9.8.x é sua subrede VPN, 10.9.8.1será o IP do servidor, 10.9.8.2 será o IP do cliente.
Configuração de cliente VPN de chave estática
No cliente, copie /etc/openvpn/static.key de um servidor e crie o arquivo /etc/openvpn/tun0.conf, e adicione o seguinte:
remote your-server.org dev tun0 ifconfig 10.9.8.2 10.9.8.1 secret /etc/openvpn/static.key
Inicie o OpenVPN manualmente em ambos os lados com o seguinte comando (saída mais detalhada - verb 6):
# openvpn --config /etc/openvpn/tun0.conf --verb 6
Para verificar se a conexão VPN está em execução, você deve ser capaz de fazer um ping em 10.9.8.2 do servidor e em 10.9.8.1 do cliente.
Conexão VPN com TLS habilitado
Começando com Jessie, easy-rsa é um pacote separado que deve ser levado junto com a instalação do openvpn.
Init easy-rsa
# cd /etc/openvpn # make-cadir easy-rsa/
Para inicializar o ambiente, basta usar o seguinte comando:
cd easy-rsa/ ./easyrsa init-pki
Todos os comandos são executados a partir do diretório do easy-r. Consulte a ./easyrsa help para obter uma descrição detalhada dos comandos disponíveis.
Lembre-se:
- apenas arquivos .key devem ser mantidos em sigilo.
- os arquivos .crt e .csr podem ser enviados por canais inseguros, como e-mail em texto simples.
- não é necessário copiar um arquivo .key entre computadores.
- cada computador terá seu próprio certificado/par de chaves.
Gerar um CERTIFICADO/CHAVE de uma autoridade certificadora
Para gerar um CERTIFICADO/CHAVE da Autoridade Certificadora (CERTIFICATE AUTHORITY - CA):
# ./easyrsa build-ca
Serão gerados o ca.crt e o ca.key no diretório /etc/openvpn/easy-rsa/{pki,pki/private}.
Gera um CERTIFICADO/CHAVE do servidor:
# ./easyrsa build-server-full server
Serão gerados o server.crt e server.key em /etc/openvpn/easy-rsa/pki/{issued/server.crt,private/server.key}, e assinados com seu certificado raiz.
Gerar PARÂMETROS DIFFIE-HELLMAN
Gera BUILD DIFFIE-HELLMAN PARAMETERS (necessário para o lado do servidor de uma conexão SSL/TLS):
./easyrsa gen-dh
Gerar uma chave estática para autenticação TLS
Se você já gerou uma chave estática, você pode renomeá-la para ta.key e movê-la para a pasta /etc/openvpn/server. Caso contrário, execute o seguinte:
openvpn --genkey secret /etc/openvpn/server/ta.key
Nota: para o OpenVPN 2.4 no Debian 10, use --secret em vez de secret.
Gerar CERTIFICADO/CHAVE para clientes
Gere uma chave para cada cliente: use um dos dois comandos a seguir.
- Gera uma chave sem senha:
./easyrsa build-client-full clientname nopass
Gera uma chave com senha: você será solicitado(a) a "Enter PEM phrase" (esta é a frase-senha que você precisa para fazer login no cliente toda vez que se conectar ao servidor), para cada client:
./easyrsa build-client-full clientname
Serão geradas as chaves em /etc/openvpn/easy-rsa/pki/{issued/clientname.crt,private/clientname.key}.
Instalar CERTIFICADO/CHAVE do cliente
Copie ca.crt, clientname.crt, clientname.key do servidor para os diretórios /etc/openvpn/easy-rsa/pki/{issued/clientname.crt,private/clientname.key} do cliente .
Consulte OpenVPN RSA Key para detalhes.
Conexão VPN a partir da linha de comando
Servidor:
openvpn --dev tun1 --ifconfig 10.9.8.1 10.9.8.2 --tls-server --dh /etc/openvpn/easy-rsa/pki/dh.pem --ca /etc/openvpn/easy-rsa/pki/ca.crt --cert /etc/openvpn/easy-rsa/pki/issued/server.crt --key /etc/openvpn/easy-rsa/pki/private/server.key --reneg-sec 60 --verb 5 --cipher AES-256-CBC --auth SHA512 --tls-version-min 1.3 --auth-nocache
Cliente:
openvpn --remote SERVER_IP --dev tun1 --redirect-gateway def1 --ifconfig 10.9.8.2 10.9.8.1 --tls-client --ca /etc/openvpn/easy-rsa/pki/ca.crt --cert /etc/openvpn/easy-rsa/pki/issued/clientname.crt --key /etc/openvpn/easy-rsa/pki/private/clientname.key --reneg-sec 60 --verb 5 --cipher AES-256-CBC --auth SHA512 --tls-version-min 1.3 --auth-nocache
Arquivo de configuração do servidor VPN
Se a conexão anterior for bem-sucedida, crie o arquivo de configuração do servidor /etc/openvpn/server.conf da seguinte forma:
port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key # keep secret dh /etc/openvpn/easy-rsa/pki/dh.pem topology subnet server 10.9.8.0 255.255.255.0 # internal tun0 connection IP ifconfig-pool-persist ipp.txt push "route 192.168.0.0 255.255.255.0" push "redirect-gateway def1 bypass-dhcp" keepalive 10 120 tls-auth /etc/openvpn/server/ta.key 0 auth-nocache cipher AES-256-CBC data-ciphers AES-256-CBC persist-key persist-tun status /var/log/openvpn/openvpn-status.log verb 3 # verbose mode client-to-client explicit-exit-notify 1
Crie um arquivo de status:
# touch /var/log/openvpn/openvpn-status.log
Reinicie o OpenVPN:
# service openvpn restart
Observe que o script /etc/init.d/openvpn iniciado por 'service openvpn restart' iniciará um servidor openvpn para cada arquivo .conf em /etc/openvpn/; portanto, se você ainda tiver o arquivo tun0.conf como acima, renomeie-o para outra coisa que não seja *.conf. Isso ocorre porque o systemd quer apenas um servidor openvpn por padrão.
Arquivo de configuração do cliente VPN
No cliente, crie /etc/openvpn/client.conf como a seguir:
(nota: você pode usar a interface gráfica da ferramenta vpn do network-manager, fornecendo a chave e os certificados).
client dev tun proto udp remote VPNSERVER_IP 1194 # [VPN server IP] [PORT] resolv-retry infinite nobind persist-key persist-tun ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/clientname.crt key /etc/openvpn/easy-rsa/pki/private/clientname.key remote-cert-tls server tls-auth /etc/openvpn/server/ta.key 1 auth-nocache cipher AES-256-CBC data-ciphers AES-256-CBC mute-replay-warnings verb 3
Reinicie o OpenVPN:
# service openvpn restart
Conexão VPN iniciada como um serviço Systemd
Na raiz de /etc/openvpn/
Por padrão, todas as VPNs configuradas em /etc/openvpn/ são iniciadas durante a inicialização do sistema. Edite /etc/default/openvpn para iniciar VPNs específicas ou para desativar esse comportamento. Você precisa executar systemctl daemon-reload uma vez para habilitar novas VPNs
Nas subpastas do servidor e do cliente
No Debian, o serviço systemd espera que os arquivos de configuração do servidor e do cliente estejam, respectivamente, em /etc/openvpn/server e /etc/openvpn/client. Depois de criar o arquivo de configuração na pasta correta, você precisa ativá-lo. Por exemplo, suponha que você criou a configuração em /etc/openvpn/server/myserver.conf:
systemctl start openvpn-server@myserver systemctl enable openvpn-server@myserver
Conexão VPN iniciada via arquivo interfaces
Os hooks do openvpn ifupdown também estão disponíveis para iniciar/terminar túnels usando /etc/network/interfaces, por exemplo:
auto dsl iface dsl inet ppp provider dsl-provider openvpn work_vpn
Veja /usr/share/doc/openvpn/README.Debian.gz para mais informações.
Geração de certificados em dispositivos Android/iOS
O servidor Debian OpenVPN pode ser configurado para ser usado com dispositivos Android/iOS.
No servidor
No servidor Debian, crie os certificados necessários - consideramos que você instalou via apt openvpn, e criou a pasta easy-rsa como descrito acima:
# cd /etc/openvpn/easy-rsa # ./easyrsa init-pki # ./easyrsa build-ca nopass # ./easyrsa build-server-full server nopass # ./easyrsa build-client-full YOUR_CLIENT_NAME nopass # ./easyrsa gen-dh # cd .. # should now be in /etc/openvpn # cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf ./server.conf # # Below filenames are all based on things in server.conf. If things don't work, read that file and make sure the filenames match up. # openvpn --genkey secret /etc/openvpn/server/ta.key
Modifique as linhas abaixo em /etc/openvpn/server.conf:
... proto tcp push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" user nobody group nogroup ...
8.8.8.8 é um servidor DNS da Google. Você pode trocá-lo por um servidor DNS de sua preferência.
Teste para ver se configuração funcionou:
# openvpn --config server.conf
Se funcionou, o Ctrl-C termina o processo, reinicie o servidor OpenVPN para usar a nova configuração:
# service openvpn restart
Crie o arquivo de perfil de cliente /etc/openvpn/client.ovpn e anexe os certificados a ele:
YOUR_CLIENT_NAME=clientname &&\ cd /etc/openvpn &&\ cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf $YOUR_CLIENT_NAME.ovpn && \ echo "key-direction 1" >> $YOUR_CLIENT_NAME.ovpn && \ echo "<ca>" >> $YOUR_CLIENT_NAME.ovpn && \ sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' < easy-rsa/pki/ca.crt >> $YOUR_CLIENT_NAME.ovpn && \ echo "</ca>" >> $YOUR_CLIENT_NAME.ovpn && \ echo "<cert>" >> $YOUR_CLIENT_NAME.ovpn && \ sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' < easy-rsa/pki/issued/$YOUR_CLIENT_NAME.crt >> $YOUR_CLIENT_NAME.ovpn && \ echo "</cert>" >> $YOUR_CLIENT_NAME.ovpn && \ echo "<key>" >> $YOUR_CLIENT_NAME.ovpn && \ sed -n '/BEGIN PRIVATE KEY/,/END PRIVATE KEY/p' < easy-rsa/pki/private/$YOUR_CLIENT_NAME.key >> $YOUR_CLIENT_NAME.ovpn && \ echo "</key>" >> $YOUR_CLIENT_NAME.ovpn && \ echo "<tls-auth>" >> $YOUR_CLIENT_NAME.ovpn && \ sed -n '/BEGIN OpenVPN Static key V1/,/END OpenVPN Static key V1/p' < server/ta.key >> $YOUR_CLIENT_NAME.ovpn && \ echo "</tls-auth>" >> $YOUR_CLIENT_NAME.ovpn
Modifique as linhas abaixo no arquivo de perfil do cliente /etc/openvpn/client.ovpn:
... proto tcp remote YourServerIp YourServerPort mute-replay-warnings # ca ca.crt # cert client.crt # key client.key key-direction 1 ...
onde ?YourServerIp e ?YourServerPort devem ser alterados de acordo com seu servidor. Três linhas (#ca, #cert, #key) são comentadas já que os certificados necessários foram integrados no arquivo ovpn em vez de serem arquivos individuais.
Envie um e-mail ou carregue o arquivo de configuração do cliente /etc/openvpn/$YOUR_CLIENT_NAME.ovpn para o google drive a fim de baixá-lo para o iPhone.
Você também pode executar as seções do servidor das etapas de "Encaminhamento de tráfego via VPN" abaixo.
No cliente
Para dispositivos iOS, instale o cliente OpenVPN Connect. Em seguida, transfira o arquivo de configuração do cliente /etc/openvpn/$YOUR_CLIENT_NAME.ovpn para o dispositivo por e-mail ou pelo Google Drive. Abra o arquivo de configuração em aplicativos de e-mail ou aplicativos do Google Drive.
Para dispositivos Android, instale o cliente OpenVPN Connect. Em seguida, copie o arquivo de configuração do cliente /etc/openvpn/$YOUR_CLIENT_NAME.ovpn para o armazenamento do dispositivo. Abra o arquivo de configuração em aplicativos OpenVPN.
Seu cliente OpenVPN do telefone deve cuidar dos processos do cliente automaticamente.
Encaminhar tráfego para fornecer acesso à Internet
No servidor
No servidor, habilite o encaminhamento IP de tempo de execução (runtime IP forwarding):
echo 1 > /proc/sys/net/ipv4/ip_forward
Edite /etc/sysctl.conf e remova o comentário da seguinte linha para torná-lo permanente:
net.ipv4.ip_forward = 1
Execute o seguinte comando no servidor para testar (modo antigo):
IF_MAIN=eth0 IF_TUNNEL=tun0 YOUR_OPENVPN_SUBNET=10.9.8.0/24 #YOUR_OPENVPN_SUBNET=10.8.0.0/16 # if using server.conf from sample-server-config iptables -A FORWARD -i $IF_MAIN -o $IF_TUNNEL -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s $YOUR_OPENVPN_SUBNET -o $IF_MAIN -j ACCEPT iptables -t nat -A POSTROUTING -s $YOUR_OPENVPN_SUBNET -o $IF_MAIN -j MASQUERADE
Execute o seguinte comando no servidor para testar (iniciando no Bullseye):
IF_MAIN=eth0 IF_TUNNEL=tun0 YOUR_OPENVPN_SUBNET=10.9.8.0/24 #YOUR_OPENVPN_SUBNET=10.8.0.0/16 # if using server.conf from sample-server-config nft add table ip filter nft add table ip nat nft add chain ip filter FORWARD nft add chain nat POSTROUTING '{ type nat hook postrouting priority srcnat; policy accept; }' nft add rule ip filter FORWARD iifname "$IF_MAIN" oifname "$IF_TUNNEL" ct state related,established accept nft add rule ip filter FORWARD oifname "$IF_MAIN" ip saddr $YOUR_OPENVPN_SUBNET accept nft add rule ip nat POSTROUTING oifname "$IF_MAIN" ip saddr $YOUR_OPENVPN_SUBNET masquerade
Você também pode usar o script rc.firewall-iptables de TLDP Masquerade como alternativa.
Se tudo estiver funcionando bem, salve as regras: veja as páginas do wiki Debian iptables e nftables para obter detalhes.
Gerencie a infraestrutura de chave pública
?easy-rsa auxilia na gestão de chaves de seu PKI:
Geração de certificados de cliente & servidor
- Revogação de certificados
Mais informações aqui: /usr/share/doc/easy-rsa/doc
Para fins de segurança, é aconselhável configurar o PKI em um servidor diferente do servidor openvpn.
Aplicação para uma VPN passando por um proxy http
Pré-requisitos: instale um proxy HTTP.
Esta parte descreve como configurar uma VPN para passar por um proxy http, que permite apenas o tráfego na porta 443 (e 80). Para isso, usa-se a opção http-proxy do OpenVPN.
- Primeiro de tudo, verifique se a porta 443 ainda não é usada por outro serviço no seu servidor.
Configure o OpenVPN no lado do servidor adicionando a porta 443 e proto tcp-server ao arquivo de configuração. Esta opção funciona apenas com TCP como protocolo de transporte do túnel.
Configure o OpenVPN no lado do cliente adicionando a porta 443, proto tcp-client e http-proxy 1.1.1.180 ao arquivo de configuração.
Onde 1.1.1.1 e 8080 são o IP e a porta do seu proxy.
- Agora você deve iniciar o OpenVPN no servidor e em seguida no cliente.
Habilite e use a interface management
Habilite a opção no arquivo de configuração do servidor, adicinando:
management localhost 7505
Conecte-se à interface:
telnet localhost 7505
Isso é útil para autenticação (http-proxy) ou para matar uma sessão aberta. Mais informações.
This is useful for authentication (http-proxy) or killing an open session. More info
Resolução de problemas
- Verifique os arquivos de log que estão por padrão em /var/log/openvpn/openvpn/
- A maioria dos problemas de VPN estão relacionados à configuração do firewall
- Verifique se o problema pode estar relacionado à tabela de roteamento de rede no lado do servidor (ou cliente)
- Outro ponto de atenção: gerenciamento de DNS (resolv.conf, resovlconf) tanto no lado do servidor quanto do cliente
Veja também
- openvpn manpage (melhor documentação atualizada)