OVPN-DCO-WIN significa "OpenVPN Data Channel Offic para Windows". É um driver Windows moderno, que funciona como adaptador de rede virtual e implementa a funcionalidade exigida para lidar com o canal de dados OpenVPN. Ao usar o OVPN-DCO-WIN, o software OpenVPN não envia o tráfego de dados entre o espaço do usuário e do kernel (para criptografia, descriptografia e roteamento), mas as operações em carga útil ocorrem no kernel do Windows. O driver está sendo desenvolvido usando estruturas modernas - WDF e NetAdapterCX. Por esse motivo, o código é mais fácil de ler e manter a comparação com os drivers NDIS Miniport existentes. Em termos de velocidade, o novo driver executa uma comparação significativamente melhor com o TAP-Windows6, para que elimine o gargalo que dificulta o desempenho do OpenVPN no Windows.
OVPN-DCO-WIN é um driver padrão que a partir do OpenVPN 2.6.
Você pode apenas instalar a versão mais recente do OpenVPN 2.6, que inclui driver assinado.
Como alternativa, você pode obter lançamentos do Github.
Você pode usar o DevCon Tool (disponível como parte do WDK) para instalar o driver:
devcon install ovpn-dco.inf ovpn-dco
O projeto inclui a ferramenta de linha de comando OVPN-DCO-CLI, que funciona como cama de teste de desenvolvimento, exemplo de cliente de referência e exemplo de uso da API. Com isso, você pode configurar o túnel VPN entre dois hosts do Windows ou entre o host Windows e o Linux usando a ferramenta ./ovpn-li do projeto OVPN-DCO Linux.
Para configurar o Windows <-> Windows Tunnel, na primeira execução do host:
ovpn-dco-cli.exe udp i4 0.0.0.0 1194 192.168.100.200 1194 10.8.0.2 255.255.255.0 10.8.0.1 data64.key 0
onde "0.0.0.0 1194" endereço/porta local para vincular o soquete ", 192.168.100.200 1194" Endereço/porta remoto "10.8.0.2" é um IP da VPN local.
No segundo host do Windows Run:
ovpn-dco-cli.exe udp i4 0.0.0.0 1194 192.168.100.100 1194 10.8.0.1 255.255.255.0 10.8.0.1 data64.key 1
Observe que o IP remoto, o VPN IP e a direção da chave (último 0/1 dígito) são diferentes.
Para configurar o túnel entre o Windows e o Linux, execute no segundo host (Linux):
# ip link add dev ovpn0 type ovpn-dco
# ip link set ovpn0 up
# ip link set mtu 1428 dev ovpn0
# ip addr add dev ovpn0 10.8.0.1/24
# tests/ovpn-cli ovpn0 new_peer 1194 0 192.168.100.100 1194 10.8.0.2
# tests/ovpn-cli ovpn0 new_key 0 aes 1 tests/data64.key
Onde 192.168.100.150 é um endereço IP do host Linux, 192.168.100.100 é um endereço IP do host do Windows.
Depois de estabelecer o túnel, você poderá ser capaz de fazer ping hosts (10.8.0.1 < -> 10.8.0.1) e executar testes IPERF (iperf3 -s 10.8.0.2 no primeiro host, iperf3 -c 10.8.0.2 no segundo ) via túnel VPN.
Observe que o uso da ferramenta OVPN-DCO-CLI em produção é uma idéia muito ruim, porque não faz nenhuma negociação-chave e usa uma chave estática (Data64.Key).
Para usar o driver, o cliente precisa obter o identificador de arquivo chamando o createfile. Pode -se usar interface de link ou dispositivo simbólico para obter o caminho do arquivo. Aqui está o exemplo da ferramenta OVPN-DCO (veja abaixo):
HANDLE h = CreateFileA("\\.\ovpn-dco", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, NULL);
Após o identificador, o cliente usa as chamadas DeviceiControl e Read/WriteFile para configurar a conexão e enviar/receber pacotes de controle. Veja uapi.h para obter a lista de comandos do IOCTL e ovpn-dco-cli.cpp sobre como usá-los.
Primeiro, o cliente precisa inicializar o ponto com o comando ovpn_ioctl_new_peer. O cliente passa a estrutura ovpn_new_peer, que contém endereço/porta IP local/remoto (IPv4 ou IPv6) e Protocolo de Transporte (TCP ou UDP).
Após a inicialização do ponto, o algoritmo da cifra passou o cliente (suportado são "nenhum" e "AES-GCM"), chaves criptográficas e peer-id como parte da estrutura ovpn_crypto_data usando o comando ovpn_ioctl_new_key. Descrição do OpenVPN Crypto está além do escopo deste documento.
Depois de configurar o Crypto, o cliente pode definir parâmetros mantidos (ovpn_set_peer struct) para a sessão via comando ovpn_ioctl_set_peer. O Intervalo Keepalive define com que frequência enviar pacotes especiais de keepalive na ausência de tráfego de dados de saída. O tempo limite do Keepalive define quando notificar o Userspace (preenchendo a solicitação de leitura com um erro) na ausência de tráfego de dados recebidos.
Para iniciar a sessão VPN, o cliente envia ovpn_ioctl_start_vpn comando. Esse driver sinaliza para iniciar o adaptador de rede.
Depois de iniciar a sessão da VPN, o cliente configura o adaptador de rede (endereço IP, máscara de rede, gateway) e roteamento.
Para enviar e receber pacotes de canais de controle, o cliente usa chamadas de leitura/writefile. Recomenda -se usar o IO sobreposto, passando File_Flag_overlapped para CreateFile Call e Sobreposição de Sobreposição para ler/WriteFile Chamadas. O OVPN-DCO-CLI usa a ASIO, que abstrai esses detalhes de baixo nível.
O driver OVPN-DCO-WIN é usado por padrão OpenVPN a partir da versão 2.6.
O OpenVPN3 também suporta OVPN-DCO-WIN na última filial principal.
O registro é realizado por meio da API de rastreamento, que é baseada no ETW. Para ver logs em uma máquina de destino:
traceview.exe
como administrador4970F9cf-2c0c-4f11-b1cc-e3a1e9958833
> OKPara coletar logs para análise:
wpr -start ovpn-dco-win.wprp
(o arquivo WPRP está na árvore de origem do driver)wpr -stop ovpn-dco-win.etl
O arquivo ETL pode ser aberto, por exemplo, pelo Windows Performance Analyzer ( wpa.exe
).
Para ver os registros em Debbuger (WindBG) anexado, use tracelog.exe
no prompt de comando do administrador:
tracelog -start MyTrace -guid #4970F9cf-2c0c-4f11-b1cc-e3a1e9958833 -rt -kd
Se você tiver problemas de inicialização, convém ativar a sessão Autologger. Execute o arquivo ovpn-dco-autologger.reg
, que criará as chaves de registro necessárias e, em seguida, reinicie.
Os logs do driver serão armazenados em %SystemRoot%System32LogFilesWMIovpn-dco.etl
.
As construções de liberação do OVPN-DCO-WIN são reproduzíveis, o que significa que, quando você usa o mesmo ambiente de construção, você deve obter exatamente o mesmo binário ovpn-dco.sys. Dessa forma, você pode verificar se um driver liberado em formato binário é realmente compilado a partir do código -fonte neste repositório. Isso é útil porque os requisitos de assinatura do driver da Microsoft dificultam a execução de drivers auto-compilados.
Os drivers lançados são construídos com o Windows 11 EWDK (kit de driver do Windows Enterprise). Apesar do nome, ele também funciona no Windows 10. Você pode baixá-lo aqui: https://docs.microsoft.com/en-us/windows-hardware/drivers/download-the-wdk
Se você obteve um arquivo ovpn-dco.sys, pode verificar o seguinte:
signtool remove /s ovpn-dco.sys
LaunchBuildEnv.cmd
.msbuild /p:platform=<arch> /p:configuration=release /p:signmode=off ovpn-dco-win.vcxproj /t:Build
where <arch>
é Win32
, x64
, ARM
ou ARM64
.<arch>/Release/ovpn-dco.sys
e o arquivo da etapa 1 têm o mesmo hash sha256.Entre em contato com Lev Stipakov [email protected] (Lev__ em #OpenVPN-devel)