OpenVPN是一款优秀用于创建虚拟私人网络的软件,但是由于其涉及了服务器证书、TLS密钥、防火墙等一堆衍生概念,因此设置显得比较复杂。本文化繁为简,仅以 “能连通” 这个最低要求,完整地展示了一遍OpenVPN的安装调试过程。万事开头难,在实现了连通的基础上再来探索更多的功能是一种比较好的学习路径。


一、概述

在安装openvpn的时候之前,大概说下它的结构,整个安装流程涉及以下4个部分:

  1. Server / Client 服务器端程序

  2. Easyrsa 证书生成程序

  3. Server端配置文件

  4. Client 端配置文件

观察上图,其实OpenVPN的服务器端和客户端是合二为一的,并没有采用独立的服务器端程序或者客户端程序来区分其角色,它是通过配置文件来实现功能差异的。因此无论服务器端还是客户端,启动程序都相同,Linux下为openvpn,在windows下则为openvpn.exe。

Easyrsa是一个证书生成器,它是一个独立程序,它可以为OpenVPN生成各种所需要的证书和密钥,所谓的证书就是一种绑定了额外信息的公钥,密钥则可以理解为私钥。这里不做深入解释,有兴趣的同学可以搜索一下非对称加密的相关知识。注意:其中一个tls密钥 ta.key 并非由Easyrsa 而是由OpenVPN主程序生成的。

至于Server 服务器端配置文件以及 Client 客户端配置文件,则由我们手动用记事本输入生成。


二、 前置操作及程序安装

  1. 目录创建

    与其他软件安装不同,OpenVPN的安装过程中将要产生许多临时文件,因此我们最好专门创建一个目录来存放他们:

    mkdir -p ~/ovpn
    mkdir -p ~/ovpn/keys
    

  1. 软件安装

    一般来说,我们的OpenVPN服务器安装在Linux上,而客户端则五花八门,可能是Windows PC或者iOS、安卓等系统。现在先说服务器端安装,以Centos为例:

    安装OpenVPN:

    dnf -y install openvpn

    安装Easyrsa:

    cd ~/ovpn
    wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.0/EasyRSA-3.1.0.tgz
    tar xvf EasyRSA-3.1.0.tgz
    mv EasyRSA-3.1.0 easyrsa
    cd easyrsa
    

    客户端方面,OpenVPN官网有两个版本,可以理解为完整版和精简版,完整版下载地址:
    https://openvpn.net/community-downloads/
    以上链接包含了所有OpenVPN功能,其中包含了Server和Client。

    此外,官网还有一个称为 OpenVPN Connect 的软件,它是一个精简版本,只能实现Client (客户端)功能,下载地址是:
    https://openvpn.net/vpn-client/

    最后,还有一个类似精简版的第三方程序叫做Pritunl,下载地址是:

    https://github.com/pritunl/pritunl-client-electron/releases

    PS: 本文以官网完整版for windows 64bit为例。


三、证书生成

  1. 根证书生成:

    cd ~/ovpn/easyrsa
    ./easyrsa init-pki [初始化,程序将自动创建pki目录]
    

    现在,编辑easyrsa的配置文件 vars:

    nano pki/vars

    将整个文件清空,只留下两行,并存盘退出:

    set_var EASYRSA_ALGO "ec"
    set_var EASYRSA_DIGEST "sha512"
    

    输入以下命令,生成根证书:

    ./easyrsa build-ca

    牢记PEM pass phrase,这个就是根证书密码,后面好几个步骤需要用到它


  2. 服务器证书生成:

    ./easyrsa gen-req server nopass

    Common Name直接回车使用默认名称:server

    签署服务器证书:

    ./easyrsa sign-req server server

    输入刚才设置的根证书密码


  3. 客户端证书生成:

    ./easyrsa gen-req client1 nopass

    Common Name直接回车使用默认名称:client1

    ./easyrsa sign-req client client1

    输入刚才设置的根证书密码


  4. tls密钥生成:

    openvpn --genkey secret ta.key

    这个密钥由openvpn主程序生成,起作用是用密钥取代密码输入


至此,我们就完成了全部所需证书文件的生成,下面将这些零散的文件集中拷贝到 keys 目录中去:

cp ~/ovpn/easyrsa/pki/ca.crt ~/ovpn/keys
cp ~/ovpn/easyrsa/ta.key ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/private/server.key ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/issued/server.crt ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/private/client1.key ~/ovpn/keys
cp ~/ovpn/easyrsa/pki/issued/client1.crt ~/ovpn/keys

