Open VPN借助Windows Server异地组网方案

853

Open VPN安装

linux下server搭建可以借助一键脚本,比较简单,这边主要说下windows server端的搭建。

这里用的是windows系统,版本是2.5.2 amd64

安装的时候需要选择功能完全安装,否则只能用客户端功能,用不了Server端的功能

EasyRSA3 产生凭证

copy vars

复制后修改里面的公司信息

cp vars.example vars

进入shell

cd "C:\Program Files\OpenVPN\easy-rsa"
.\EasyRSA-Start.bat

初始化产生凭证目录

./easyrsa init-pki

产生ca凭证

./easyrsa build-ca nopass

要注意的是这边会要你输入ca的名称,注意这名字不要跟后面重複到了

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

产生server端的凭证

./easyrsa gen-req <server name> nopass

范例: ./easyrsa gen-req MyServer nopass
产生server端的凭证,可以自由换成喜欢的名字,但注意都不能跟ca或其他client名字重複
另外加上nopass是为了可以使用自动连线,如果想提昇安全性可以拿掉,如此会要求设定凭证密码,在每次连线的时候都需要输入。可避免凭证档案外洩时仍能多个保护。

一样这边会问你凭证名称,如果[]内跟你打的一样,那直接按enter即可

Common Name (eg: your user, host, or server name) [MultipointServer]:

签署凭证

./easyrsa sign-req server <server name>
范例:./easyrsa sign-req server MyServer
这裡使用先前的ca凭证来签发刚刚产生的server凭证,签发后的凭证才能够使用

这裡会询问是否确认签发,输入yes按enter即可

Type the word 'yes' to continue, or any other input to abort.
Confirm request details:

产生client端的凭证

./easyrsa gen-req <client name> nopass
范例: ./easyrsa gen-req syzx-client-macbook-pro nopass

如同server凭证一样,记得名称不要重複,另外打算让几个client连线,就要做几个client凭证

签署client端的凭证

./easyrsa sign-req client <server name>
范例:./easyrsa sign-req client syzx-client-macbook-pro
如同server凭证一样,差别是server换成client

产生ta.key

输入exit跳出EasyRSA shell
cd "C:\Program Files\OpenVPN\bin" 进入openVPN主程式目录
.\openvpn --genkey tls-auth ta.key 产生ta.key

[可选] 产生dh2048.pem

openssl dhparam -out dh2048.pem 2048
由于新版的dh加密方式有改变,可以不用自己产生dh2048.pem,这步骤是留给有需要的人参考

完成

ok,到这边所有所需的认证都已经产生完成,将server端及client各端个别分目录整理好,以下分别说明放置位置

server端所需凭证

# 位置:C:\Program Files\OpenVPN\easy-rsa\pki
ca.crt

# 位置:C:\Program Files\OpenVPN\easy-rsa\pki\issued
MyServer.crt (这部份名称根据你选择的server凭证名称而定)

# 位置:C:\Program Files\OpenVPN\easy-rsa\pki\private
MyServer.key (这部份名称根据你选择的server凭证名称而定)

# 位置:C:\Program Files\OpenVPN\bin**
ta.key
dh2048.pem (如果有产生的话)

每个client端所需凭证(以Client01为例)

# 与server端相同
ca.crt
ta.key

# 位置:C:\Program Files\OpenVPN\easy-rsa\pki\issued
Client01.crt (这部份名称根据你选择的client凭证名称而定)

# 位置:C:\Program Files\OpenVPN\easy-rsa\pki\private
Client01.key (这部份名称根据你选择的client凭证名称而定)

P.S.

C:\Program Files\OpenVPN\easy-rsa\pki\private 内有产生一个ca.key虽然没用到,但这个档案要是洩漏会有重大安全性的问题,请一定要保存在非常安全的地方,像是没有网路连线的电脑

OpenVPN 2.5 .ovpn的设定

本篇描述如何制作基本的连线设定档.ovpn,只要有这个档案以及凭证就可以做初步的连线

简单介绍.ovpn

ovpn是用来描述server或是client端如何连线的设定档案,当然所有的设定都可以以命令列参数的方式直接使用,然而会用到的指令真的太多,还是汇集成一个档案方便。
在档案内 # 或是 ; 开头的内容都会被OpenVPN忽略,因此很适合作为注解说明使用。
在刚安装好OpenVPN时,内部会附有ovpn的sample设定,位置在 C:\Program Files\OpenVPN\sample-config,裡面共有三个档案。
从档名可以看出 client.ovpnserver.ovpn 分别是 client及server端的设定,而 sample.ovpn 则是可以用作两台机器对连
档案丰富,详细介绍各个设定的内含以及使用方式,有兴趣蛮建议阅读一遍,可以深入了解各个设定的内涵

server端

首先建立server端的ovpn,这边档名会建议与上一篇建立的server凭证名称相同(以我的范例来说,就是 MyServer.ovpn)
内容如下:

