Windows使用OpenVPN搭建虚拟专用网络
VPN的中文释义是专用虚拟网络隧道,利用VPN协议我们可以在不安全的网络中搭建出一条安全的网络隧道来传输我们的数据,VPN的协议有很多如PPTP L2TP SSTP IKEV2 OpenVPN等等,本文用于记录在Windows系统中利用OpenVPN搭建,OpenVPN相比较于其他协议有几个好处是可以指定端口指定使用TCP或UDP协议,采用ssl证书加密,保证了数据安全,最大的特点是比较容易穿透NAT设备,这一点微软的SSTP协议也有很好的支持,但是SSTP协议固定了只能使用443端口,而且在Android和IOS设备上并没有很好的一套现成解决方案,OpenVPN则是开源的,在各个平台已经有相对成熟的方案了。
首先安装OpenVPN,官网下载地址为:https://openvpn.net/index.php/open-source/downloads.html
但是由于说不清楚的问题,在国内经常打不开,截止本文发布时,在Windows中最新的版本是 OpenVPN 2.4.4
安装的时候注意要选中,EasyRSA 秘钥管理这一项,客户端在安装时可以不用选择这一项,服务端由于要生产证书所以需要这个
确认安装VPN驱动
安装完成后打开安装目录找到easy-rsa这个文件夹
用记事本打开 vars.bat.sample 这个文件,使用自己的信息更改以下几个内容
set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=SanFrancisco
set KEY_ORG=OpenVPN
set KEY_EMAIL=mail@host.domain
如下修改:
set KEY_COUNTRY=CN
set KEY_PROVINCE=JiangSu
set KEY_CITY=XuZhou
set KEY_ORG=xxxxGongSi
set KEY_EMAIL=xxx@qq.com
保存后关闭该文件
Shift+鼠标右键,在此处打开命令窗口,分别输入以下命令
init-config
vars
clean-all
上面是初始化工作,以后,在进行证书制作工作时,仍旧需要进行初始化,但只需要进入openvpn\easy-rsa目录,运行vars就可以了,不需要其他两个步骤了
生成根证书
build-ca
过程中只要在 Common Name (eg, your name or your server's hostname) [changeme]: 出现时输入 OpenVPN-CA 即可,其他直接回车就是默认值
生成服务端秘钥,这个过程比较慢,需要等待一会
build-dh
build-key-server server
当 Common Name (eg, your name or your server's hostname) [changeme]: 出现时输入 server
当 Sign the certificate? [y/n]: 出现时输入 y
当1 out of 1 certificate requests certified, commit? [y/n] 出现时输入 y
生成客户端密钥
build-key client
当 Common Name (eg, your name or your server's hostname) [changeme]: 出现时输入 client
当 Sign the certificate? [y/n]: 出现时输入 y
当 1 out of 1 certificate requests certified, commit? [y/n] 出现时输入 y
上面步骤中 client 为用户标识,如果要生成不同的用户证书只要修改 client 为其他即可。
到这里秘钥生成就结束了,生成的秘钥在 easy-rsa 这个文件夹的keys文件夹中
将生成的ca.crt,dh4096.pem,server.crt,server.key 复制到 OpenVPN\config 目录下,这四个文件是VPN服务端运行所需要的文件
在OpenVPN\config 目录下创建服务端配置文件 server.ovpn ,文件内容可以如下
local 10.105.107.53 #指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址。
port 1194 #指定监听的本机端口号
proto udp #指定采用的传输协议,可以选择tcp或udp
dev tap #指定创建的通信隧道类型,可选tun或tap
ca ca.crt #指定CA证书的文件路径
cert server.crt #指定服务器端的证书文件路径
key server.key #指定服务器端的私钥文件路径
dh dh4096.pem #指定迪菲赫尔曼参数的文件路径
server 192.0.2.0 255.255.255.0 #指定虚拟局域网占用的IP地址段和子网掩码,此处配置的服务器自身占用10.0.0.1。
ifconfig-pool-persist ipp.txt #服务器自动给客户端分配IP后,客户端下次连接时,仍然采用上次的IP地址(第一次分配的IP保存在ipp.txt中,下一次分配其中保存的IP)。
push "route 0.0.0.0 0.0.0.0" #表示client通过VPN SERVER上网
push "redirect-gateway def1 bypass-dhcp" #使客户端所有网络通信通过vpn
push "dhcp-option DNS 119.29.29.29" #DNS配置,根据实际情况配置
push "dhcp-option DNS 180.76.76.76" #DNS配置,根据实际情况配置
keepalive 10 120 #每10秒ping一次,连接超时时间设为120秒。
comp-lzo #开启VPN连接压缩,如果服务器端开启,客户端也必须开启
client-to-client #允许客户端与客户端相连接,默认情况下客户端只能与服务器相连接
persist-key
persist-tun #持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
status openvpn-status.log #指定记录OpenVPN状态的日志文件路径
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
服务端配置文件编辑完成之后,保存关闭文件,然后点击桌面或者开始菜单里面的 OpenVPNGUI ,电脑右下角应该会出现如下图标
右击图标点击 Connect 连接之后VPN服务端就算配置完成了。
客户端的配置相对就简单了只要复制
ca.crt,client.crt,client.key 到客户端的 OpenVPN\config 文件夹中,创建一个客户端配置文件 client.ovpn,内容如下
client #指定当前VPN是客户端
dev tap #必须与服务器端的保持一致
proto udp #必须与服务器端的保持一致
remote 10.105.107.53 1194 #指定连接的远程服务器的实际IP地址和端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
nobind #不绑定特定的本地端口号
persist-key
persist-tun
ca ca.crt #指定CA证书的文件路径
cert client.crt #指定当前客户端的证书文件路径
key client.key #指定当前客户端的私钥文件路径
ns-cert-type server #指定采用服务器校验方式
comp-lzo #与服务器保持一致
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
然后运行OpenVPN 连接即可。
OpenVPN连接方式是通过证书进行认证的,一个服务器对应多个证书,一个用户一个证书,通过下面的方法我可以注销指定的证书
在 OpenVPN\easy-rsa 中 Shift+鼠标右键 在此处打开命令窗口
vars 初始化
revoke-full 客户端证书名称 ,如下图
执行完成后会在 keys文件夹中生成 crl.pem 文件,这个文件中包含了我们废弃证书的信息
这样这个证书就被注销了,但是这个证书还是可以连接OpenVPN,还需要在OpenVPN的服务端配置文件中加入如下配置用于验证屏蔽废弃证书
crl-verify "../easy-rsa/keys/crl.pem"
这条命令要注意 crl.pem 的路径问题,根据你自己的实际情况做调整。