最近因工作需要搭一个VPN,网上查了查相关的词居然都被屏蔽(白眼.gif),只能自己鼓捣,记录一下过程。
1. 环境
1.1 硬件和网络拓扑
-
OpenVPN Server:双网卡机器,同时连接大小网,提供 VPN 拨号服务。
-
OpenVPN Client:位于大网,通过拨号,获得小网地址后,可以和小网 PC 互相访问。
-
小网 PC:位于小网(如 192.168 网段)
注意:以下 OpenVPN Server 网络配置相关信息仅供参考,并非真实信息。
IP1:10.185.80.57 子网掩码1:255.255.254.0
IP2:192.168.18.6 子网掩码2:255.255.240.0
1.2 软件要求
操作系统:Centos 7
第三方包:所有软件包均通过 yum 在线安装
2.安装配置 OpenVPN 服务端
2.1 配置 yum 源
由于 rpm 包安装需要的依赖关系可能比较繁杂,这里选用 yum 在线安装。
2.1.1 配置 Centos 源
打开 Centos 清华镜像源 ,选择 Centos 7 配置文件,直接使用如下内容覆盖掉/etc/yum.repos.d/CentOS-Base.repo
文件:
1 | [base] |
然后缓存元数据。
1 | yum makecache |
2.1.2 配置 EPEL 源
openvpn 在 EPEL 仓库中,所以需要配置 EPEL 源。这里参考清华镜像源epel帮助,在/etc/yum.repos.d
目录下增加“epel.repo”文件,内容如下:
1 | [epel] |
然后执行下面的命令,缓存元数据。
1 | yum makecache |
2.2 安装相关软件包
执行如下命令,一次性完成安装
1 | yum -y install lzo openssl easy-rsa openvpn |
安装后,easy-rsa 的相关文件存放于/usr/share/easy-rsa/3.0.3
和/usr/share/doc/easy-rsa-3.0.3
两个路径下,需要把 easy-rsa 的相关文件放到一个目录,以便后面的操作, 这里我放到/root/EasyRSA-3.0.3/
目录。操作如下
1 | mkdir /root/EasyRSA-3.0.3 |
操作完成后,目录中的内容如下
2.3 制作 server 端证书
制作证书需要一个目录,(我这里以/etc/openvpn/
目录为 server 端根目录),执行
1 | cp /root/EasyRSA-3.0.3 /etc/openvpn/ # 复制一份给server端,用于生成客户端证书 |
修改下 EasyRSA-3.0.3 目录下的 vars 这个文件,配置下环境变量,这里配置了主要是方便在后面制作证书的过程中不用输入很多信息,比较方便,我这里的配置如下图,业务可根据需求自行配置。
vars 这个文件修改完毕之后,需要 source 一下,再把证书系统初始化,操作如下
1 | source vars # 把var里面的值写入到环境变量中去 |
下一步就是制作 CA 证书了,如下:
1 | ./easyrsa build-ca # 制作ca证书 |
这里会要求出入一个 CA 证书的密码,可以不用输入,我这里输入的 CA 密码为 123456,同时设置 CA 的 Common Name 为 puma。
注意:这里CA的这个密码 123456 要记住,因为后续进行 server 证书和 client 证书认证的时候都需要输入这个密码的。如果忘记了的话,就需用重新制作根证书了。
下一步就是生成server端的证书了,执行:
1 | ./easyrsa gen-req server nopass # 生成server端证书,需要输入server端的CommonName,可以自行设置 |
我这里配置的服务器的名字为 server,服务器证书的 Common Name 为 puma_server
接下来需要对服务器端的证书进行签名认证
1 | ./easyrsa sign server server # 认证server端证书,需要前面设置的 CA 密码 |
注意:认证证书时需要输入CA的密码,我这里输入 123456,可以看到,认证成功了。
最后一步就是生成 Diffie-Hellman 文件了,如下:
1 | ./easyrsa gen-dh # 生成 dh 证书 |
完成后如上图。到这里,server 端的证书和根证书就都生成了,我们把它们拷贝到一个目录下,方便后续 openvpn 的配置文件进行配置。这里把需要用到的证书都拷贝到 /etc/openvpn/server
目录下,操作如下:
1 | cd /etc/openvpn/EasyRSA-3.0.3 |
执行完成后,/etc/openvpn/server
目录下应该有4个文件
2.4 配置 server 端配置文件
执行如下命令写配置文件
1 | cd /etc/openvpn/server/ |
1 | # 强烈建议配置文件中用绝对路径 |
上面的配置中我们把用户名密码校验交给了checkpsw.sh
,现在写一个校验脚本
1 | cd /etc/openvpn/server/ |
1 |
|
保存后,给脚本加上可执行权限。接着编写 psw-file 文件,其中保存着已授权的用户名和密码。
1 | chmod +x checkpsw.sh |
1 | 用户名1 密码1 |
执行如下命令配置 iptables 的 NAT 转发
1 | iptables -t nat -A POSTROUTING -j MASQUERADE |
在 openvpn-server 机器上,编辑/etc/sysctl.conf
文件,加入net.ipv4.ip_forward=1
到该文件中并保存,开启操作系统的网关转发功能,操作如下:
1 | vim /etc/sysctl.conf |
修改完成并保存后就运行如下命令:
1 | sysctl -p # 使 /etc/sysctl.conf 配置文件里面的配置生效 |
2.5 启动 server 端
执行如下命令启动 openvpn 服务端,如图,表示启动成功。
1 | openvpn --config /etc/openvpn/server/server.conf |
注意:OpenVPN 启动后会占用终端,按
Ctrl+C
停止运行。如果想启动后不占用终端,可加上--daemon
参数,如此,启动命令则为:openvpn --daemon --config /etc/openvpn/server/server.conf
2.6 设置 OpenVPN 开机自启(可选)
服务端的安装配置到上一节就完了,为了避免服务器重启后需要手动开启 OpenVPN,这里将其设置为开机自启动,请根据需要选择。
进入到 /etc/rc.d/
目录下,编辑 rc.local 文件,操作命令如下:
1 | cd /etc/rc.d/ |
在 rc.local 文件中新增下列内容
1 | OpenVPN start |
保存后,修改系统时区和时间,使打印到日志中的时间和本地计算机的时间同步,执行操作:
1 | timedatectl set-timezone Asia/Shanghai # 设置时区为上海 |
3. 安装配置 OpenVPN 的客户端
3.1 制作 client 端证书
client 端证书的制作过程和 server 端的相似,要注意 client 端制作证书的目录和 server 端并非同一个目录。我用来给client 端制作证书的目录:/root/EasyRSA-3.0.3
,给server 端则是:/etc/openvpn/EasyRSA-3.0.3
。
1 | cd /root/EasyRSA-3.0.3/ # 进入客户端证书制作目录 |
创建客户端证书,下面是创建成功的截图,client 的名字为 client_xushan,CommonName 为 puma_client_xushan
1 | ./easyrsa gen-req client_xushan nopass # 生成client端证书,需要输入client端的CommonName,可自行设置,可设置密码 |
创建成功后,会在pki/reqs/
目录下生成一个名为 client_xushan.req 的文件。
下一步就是在 server 端所在的目录里把上一步生成的 client_xushan.req 这个证书进行签约。
1 | cd /etc/openvpn/EasyRSA-3.0.3 |
客户端证书签约完成后,还需要进行最后一步的认证,认证之后就可以使用了,过程如下:
1 | ./easyrsa sign client client_xushan # 认证客户端证书 |
到这里,客户端的证书就生成完成了,我们需要把他们拷贝到一个文件夹下,方便后续的使用,如下:
1 | 把客户端需要的文件统一放到 /etc/openvpn/client 下 |
至此,client 目录下有3个文件ca.crt
、client_xushan.crt
、client_xushan.key
,将 client 目录下载到本地(windows)。
3.2 client 端安装
客户端一般是 windows,组件全选安装。安装后桌面会有OpenVPN GUI
的快捷方式。
3.3 制作 client 端配置文件
在本地(windows)创建 .ovpn的配置文件,名字随便起,这里我的是10.185.80.57.ovpn
,配置信息:
1 | client # 表示当前是客户端 |
根据配置文件,修改client_xushan.crt
文件名为client.crt
、修改client_xushan.key
文件名为client.key
保存后,放到刚下载的 client 文件夹下,把 client 文件夹改名成10.185.80.57
。将整个文件夹放在 OpenVPN的安装目录下的 config 文件夹下,启动客户端,选择当前配置,输入用户名和密码后会连接上(必须在 server 端中已授权),如图,连接成功
【可选配置】
如不想经常输入用户名和密码,可打开客户端ovpn配置文件,将auth-user-pass
改成auth-user-pass pass.txt
。同时在相同路径下新增一个名为pass.txt
的文本文件。
内容为两行,第一行为 VPN 用户名,第二行为密码。
重新运行 OpenVPN 客户端,即可不输入密码登录 VPN 了!
参考:
- 完整CentOS搭建OpenVPN服务环境图文教程.老左博客