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:

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.

./easyrsa build-client-full clientname nopass

./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:

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.

  1. Primeiro de tudo, verifique se a porta 443 ainda não é usada por outro serviço no seu servidor.
  2. 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.

  3. 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.

  1. 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


Veja também


CategoryNetwork