四、编辑Server和Client端配置文件

  1. 编辑Server端配置文件:

    nano ~/ovpn/keys/server.conf

    port 1194
    proto tcp
    dev tunca ca.crt
    cert server.crt
    key server.key
    dh none
    tls-crypt ta.keyserver 10.8.0.0 255.255.255.0
    ifconfig-pool-persist ipp.txtpush "redirect-gateway def1 bypass-dhcp"
    push "dhcp-option DNS 208.67.222.222"
    push "dhcp-option DNS 208.67.220.220"cipher AES-256-GCM
    auth SHA256keepalive 10 120
    verb 3
    explicit-exit-notify 0
    

    这个文件的原始版本内容很多,不过里面注释部分占了90%,有兴趣的同学可以通过这个路径找到默认的源文件:

    /usr/share/doc/openvpn/sample/sample-config-files/server.conf

    我们在这里不做过多解释,大致都是一些常规配置,可能让人费解的是这两行:
    push “dhcp-option DNS 208.67.222.222”
    push “dhcp-option DNS 208.67.220.220”

    意思是说让客户端使用这两个由opendns.com提供的DNS服务器。


  2. 编辑Client端配置文件:

    nano ~/ovpn/keys/client1.ovpn

    client
    dev tun
    proto tcp
    remote 123.123.123.123 1194
    resolv-retry infinitenobind
    persist-key
    persist-tunca ca.crt
    cert client1.crt
    key client1.key
    remote-cert-tls server
    tls-crypt ta.key 1cipher AES-256-GCM
    auth SHA256key-direction 1verb 3
    

    同样的,以上也是精简版本,源文件在这里:

    /usr/share/doc/openvpn/sample/sample-config-files/client.conf

    其中唯一需要改动的地方是将 123.123.123.123 改为你自己的OpenVPN服务器地址即可。

    注意,服务器端与客户端配置文件需要保持一致,例如:

    1. dev tun (如果服务器端是dev tun 而 客户端为dev tap则会报错)

    2. proto tcp (本文以tcp为例,如果此处改为udp,则两边都必须为udp)

    3. tls-crypt (有些教程此处为tls-auth也是可以的,但两边注意同步)


五、连通性测试

在服务器上输入这条命令开启OpenVPN Server:

openvpn --config ~/ovpn/keys/server.conf

如果没有问题的话,最后一行将会显示:

Initialization Sequence Completed

如果配置有误,则需要仔细排查看看到底问题出在哪。


回到客户端这边,首先将 ~/ovpn/keys 中的这5个文件通过ftp或者别的什么方式拷贝到客户端PC:

  • ca.crt

  • ta.key

  • client1.crt

  • client1.key

  • client1.ovpn

然后将这5个文件拷贝到OpenVPN for Windows的安装文件夹:

C:\Program Files\OpenVPN\config

打开OpenVPN GUI ,鼠标右键单击右下角OpenVPN图标,然后选 ”连接“,则会弹出一个Log窗口,如果最后也是显示 Initialization Sequence Completed 的话,则说明基本问题不大了。

<题外话>

C:\Program Files\OpenVPN\bin 这个文件夹里有一个名为openvpn.exe 的文件,其作用与Linux下的 openvpn命令 一样。因此我们可以绕开图形化界面,直接在cmd终端下使用:openvpn.exe --config client1.ovpn 命令进行连接。

现在我们可以输入 ping 10.8.0.1 看看能否ping通服务器网关,如果能连通则说明客户端到服务器之间已经可以正常通讯了,但是此时客户端还不能正常上网,因为服务器还没有进行NAT设置。


六、路由及NAT设置

这项工作是在服务器上进行的,一般来说与客户端无关。通常的教程都是以 iptable 为例,笔者对这个老工具不甚了解,因此无法提供相应的命令组合或者脚本,下面提供一个 nftables 脚本,其作用与 iptable 一样:

nano openvpn.nft

输入以下内容:

