Windows平台使用OpenVPN相关问题汇总

生成证书

使用命令提示符进入到安装目录下的easy-rsa

执行以下命令生成证书

init-config   #加载配置
vars   #设置变量
clean-all   #删除旧文件
build-ca   #生成CA证书
build-key-server server   #生成服务端证书
build-key client1   #生成客户端证书1
build-key client2   #生成客户端证书2
……
build-dh   #生成Diffie Hellman

注意事项

生成client证书需要ca.crt、ca.key、index.txt、serial这几个文件

如需重新生成客户端证书,先清空index.txt的内容**

Windows系统生成客户端证书时Common Name需手动填写,建议与证书文件名相同

修改服务端和客户端配置文件时,证书文件路径时需要使用双斜杠\\

服务端设置NAT转发

未设置NAT转发客户端连接服务端后,只能访问服务端和其他客户端,无法通过服务器物理网卡作为出口访问其他网络资源

Windows Server

打开路由和远程访问,没有添加此功能的去服务器管理器中添加
选择服务器,右键配置并启用“路由和远程访问”,选择“自定义配置”,下一步勾选“NAT”,完成后启动服务
然后展开服务器-IPv4,选择“NAT”,右键“新增接口”,选择“服务器的物理网卡”,在“NAT”选项卡中选择“公用接口连接到Internet”,勾选在“此接口上启用NAT”

Windows Desktop

Windows服务Routing and Remote Access
启用并设置为自动启动

在物理网卡“本地连接”属性-共享中勾选“允许其他网络用户通过此计算机的Internet连接来连接”,并共享给OpenVPN虚拟网卡

修改注册表

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

值:IPEnableRouter
类型:REG_DWORD
数据:0x00000001 (1)

可能存在的问题
系统重启后NAT失效,需要重新共享物理网卡

解决方法
使用一个PowerShell脚本来重新设置物理网卡共享,共享完成后重启虚拟网卡

PowerShell代码

$NetShare = New-Object -ComObject HNetCfg.HNetShare
$wlan = $null
$ethernet = $null

foreach ($int in $NetShare.EnumEveryConnection) {
  $props = $NetShare.NetConnectionProps.Invoke($int)
  if ($props.Name -eq "以太网") {
    $wlan = $int;
  }
  if ($props.Name -eq "OpenVPN") {
    $ethernet = $int;
  }
}

$wlanConfig = $NetShare.INetSharingConfigurationForINetConnection.Invoke($wlan);
$ethernetConfig = $NetShare.INetSharingConfigurationForINetConnection.Invoke($ethernet);

$wlanConfig.DisableSharing();
$ethernetConfig.DisableSharing();

$wlanConfig.EnableSharing(0);
$ethernetConfig.EnableSharing(1);

Get-NetAdapter -Name 'OpenVPN' | Restart-NetAdapter

可以再写一个批处理来执行此脚本,并加入到计划任务里面,开机自动执行

批处理代码

@echo off
PowerShell.exe -ExecutionPolicy Unrestricted -File NetConnectionSharing.ps1
exit

服务端无GUI运行

将以下Windows服务

OpenVPN Service Interactive
OpenVPN Service Legacy

设置为自动启动

旧版本客户端设置自动连接

在openvpn-gui.exe快捷方式后面加上参数--connect client.ovpn