OpenVPN 简介:

OpenVPN是一个用于创建虚拟私人网络加密通道的软件包,最早由James Yonan编写。OpenVPN允许创建的VPN使用公开密钥、电子证书、或者用户名/密码来进行身份验证。

它大量使用了OpenSSL加密库中的SSL/TLS协议函数库。

目前OpenVPN能在Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X与Microsoft Windows以及Android和iOS上运行,并包含了许多安全性的功能。它不与IPsec兼容。

下载:

Eastar’s Tips:
无论是服务器端还是客户端,使用的是同一个安装程序,仅仅通过配置文件来区别;

官网安装包下载地址(各系统版本):

第三方安装包下载地址(各系统版本):https://www.techspot.com/downloads/5182-openvpn.html

清华大学镜像地址(Linux版本) https://mirrors-i.tuna.tsinghua.edu.cn/linuxbrew-bottles/bottles/openvpn-2.4.9.x86_64_linux.bottle.tar.gz

源码地址: https://github.com/OpenVPN/openvpn

服务端安装部署:

打开安装包进行安装,客户端跟服务器安装方式一样,都需要安装:

接受(I Agree)下一步:

下面选项默认不勾选,我们需要勾选证书生成程序 ,不然安装完无法命令行制作证书操作:

选择安装目录:

Eastar’s Tips:
如果默认安装C盘,后续操作会简单一些;
如果选择安装D盘,需要记下此路径,后面需要调整HOME值;

安装完成:


安装完成后系统会多出一张网卡 TAP的 本地连接:

要想 客户端 能够通过 服务端 上网需要调整 服务端的物理网卡 共享:

Eastar’s Tips:
在物理网卡上右键选择属性,共享选项卡中勾选“允许其他网络用户通过此计算机的 Internet 连接来连接”;

生成配置:

OpenVPN支持基于加密证书的双向认证。
在OpenVPN中,不管是服务器还是客户端,所有的证书和私钥都需要由服务器端生成,客户端要先获得服务器端分配给它的加密证书和密钥才能成功连接。
客户端只需要安装好软件,然后复制服务端生成的配置到客户端即可

所以直接打开 cmd ,进入 OpenVPN 的安装目录:

D:\Program Files\OpenVPN\easy-rsa

然后在服务器端运行以下命令:

  1. 运行 DOS 命令,初始化执行环境。

下面的第1条批处理执行前,建议考虑以下因素:
由于 init-config 会把 vars.bat.sample 复制为 var.bat,所以可以根据自己需要先修改 vars.bat.sample 模板文件中的一些变量;

vars.bat.sample 部分默认值为:

set HOME=%ProgramFiles%OpenVPN\easy-rsa
set KEY_COUNTRY=US
set KEY_PROVINCE=CA
set KEY_CITY=SanFrancisco
set KEY_ORG=FortFunston
set KEY_EMAIL=mail@domain.com

修改为:

set HOME=D:\Program Files\OPENVPN\easy-rsa #(此路径就是上面安装时,自己选择的安装路径)
set KEY_COUNTRY=CN                         #(国家)
set KEY_PROVINCE=ShangHai                 #(省份)
set KEY_CITY=ShangHai                      #(城市)
set KEY_ORG=softool.cn                     #(组织)
set KEY_EMAIL=kefu@softool.cn              #(邮件地址)

//上面#开始的是注释,请不要同行写到 vars.bat.sample 文件中,否则会在命令提示符中显示乱码!

执行命令:

init-config     #init-config 默认会执行当前目录下的 init-config.bat,以下同理。 功能:把 vars.bat.sample 复制为 var.bat
vars            #vars.bat 用来设置一些变量,主要就是配置文件中修改的那部分
clean-all         #如果之前有keys目录,会先删除D:\Program Files\OpenVPN\easy-rsakeys目录,再把 index.txtserial 文件放进来

  1. 创建CA根证书:

注:
build-ca # 生成根证书;
build-dh.bat # 生成 dh2048.pem 文件,Server 使用 TLS(OpenSSL) 必须要有的文件;

