在Windows Server上搭建OpenVPN服务器
OpenVPN是一个TCP协议的网络层VPN实现。性能一般,但是使用广泛。
什么是OpenVPN
引用维基百科对OpenVPN的解释:
OpenVPN is a virtual private network (VPN) system that implements
techniques to create secure point-to-point or site-to-site connections
in routed or bridged configurations and remote access facilities.
在Windows上搭建OpenVPN服务器
下载+安装
OpenVPN的软件部分分为客户端和服务端两部分,而在OpenVPN官网的首页给的下载地址中,并没有适用于Windows的服务端程序。
它被藏在了这个页面里。直接下载Windows 64-bit MSI installer就可以了。(如果是32位系统,你需要下载32-bit的,但我相信你是64位的Windows)
安装的时候一路next就可以了,不过有一点需要注意,选择安装组件的时候,easyrsa3并没有默认选中,需要手动选上。
安装后,为了使得虚拟网络适配器的驱动被Windows加载,需要重新启动。
生成CA根证书、服务端及客户端的公私钥对
这一部分主要参考了参考阅读部分的文章1(OpenVPN server on Windows)。假设你使用的是默认安装目录,打开一个Shell,依次执行如下步骤:
1. 切换工作目录
cd "C:\Program Files\OpenVPN\easy-rsa"
2. 启动EasyRSA
EasyRSA-Start.bat
3. 初始化PKI(公钥基础设施)
./easyrsa init-pki
4. 编辑配置文件
notepad vars.bat
5. 在记事本中写入如下内容(记得修改)
set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=SanFrancisco
set KEY_ORG=OpenVPN
set [email protected]
set DH_KEY_SIZE=2048
6. 保存,生效
vars.bat
./easyrsa clean-all
7. 生成CA根证书(nopass
参数表示不使用密码保护私钥,下同)
./easyrsa build-ca nopass
8. 生成服务器端的私钥
./easyrsa build-server-full server nopass
9. 生成客户端的私钥(如果有多个客户端,需要生成多个)
./easyrsa build-client-full YourClientName nopass
10. 生成DH参数(DH是一个用来协商密钥的协议,如欲了解详情,可以阅读本人的相关密码学分析博客)
./easyrsa gen-dh
11. 生成TLS握手用到的静态密钥
默认情况下,OpenVPN在TLS握手时使用静态密钥,需要用如下命令生成:
openvpn --genkey tls-auth ta.key
需要注意的是,这个密钥需要通过安全的方式分发给服务器和客户,并且需要妥善保存*(密码学不保护密钥!)*。官方文档是这样说的:
This key should be copied over a pre-existing secure channel to the
server and all client machines.
创建配置文件
在OpenVPN目录下的sample-config
目录里,可以找到一些示例配置文件。注意,.ovpn
其实就是linux下OpenVPN的.conf
配置文件,其内容完全相同,只是扩展名不同而已。
将服务器的示例配置文件拷贝一份到config-auto
目录下并编辑,找到如下几行:
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
tls-auth ta.key 0
分别将他们改为你的实际文件目录,如:
ca "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\issued\\server.crt"
key "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\private\\server.key"
dh "C:\\Program Files\\OpenVPN\\easy-rsa\\pki\\dh.pem"
tls-auth "C:\\Program Files\\OpenVPN\\easy-rsa\\ta.key" 0
这个配置文件还有些地方需要修改一下:
修改
port
和proto
来设置端口和协议(tcp或udp),官方文档建议使用udp,因为udp更容易抵抗DoS攻击和端口扫描;如果容易被QOS掉建议使用TCP以保证稳定把
topology subnet
这一行的注释取消掉,不然会默认采用net30方案(为了兼容Windows下旧于2.0.9的客户端),会报warning(net30就要被废弃了)如果使用tcp模式,就把
explicit-exit-notify 1
这一行注释掉。TCP模式下OpenVPN不支持此功能
重启服务,应用配置文件
在运行中输入services.msc
,打开服务管理页面,找到OpenVPN的服务,点击“重新启动”来重启OpenVPN服务。
服务重启后,查看OpenVPN目录下log
文件夹内的server.log
文件,此时应该可以看到OpenVPN服务已经正常启动了。如果有错误,按照错误提示进行修正。
登录到刚刚配置好的OpenVPN服务器
同样地,OpenVPN的客户端使用.ovpn
配置文件进行配置,不过服务端和客户端的配置文件不通用。要创建客户端的配置文件,需要从sample-config
目录里拷贝client.ovpn
进行修改。首先要修改其中的地址、端口号和协议类型,还有加密模式。(准确地说是A.E.模式,认证加密)
将配置文件拷贝给客户端使用,同时也需要将CA的证书、TLS密钥、客户端证书及私钥拷贝给客户端,就是这些文件:
ca.crt
CA证书client.crt
客户端证书client.key
客户端私钥ta.key
用于TLS握手的静态密钥
参考阅读
OpenVPN server on Windows:一份比较详细的Windows下配置OpenVPN服务器的实操指南
Hardening OpenVPN Security:增强OpenVPN的安全性