# OpenVPN连线使用的port,这边要与client使用的一致,另外也要注意防火牆及路由器是否有开启该port
# port建议在1023以上可以避免权限问题,另外为了安全性避免使用预设的1194,可在1024~65535挑一个
port     20000
# 连线方式,可选tcp或是udp,这边建议先选udp,速度较快而且安全性高
proto    udp
# 建立通道方式,可选tap或是tun,两者有缺可以另外写文章介绍,这边先选tun,主要为了手机也能支援,有兴趣可以先google一下差别
dev      tun
# 先前建立的ca凭证档名,如果与ovpn放在不同位置需要标示完整路径
ca       ca.crt
# 先前建立的server凭证,如果与ovpn放在不同位置需要标示完整路径
cert     MyServer.crt
key      MyServer.key
# ta凭证,后面数字0代表server端
tls-auth ta.key 0

# 不使用dh凭证,如果在上一篇有做dh2048.pem,这行要改为 dh dh2048.pem,同时档案也要跟其他凭证放在一起
dh none

# 设定VPN加密方式
cipher           AES-256-GCM
data-cipher      AES-256-GCM:AES-128-GCM

# 每10秒确认client是否还在,如果120秒内都没回应,当作该client断线
keepalive 10 120

# 设定网路遮罩,可选net30/subnet/p2p,其中windows只支援前两种,第一种是预设但比较旧的方式,这边我们先用新的subnet,日后会出专文介绍差异
topology subnet

# 设定vpn的网域,如果设定10.8.0.0就是代表10.8.0.1~10.8.0.254会分配给各client,后面那组则固定为255.255.255.0
server   10.8.0.0 255.255.255.0
# 注意,建议设定ip域时只有10.0.0.0~10.255.255.0、172.16.0.0~172.31.255.0、192.168.0.0~192.168.255.0这3种组合,另外要注意有没有跟现有区网撞号
# 一般路由器大多设定192.168开头,避掉这组应该就蛮安全的

# 设定每个client只有10.8.0.x的相关连线才走VPN通道, 如果是希望所有网路连线都走VPN,得去掉这行,并在client端做设定
push "route 10.8.0.0   255.255.255.0 vpn_gateway"
# 这边的10.8.0.0要与server那边的IP一致

# 让client之间能互相连线
client-to-client

# 使用新版虚拟网卡,速度远远超越旧版,如同wireguard般的快速
windows-driver wintun

client端

除了server外,我们要为每一个client端都制作ovpn,同样档名可与凭证相同便于管理(以我的范例来说是Client01.ovpn)
内容如下:

# 宣告我是client端
client

# 连线方式,需要与server一致
proto  udp
# 建立通道方式,需要与server一致
dev    tun

# server连线的IP与port,这边IP用110.30.5.7举例,实际上我不是用这组
remote 110.30.5.7 20000
# 表明连线后可以还能使用别的port提昇连线效率
nobind

# 凭证设定
ca       ca.crt
cert     Client01.crt
key      Client01.key
tls-auth ta.key 1
remote-cert-tls server

# 设定VPN加密方式,这边要跟server端一致
cipher           AES-256-GCM

# 设定所有连线都走VPN从server端连出去, 若需要请将下面2行开头的;去掉
;redirect-gateway def1
;dhcp-option DNS 8.8.8.8
# 之所以把这个设定放在这边是因为如果由server端push这个设定,虽然方便,但是万一日后改设定出了差错,就有得跑到server主机处理的风险

# 使用新版虚拟网卡,速度远远超越旧版,如同wireguard般的快速,可与server端不同
windows-driver wintun

连线测试

设定完了之后接下来就要测试是否可以使用,首先是server端
我们先进入放置的位置,预设是在 C:\Program Files\OpenVPN\config
这裡我会建议多建立一个目录,以便日后放其他不同的设定,在这裡我新建目录 MyServer
将先前凭证连同ovpn总共5个档案(ca.crt、MyServer.crt、MyServer.key、ta.key、MyServer.ovpn)
複制到刚才的目录 C:\Program Files\OpenVPN\config\MyServer

接著到萤幕左下角找OpenVPN的图示,长的有点类似网路连线的图案,上面有一颗锁。对这个图示按右键选择连线,便会启动server端功能
如果顺利的话,不会看到任何错误视窗,且刚才的icon会变成绿色

client端差不多,我在另外电脑建立 Client01 目录在 C:\Program Files\OpenVPN\config
将先前凭证连同ovpn总共5个档案(ca.crt、Client01.crt、Client01.key、ta.key、Client01.ovpn)
放入 C:\Program Files\OpenVPN\config\Client01
右键OpenVPN图示连线,
同样如果没有任何错误视窗,且icon变绿色的话就是顺利连上

接著我们要来做ping测试,由于我们设定的网域是10.8.0.0,所以server被分配到的ip就会是10.8.0.1
我们在client端的电脑上,进入到powershell或是cmd裡面,输入以下指令
ping 10.8.0.1
如果有回应,代表连线已经顺利完成,这样就算是完成了vpn连线

想当然,应该会有不少人在连线遇到错误或是ping的问题,之后会在下篇文章介绍解决方式
这边先大概提点一下,大部分问题都源自于windows系统的防火牆