D:\Program Files\OpenVPN\easy-rsa>build-ca
#此处的错误待研究:
Can't load D:\Program Files\OPENVPN\easy-rsa/.rnd into RNG
5712:error:2406F079:random number generator:RAND_load_file:Cannot open file:crypto/rand/randfile.c:98:Filename=D:\Program Files\OPENVPN\easy-rsa/.rnd
Generating a RSA private key
.............................................++++
............................++++
writing new private key to 'keysca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
#下面我直接回车默认,因为我在 init-config 之前,已经修改了 vars.bat.sample 文件。
Country Name (2 letter code) [CN]:
State or Province Name (full name) [ShangHai]:
Locality Name (eg, city) [ShangHai]:
Organization Name (eg, company) [softool.cn]:
Organizational Unit Name (eg, section) [changeme]:
Common Name (eg, your name or your server's hostname) [changeme]:CA
Name [changeme]:
Email Address [kefu@softool.cn]:


D:\Program Files\OpenVPN\easy-rsa>build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
...............................................................................................+...............................................+..............................................................................................+................+.................................................................................................................................................................................+..........................................................................................................................................................................................................+.................+.......................................................................................................................................................+......................................................................................................................................................+.......................+...............................................................................+...................................................................+...................................................................................+.........+...........+...........................................+............................................................................................................................................................................................................................+.........................................................................................................................................................................................................................................+..........................................................................................................................................................................................................+................................................................................+.................................................................................................+..........................+.......................................................................................................................................+................................+..............................................................................................................+.+............................................................................+.................................................+...+........................................................................................................................+...............+......................................................................................................................................................................................................................+..........................................................................................................................................................................................................................................................+.....................................................................................................................................................+.....................................................................................................+................................................................................................+.....................................................................................................+.........................................+....+................................................................................................................+................................................................................................................................................................................................................................................+..............................................................................................+....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................................................................................................................................................................................................................................................................+...................................................................................................................................+................................................................+........+................................................................................................................................................................................................................................................+................................+.................................................................................................................................................................................................................................................................................................+.................................................................................................................................................................................................................................+................................+..............................................................................................................................................+.............................................................+.................................................+................................++*++*++*++*

注:
build-ca 的时候需要输入一些注册信息。在输入信息的时候,如果你不输入任何信息,就表示采用默认值(前面[]中的内容就是默认值)

  1. 创建 服务器端 证书:

    build-key-server server  #生成服务端密钥和证书

    注:
    builid-key-server 后面指定的参数名 server 指的是生成的证书和密钥文件的名称(E.g server.key、server.csr 和 server.crt,这些文件保存在 keys 目录中),你可以按照自己的需要进行修改,不过后面的 Common Name 也应保持一致;
    如果需要生成多个服务端的密钥和证书则继续 build-key-server server02 … … ;

  2. 创建 客户端 证书:

    build-key client

    注:
    和build-key-server一样要输入一堆东西,注意的是 Common Name 不能与执行 build-key-server 时输入的一样;
    如果需要生成其他的客户端密钥和证书,可以继续 build-key client02 … … ;

服务端的配置

  1. 首先,在 OpenVPN 安装目录(D:\Program Files\OpenVPN\config)下创建 server.ovpn ;
    server.ovpn 模板文件如下,可根据需要调整:
; local 用于监听本机(作为服务器端)已安装网卡对应的IP地址,该命令是可选的,如果不设置,则默认监听本机的所有IP地址;
local 192.168.3.1

; 如果你想在同一台计算机上运行多个 OpenVPN 实例,你可以使用不同的端口号来区分它们,同时需要在防火墙上开放这些端口;
; 如果是用 http 代理连接,建议使用默认值 1194 ,如果使用 https 代理,建议使用大家常用值 443
port 1194

; 通过 TCP 协议连接
;proto tcp
; 如果想使用 UDP 协议:
proto udp

; win 下必须设为 tap ,将会创建一个以太网隧道;
; tap 处理二层,tun 处理三层,虽然 tun 两端ip是同一个子网,但是其二层却不是,广播是无法进行的,但是 tap 可以传输广播;
; 由于windows的虚拟网卡驱动的特殊性,为了让windows也能进入vpn,OpenVPN和虚拟网卡驱动作了特殊且复杂的处理。
dev tap

; 设置 服务器端 模式,并提供一个 VPN 子网,以便于从中为 客户端 分配IP地址,假设 服务器端 自己占用了 192.168.0.1,所以其他的将提供 客户端 使用;
; 如果你使用的是 以太网桥接 模式,请注释掉该行;
; ★★★ 当客户端连接到此处的服务端时,为 客户端的以太网适配器分配的IPv4地址从此处指定的网段中指定一个;
server 192.168.0.0 255.255.255.0

; 设置 SSL/TLS 根证书(CA)、证书(cert)和私钥(key)。
; 每个 客户端 和 服务器端 都需要它们各自的证书和私钥文件。
; 服务器端和所有的客户端都将使用相同的CA证书文件。
; 通过 easy-rsa 目录下的一系列脚本可以生成所需的证书和私钥。
; 记住,服务器端和每个客户端的证书必须使用唯一的 Common Name。
; 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。
; OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的”pkcs12″指令)
ca ca.crt
cert server.crt
; 该文件应该保密
key server.key
; 指定 迪菲·赫尔曼参数,你可以使用如下名称命令生成你的参数:
; openssl dhparam -out dh2048.pem 2048
; 如果你使用的是1024位密钥,使用1024替换其中的2048。
dh dh2048.pem

; 指定用于记录客户端和虚拟IP地址的关联关系的文件。
; 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
ifconfig-pool-persist ipp.txt