flush ruleset
table inet filter{chain input {# 允许tcp 1194通过tcp dport 1194 accept}chain forward {type filter hook forward priority 0; policy drop;ct state related,established acceptiifname tun0 oifname ens3 accept}}table ip nat {chain postrouting {type nat hook postrouting priority 100;# 对10.8.0.0网段的地址进行NATiifname tun0 oifname ens3 ip saddr 10.8.0.0/8 masquerade}chain prerouting {type nat hook prerouting priority 0;}}

然后用这条命令加载即可:

nft -f openvpn.nft

这个脚本需要修改两个地方都很简单:

tun0 为OpenVPN创建的虚拟网卡名称,将它改成你自己的即可。

ens3 为本机的真实网卡名称,改为你自己的即可。

接下来,别忘了允许服务器转发:

nano /etc/sysctl.conf

net.ipv4.ip_forward 修改为1,存盘退出。

现在,客户端就可以正常上网了。至此OpenVPN的基础设置就完成了,接下来再来完善一些细节。


七、服务器自启动设置

  1. 将服务器所需的所有文件拷贝到OpenVPN默认目录:

    cp ~/ovpn/keys/ca.crt /etc/openvpn/server
    cp ~/ovpn/keys/ta.key /etc/openvpn/server
    cp ~/ovpn/keys/server.crt /etc/openvpn/server
    cp ~/ovpn/keys/server.key /etc/openvpn/server
    cp ~/ovpn/keys/server.conf /etc/openvpn/server
    
  2. 修改openvpn-server服务文件:

nano /usr/lib/systemd/system/openvpn-server@.service

ExecStart=/usr/sbin/openvpn --config server.conf
ExecStop=killall openvpn

修改ExecStart 和 ExecStop 启动和关闭命令即可,存盘退出后,再执行:

rm -rf /etc/systemd/system/openvpn-server@server.service.d

因为这个地方会 Override 加载一些没有用的内容而导致加载失败,而这些功能(add-bridge等)都不是我们这个极简教程所需要的,因此将之删除,有兴趣的同学可以在备份好源文件的前提下继续深入研究。现在,重新加载OpenVPN服务:

systemctl daemon-reload
systemctl start openvpn-server@server.service
systemctl enable openvpn-server@server.service

如果没有任何报错,则说明服务设置成功,下次开机系统将会自动启动OpenVPN。

当然,仅仅自启动OpenVPN是不行的,还需要自动加载我们的防火墙脚本:

nano /etc/nftables.conf

这是 nftables 的默认启动脚本,将我们上面的nft防火墙脚本复制粘贴进去然后存盘即可。

另外,确保nftables是自启动的:

systemctl enable nftables


八、客户端配置文件优化

尽管现在我们其实已经可以正常使用OpenVPN了,但客户端需要以下5个文件来支持:

  • ca.crt
  • ta.key
  • client1.crt
  • client1.key
  • client1.ovpn

这对单个客户端而言还不算麻烦,但是客户端一多,分发和管理的时候就很费事了,下面我们将这5个文件整合为1个以方便分发(PS: 此步骤并非必须,仅供参考)

  1. 切换到Windows 的 C:\Program Files\OpenVPN\config 文件夹

  2. 用记事本打开 client1.ovpn

  3. 用记事本打开 ca.crt

  4. 全选 ca.crt 文件内容,选 ”复制“

  5. 切换到 client1.ovpn 在文件末尾添加:

    <ca>在此处粘贴ca.crt的内容
    </ca>
    
  6. 依葫芦画瓢,依次打开剩下的4个文件,然后将其粘贴到client1.ovpn里即可,对应的标签分别是:

    <cert> client1.crt的内容 </cert>
    <key> client1.key的内容 </key>
    <tls-crypt> ta.key的内容 </tls-crypt>

至此client1.ovpn 里相当于加塞了4个文件的内容,现在将这4个文件删除(先备份好的前提下),只留下client1.ovpn ,重新打开 OpenVPN GUI 一样可以正常连接,功能不受影响。显然,这在分发的时候就简单清爽多了。

一看就懂的保姆级教程:open vn设置 (亲测通过)相关推荐

  1. 一看就会的保姆级教程,10分钟搭建个人博客

    前言 相信很多人都想拥有一个自己的个人博客,现有的个人博客搭建框架已经有很多了,例如 hexo .vuepress .jekyll 等等,这里我选用 vuepress 来快速搭建个人博客 网上教程千千 ...

  2. 手把手带你从0开始搭建个人网站,小白可懂的保姆级教程

    前言 本教程能让小白5分钟学会!让你也能够轻松搭建属于你的个人网站. 准备工作 云服务器 网页源码 Xshell远程连接工具 服务器说明: 购买服务器可以选用国内知名品牌,例如:腾讯云.阿里云.华为云 ...

  3. 判断是不是链接 正则_Python 正则表达式 保姆级教程,小学生都看得懂!!

    ~点击 蓝字 关注,获取更多资源~ 0 前言 上一篇文章,2020,还不会正则???,和小伙伴们一起学习了 Python 中的正则表达式,读完之后,总感觉少了点什么东西,无法尽兴?就好像爱你们的心少了 ...

  4. 自媒体人平台运营保姆级教程!速看!

    自媒体人平台运营保姆级教程!速看! 一.三大媒体发布平台分析 微博:微博是指一种基于用户关系信息分享.传播以及获取的通过关注机制分享简短实时信息的广播式的社交媒体.网络平台,允许用户通过Web.Wap ...

  5. 保姆级教程从零搭建云服务器(小彩蛋,请大家看烟花秀)

    笔者已从零搭建好云服务器,在文章开始笔者请大家看一场简单的烟花秀,该篇博文是写给小白的保姆级教程,不论是有基础还是没基础的,都可以根据本篇博文,轻松搭建个人云服务器. 烟花秀:浏览器直接输入ysw.w ...

  6. 快速上手Springboot项目(登录注册保姆级教程)

    本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...

  7. js对象、数组、字符串操作总结(保姆级教程)

    对象操作 1. 扩展运算符 作用是遍历某个对象或者数组 testMethod() {// 三个点 ... 俗称扩展运算符或延展运算符,需要注意的是扩展运算符在拷贝的时候只能深拷贝第一层,第二层及以下都 ...

  8. CSGO饥荒服务器搭建保姆级教程

    CSGO&饥荒服务器搭建保姆级教程 准备 第一步:软硬件 软件:Xshell.Xftp用于连接云服务器和进行文件传输. 进去填写邮箱,他会给你发个邮件,通过邮件获得下载链接,通过下载链接下载X ...

  9. 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下

    文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...

  10. XML快速入门的保姆级教程!!!

    XML快速入门的保姆级教程!!! 简介 基础语法 组成部分 约束 约束分类 DTD schema 解析 Jsoup Jsoup:工具类,可以解析html或xml文档,返回Document对象 Docu ...

最新文章

  1. CCTouchDispatcher sharedDispatcher 方法过期
  2. MIT开发新加密货币,用户所需数据比比特币减少99%
  3. 【NGN学习笔记】4 软交换中的协议2—Megaco/H.248
  4. python3爬虫初探(五)之从爬取到保存
  5. cclink 和发那科机器人_FANUC机器人焊枪工具坐标系设定
  6. STM32H743+CubeMX-QSPI读写外部FLASH(W25Q128JVSQ)
  7. Wodpress模板
  8. 数据库工作笔记017---还记得Oracle悲观锁和乐观锁嘛?以及hibernate对乐观悲观锁的封装
  9. 泽元网站内容管理系统 (简称ZCMS)
  10. python植物大战僵尸脚本_用 Python 实现植物大战僵尸代码!
  11. python实现3d人物建模_很强!用Python实现3D建模!
  12. selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable: eleme
  13. iOS进阶面试题----多线程
  14. 基于python-opencv的图像中截取多边形区域
  15. SpringAMQP-Basic Queue、Work Queue、Fanout、Direct、Topic
  16. 草履虫纳米机器人_《Nature》草履虫大小的微型机器人:由激光驱动可用于显微外科...
  17. 【组队学习】【33期】LeetCode 刷题
  18. 工业相机(高速相机)与普通相机的差别
  19. 小程序识别企业微信二维码功能
  20. 模型可视化工具-netron网页版

热门文章

  1. 用友vs金蝶产品分析(云星空与YonSuite)
  2. 从0开始制作简单的小程序AR
  3. 【Turtlrbot3-burger】从零开始配置Turtlrbot3小车1
  4. [读书笔记] 蔡康永的说话之道
  5. Spring配置解析之Component-scan解析
  6. git ------git stash(储藏到缓存中) 暂时保存未被提交的数据至堆栈中
  7. java输入一个整数对应英文星期_C语言实验——输入数字星期,输出英文(switch语句)...
  8. QQ浏览器网页版微信抓包和IPAD微信抓包 Wireshark
  9. 小象学院python数据分析课程怎么样_小象学院大数据分析集训营试听知识点整理-正则表达式...
  10. Rime添加Emoji输入方案