; 该指令仅针对以太网桥接模式。
; 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。
; 然后,你需要手动设置桥接接口的IP地址、子网掩码;
; 在这里,我们假设为10.8.0.4255.255.255.0。
; 最后,我们必须指定子网的一个IP范围(例如从10.8.0.50开始,到10.8.0.100结束),以便于分配给连接的客户端。
; 如果你不是以太网桥接模式,直接注释掉这行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

; 该指令仅针对使用DHCP代理的以太网桥接模式,
; 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。
; 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。
; 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。
;server-bridge

; 推送 路由信息 到 客户端 ,以允许 客户端 能够连接到 服务器 背后的其他私有子网(简而言之,就是允许 客户端 访问 VPN服务器 自身所在的其他局域网);
; 记住,这些私有子网也要将 OpenVPN客户端 的地址池(10.8.0.0/255.255.255.0)反馈回 OpenVPN服务器。
; ★★★ 为客户端 指定路由表:
;push "route 172.31.3.0 255.255.255.0"
;push "route 172.31.5.0 255.255.255.0"

; 如果启用该指令,所有 客户端的默认网关 都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。
; (为确保能正常工作,OpenVPN服务器所在计算机可能需要在 TUN/TAP 接口与以太网之间使用NAT或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp"

; 某些具体的 Windows网络设置 可以被推送到客户端,例如DNS或WINS服务器地址。
; 下列地址来自 opendns.com 提供的 Public DNS 服务器。
; 下面2句:客户端连接到此处的服务端时,会给 客户端的以太网适配器 的DNS服务器设置为此处指定的IP
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 223.5.5.5"

; keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。
; 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。
keepalive 10 120

; 选择一个密码加密算法。
; 该配置项也必须复制到每个客户端配置文件中。
;cipher BF-CBC ; Blowfish (默认)
;cipher AES-128-CBC ; AES
;cipher DES-EDE3-CBC ; Triple-DES
cipher AES-256-CBC

; 在VPN连接上启用压缩。
; 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。
comp-lzo

; 去掉该指令的注释将允许不同的客户端之间相互”可见”(允许客户端之间互相访问)。
; 默认情况下,客户端只能”看见”服务器。为了确保客户端只能看见服务器,你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。
client-to-client

; 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun

; 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。
status openvpn-status.log

; 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。
; 0 表示静默运行,只记录致命错误。
; 4 表示合理的常规用法。
; 56 可以帮助调试连接错误。
; 9 表示极度冗余,输出非常详细的日志信息。
verb 3

explicit-exit-notify 1

push route表示推送的具体路由,就是这些路由是走VPN,其他流量还是走默认网关,然后就可以启动服务了。
把 D:\Program Files\OpenVPN\easy-rsakeys 目录下的ca.crt、ca.key、server01.crt、server01.csr、server01.key、dh2048.pem、ta.key 复制到 D:\Program Files\OpenVPN\config 目录下。
据说某些运营商封锁了UDP的数据链路,所以建议 openVPN 采用TCP协议连接;
;
怎么理解 tun 设备建立的是“点对点”链路?因为tun隧道是三层隧道,没有二层链路,更不必说二层广播链路了,我们知道数据链路层有两种通信方式,一种是点对点的方式,比如ppp协议,另一种是广播的方式,比如以太网,tun设备建立的隧道只有两个端点,隧道中封装的是IP数据报,虽然也需要arp协议来定位隧道对端tun设备的mac,然而如果有n台机器同时连接进一个虚拟网络并且属于同一个网段的话,其它机器是不会收到这个arp报文的,因为根本就没有二层链路帮忙广播转发这个arp报文

客户端的配置

把配置文件 client.ovpn 放到客户端机器的 D:\Program Files\OpenVPN\config 目录下,并且把服务器 D:\Program Files\OpenVPN\easy-rsakeys 目录下的

client01.crt、client01.csr、client01.key、ca.key、ca.crt、ta.key 文件一起复制到客户端D:\Program Files\OpenVPN\config目录下 (以上文件为服务端生成,客户端需要在服务端拷贝这7个文件过来)。

client.ovpn的配置如下:

client
dev tun
proto tcp

remote 服务端IP 1194
;remote my-server-2 1194

;remote-random

resolv-retry infinite
nobind
user nobody
group nobody
;route 192.168.0.0 255.255.252.0
persist-key
persist-tun

;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

ca ca.crt
cert client.crt
key client.key

ns-cert-type server
tls-auth ta.key 1
comp-lzo
# Set log file verbosity.
verb 4

笔记:

  • 经本站测试,之前 server 端启动总是提示“server 连接失败”,后经过改为 udp 正常。
  • 更新历史:
    2022-08-03 更新了物理网卡设置属性共享图片和server配置文件server.ovpn;
  • 经测试可以使用的另外一篇文章是 https://blog.51cto.com/u_9829390/5190623

来源: