CentOS7搭建OpenVPN
[toc]
**文:铁乐与猫 **
2017年11月份
环境
安装了虚拟机,尝试搭建OpenVPN。
- 公网IP:X.x.x.x
- 内网IP:172.16.1.218
- 操作系统:centos7.3 64位
- openvpn 2.4.4
安装
第一步、安装openvpn及所需软件
安装EPEL仓库
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm rpm -Uvh epel-release-6-8.noarch.rpm
安装openvpn
yum install openvpn
上图中可以看出有可能第一次我尝试编译安装时没有将依赖所需的lz4包装上会有点问题。 另外安装上epel仓库后,获取到的openvpn包也比较新呐。
- 安装openvpn最新的easy-rsa
该包用来制作ca证书,服务端证书,客户端证书。 最新的为easy-rsa3。
将解压得到的文件夹easy-rsa-master重命名为easy-rsa
mv easy-rsa-mater/ easy-rsa/ 然后将easy-ras文件夹复制到/etc/openvpn/目录下 cp -R easy-rsa/ /etc/openvpn/
第二步、编辑vars文件,根据自己环境配置
进入
/etc/openvpn/easy-rsa/easyrsa3
目录cd /etc/openvpn/easy-rsa/easyrsa3/
复制
vars.example
为varscp vars.example vars
修改下面字段
命令:vim vars,然后修改,最后wq保存
//以下字段根据自己实际情况更改,这些信息前面是有#注释的,去掉#号
set_var EASYRSA_REQ_COUNTRY “CN” #国家 set_var EASYRSA_REQ_PROVINCE “GuangDong” #省份 set_var EASYRSA_REQ_CITY “GuangZhou” #城市 set_var EASYRSA_REQ_ORG “tielemao” #非盈利组织,此处可填公司之类 set_var EASYRSA_REQ_EMAIL “wwz@tielemao.com” #邮箱地址 set_var EASYRSA_REQ_OU “My OpenVPN” #组织单元
这个vars文件似乎也不是很重要,不过填上一些信息也无不可?
第三步、创建服务端证书及key
进入
/etc/openvpn/easy-rsa/easyrsa3/
目录初始化./easyrsa init-pki
[root@yunwei_OpenVPN easyrsa3]# ./easyrsa init-pki Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /etc/openvpn/easy-rsa/easyrsa3/pki
创建根证书
./easyrsa build-ca
如下图:
注意:在上述部分需要输入PEM密码 PEM pass phrase,输入两次,此密码必须记住,不然以后不能为证书签名。 这里密码测试的时候我输入了比较好记的ABCabc123。 还需要输入common name 通用名,自定义一个好记的。 生成的根证书文件为:`/etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt`
- 创建服务器端证书
./easyrsa gen-req server nopass
如下图:
同样起个好记的通用名字,不过就不能和前面根证书的一样。 生成的文件有两个,注意这个时候这两个文件还不是服务端证书:
req: /etc/openvpn/easy-rsa/easyrsa3/pki/reqs/server.req
key: /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key
- 签约服务端证书:
./easyrsa sign server server
- 注,这里前一个server是命令表示注册的是server端,后一个server是可以自行定义的名字, 但是要和前面命令起的名字一致,我这里一致都是server。 如下图:
要输入yes确认才能继续操作下去, 输入之前创建根证书的时候输入的PEM密码,如果忘记了就得从创建根证书重新做起了。 最终生成服务端的证书,crt格式: /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt
- 创建Diffie-Hellman,确保key穿越不安全网络的命令:
./easyrsa gen-dh
如下图:
- 生成dh.pem文件:
/etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem
第四步、创建客户端证书
- 新建client文件夹
进入root目录新建client文件夹,文件夹可随意命名,然后拷贝前面解压得到的easy-ras文件夹到client文件夹,进入下列目录:
cd /root/
mkdir client && cd client
cp -R /root/easy-rsa/ client/
注:这里我是将之前下载的master.zip解压和命令了放置在root下了,所以路径是/root/easy-rsa
。
实验的时候要根据自己的实际情况操作。
cd client/easy-rsa/easyrsa3/
初始化
./easyrsa init-pki
注:其实和之前创建服务端证书前的操作无二,不同的是这次是将easy-rsa的目录放用户家目录下。 其实理解原理后,跳过这两步,也可以考虑反复只用/etc/openvpn/easy-rsa
这个目录去操作。
创建客户端key及生成证书(记住和之前的操作一样生成时是自己输入的密码)
./easyrsa gen-req client-wwz //名字自己定义
[root@yunwei_OpenVPN easyrsa3]# ./easyrsa gen-req client-wwz Generating a 2048 bit RSA private key ...........................+++...............................................................................+++ writing new private key to '/root/client/easy-rsa/easyrsa3/pki/private/client-wwz.key.fXcHCDk8k1' Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
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.
Common Name (eg: your user, host, or server name) [client-wwz]:
Keypair and certificate request completed. Your files are: req: /root/client/easy-rsa/easyrsa3/pki/reqs/client-wwz.req key: /root/client/easy-rsa/easyrsa3/pki/private/client-wwz.key
将生成的client-wwz.req导入然后签约客户端证书
返回到/etc/openvpn/easy-rsa/easyrsa3/
cd /etc/openvpn/easy-rsa/easyrsa3/
导入req
./root/client/easy-rsa/easyrsa3/pki/reqs/client-wwz.req client-wwz
[root@yunwei_OpenVPN easyrsa3]# cd /etc/openvpn/easy-rsa/easyrsa3/
[root@yunwei_OpenVPN easyrsa3]# pwd
/etc/openvpn/easy-rsa/easyrsa3
[root@yunwei_OpenVPN easyrsa3]# ./easyrsa import-req /root/client/easy-rsa/easyrsa3/pki/reqs/client-wwz.req client-wwz
Note: using Easy-RSA configuration from: ./vars
The request has been successfully imported with a short name of: client-wwz
## You may now use this name to perform signing operations on this request.
签约证书
./easyrsa sign client client-wwz
//这里生成client所以必须为client,client-wwz要与之前导入名字一致
上面签约证书跟server类似,就不截图了,但是期间还是要输入CA的密码
------
[root@yunwei_OpenVPN easyrsa3]# ./easyrsa sign client client-wwz
Note: using Easy-RSA configuration from: ./vars
You are about to sign the following certificate.
Please check over the details shown below for accuracy. Note that this request
has not been cryptographically verified. Please be sure it came from a trusted
source or that you have verified the request checksum with the sender.
Request subject, to be signed as a client certificate for 3650 days:
subject=
commonName = client-wwz
Type the word 'yes' to continue, or any other input to abort.
Confirm request details: yes
Using configuration from ./openssl-easyrsa.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client-wwz'
Certificate is to be certified until Nov 9 07:10:14 2027 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
## Certificate created at: /etc/openvpn/easy-rsa/easyrsa3/pki/issued/client-wwz.crt
客户端的证书client-wwz.crt路径在/etc/openvpn/easy-rsa/easyrsa3/pki/issued/client-wwz.crt
现在梳理一下上面都生成了些什么东西:
服务端:
etc/openvpn/easy-rsa/
文件夹/etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn/easy-rsa/easyrsa3/pki/reqs/server.req /etc/openvpn/easy-rsa/easyrsa3/pki/reqs/client.req /etc/openvpn/easy-rsa/easyrsa3/pki/private/ca.key /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn/easy-rsa/easyrsa3/pki/issued/client-ww.crt /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem
重要的是
pki/issued
目录下的服务端和客户端这两个证书客户端:
root/client/easy-rsa
文件夹/root/client/easy-rsa/easyrsa3/pki/private/clinet-wwz.key /root/client/easy-rsa/easyrsa3/pki/reqs/client.req //这个文件被我们导入到了服务端文件所以那里也有
感觉这里都不太重要了,其实是没必要特意在root家目录下再弄这一出。 下次统一用
/etc/openvpn/easy-rsa/easyrsa3
下操作创建客户端证书等也可。
第五步、拷贝生成的证书放置回openvpn目录
- 拷贝证书等文件放入到相应位置。
将下列文件放到/etc/openvpn/
目录:
cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /etc/openvpn
cp /etc/openvpn/easy-rsa/easyrsa3/pki/private/server.key /etc/openvpn
cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/server.crt /etc/openvpn
cp /etc/openvpn/easy-rsa/easyrsa3/pki/dh.pem /etc/openvpn
这样就将上述四个文件放入到了/etc/openvpn目录下
将下列文件放到/root/client 目录下:
cp /etc/openvpn/easy-rsa/easyrsa3/pki/ca.crt /root/client
cp /etc/openvpn/easy-rsa/easyrsa3/pki/issued/client-wwz.crt /root/client
cp /root/client/easy-rsa/easyrsa3/pki/private/client-wwz.key /root/client
将上述三个文件复制到/root/client目录。
检验:
[root@yunwei_OpenVPN easyrsa3]# ls /etc/openvpn/ ca.crt dh.pem easy-rsa master.zip server.crt server.key
[root@yunwei_OpenVPN easyrsa3]# ls /root/client/ ca.crt client-wwz.crt client-wwz.key easy-rsa
第六步、编写服务端配置文件
文件都准备好后,就可以进行编写服务端配置文件了。这就是磨刀不误砍柴工,万事俱备,只欠东风!
由于我们是yum安装的openvpn。 所以相应在/usr/share/doc/
下会有对应openvpn版本/sample/sample-config-files
目录下会有一个server.conf
文件, 将这个文件复制到/etc/openvpn
: cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/server.conf /etc/openvpn/
然后修改配置vi server.conf
如下:
local 172.16.1.128 # 填自己openvpn服务器的 IP,默认侦听服务器上的所有ip
port 1194 # 侦听端口,默认1194
proto udp # 端口协议,默认udp,也可以开启tcp方便映射转发。
dev tun # 默认创建一个路由IP隧道
ca /etc/openvpn/ca.crt # 根证书
cert /etc/openvpn/server.crt # 证书
key /etc/openvpn/server.key # 私钥文件/重要保密
dh /etc/openvpn/dh.pem
server 10.66.72.0 255.255.255.0
# 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。
# 服务器自身会使用10.66.72.1这个ip。
ifconfig-pool-persist ipp.txt
# 指定用于记录客户端和虚拟IP地址的关联关系的文件。
# 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
push “route 192.168.0.0 255.255.0.0”
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。
# (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网)
# 记住,这些私有子网也要将OpenVPN客户端的地址池(10.66.72.0/255.255.255.0)反馈回OpenVPN服务器。
push "redirect-gateway def1 bypass-dhcp"
# 启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。
# (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)
# 这个指令其实挺影响客户端处的网络的,比如我就在vpn上阿里云的服务器后,本地浏览网络会出没法访问外网,有必要到阿里云vpn服务器上注释掉此指令,而且这样也会导致云服务器流量激增,并不利。
push “dhcp-option DNS 119.29.29.29″
# 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。
# 实际上可用于推送内网dns或阿里内网dns等。
keepalive 10 120
# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。
# 默认每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。比较频繁,建议改成30 240?
comp-lzo
# 在VPN连接上启用压缩。如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。
max-clients 100 #默认最大客户端连接100,为安全可限到1或2。
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun
status openvpn-status.log # 状态日志
# 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。
## verb 3
还有许多详细配置,可查看官网说明。
第七步、启动openvpn服务
VMware虚拟机可能还需加载tun内核模块并启用转发。
加载tun内核模块并启用转发。 加载tun内核模块以便于openvpn生成虚拟网卡。
- [root@yunwei_OpenVPN openvpn]# modprobe tun 检验加载成功没有 [root@yunwei_OpenVPN openvpn]# lsmod | grep tun tun 31621 0 启用转发 [root@yunwei_OpenVPN openvpn]# echo 1 > /proc/sys/net/ipv4/ip_forward 或直接vim /proc/sys/net/ipv4/ip_forward 修改值为1 检验 [root@yunwei_OpenVPN openvpn]# cat /proc/sys/net/ipv4/ip_forward 1 [root@yunwei_OpenVPN openvpn]# locate tun.ko /usr/lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/net/tun.ko /usr/lib/modules/3.10.0-693.5.2.el7.x86_64/kernel/drivers/net/tun.ko.xz [root@yunwei_OpenVPN openvpn]# openvpn --config /etc/openvpn/server.conf (注:这种命令还不是在后台模式运行的) Thu Nov 16 17:19:39 2017 OpenVPN 2.4.4 x86_64-redhat-linux-gnu [Fedora EPEL patched][SSL (OpenSSL)] [LZO][LZ4] [EPOLL][PKCS11] [MH/PKTINFO][AEAD] built on Sep 26 2017 Thu Nov 16 17:19:39 2017 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06 Thu Nov 16 17:19:39 2017 Diffie-Hellman initialized with 2048 bit key Thu Nov 16 17:19:39 2017 Failed to extract curve from certificate (UNDEF), using secp384r1 instead. Thu Nov 16 17:19:39 2017 ECDH curve secp384r1 added Thu Nov 16 17:19:39 2017 ROUTE_GATEWAY 172.16.1.2/255.255.255.0 IFACE=ens33 HWADDR=00:0c:29:96:0a:fe Thu Nov 16 17:19:39 2017 TUN/TAP device tun0 opened Thu Nov 16 17:19:39 2017 TUN/TAP TX queue length set to 100 Thu Nov 16 17:19:39 2017 do_ifconfig, tt->did_ifconfig_ipv6_setup=0 Thu Nov 16 17:19:39 2017 /sbin/ip link set dev tun0 up mtu 1500 Thu Nov 16 17:19:39 2017 /sbin/ip addr add dev tun0 local 10.66.72.1 peer 10.66.72.2 Thu Nov 16 17:19:39 2017 /sbin/ip route add 10.66.72.0/24 via 10.66.72.2 Thu Nov 16 17:19:39 2017 Could not determine IPv4/IPv6 protocol. Using AF_INET Thu Nov 16 17:19:39 2017 Socket Buffers: R=[212992->212992] S=[212992->212992] Thu Nov 16 17:19:39 2017 UDPv4 link local (bound): [AF_INET][undef]:1194 Thu Nov 16 17:19:39 2017 UDPv4 link remote: [AF_UNSPEC] Thu Nov 16 17:19:39 2017 MULTI: multi_init called, r=256 v=256 Thu Nov 16 17:19:39 2017 IFCONFIG POOL: base=10.66.72.4 size=62, ipv6=0 Thu Nov 16 17:19:39 2017 IFCONFIG POOL LIST Thu Nov 16 17:19:39 2017 Initialization Sequence Completed
敲 openvpn --daemon --config /etc/openvpn/server.conf
运行则是在后台模式。 最后我还是以 systemctl start openvpn
运行的。 因为我是yum安装的,使用systemctl来启动和停止openvpn挺方便的。
第八步、下载windows openvpn客户端,并进行配置。
用sftp之类将在openvpn服务器生成的客户端证书和key下载到客户端电脑。
ca.crt client-wwz.crt client-wwz.key //这三个文件
去官网下载openvpn客户端进行安装,然后安装目录找到
simple-config
D:\Program Files\OpenVPN\sample-config\client.ovpn
将client.ovpn 复制到D:\Program Files\OpenVPN\ToVMware
(文件夹可以自己新建定义)下,根据自己实际安装情况选择. 将下载到的三个文件放入D:\Program Files\OpenVPN\ToVMware
下然后编辑client.ovpn
配置文件:
编辑配置文件:
client dev tun proto udp remote 172.16.1.128 1194 //主要这里修改成openvpn服务器的ip resolv-retry infinite nobind persist-key persist-tun ca ca.crt // 这里需要证书,之前和配置文件放同一文件夹下了,理论上不需要敲绝对路径也能找到, // 然而后面发现客户端导入配置文件后目录又是在另外路径下,以致还是要敲绝对路径。 cert client-wwz.crt key client-wwz.key comp-lzo verb 3
简单应用的话我们只需要以上项目每行一个,复杂些应用的话可以参照官方具体配置文档。
补充:
正确的配置证书路径为:
ca D:\\Programs\\OpenVPN\\ToVMware\\ca.crt cert D:\\Programs\\OpenVPN\\ToVMware\\client-wwz.crt key D:\\Programs\\OpenVPN\\ToVMware\\client-wwz.key
打开openvpn客户端,右键弹出菜单,选择导入配置文件
选中之前编辑好的配置文件,点击连接
结果报错,查看错误日志得知
Options error: --ca fails with 'ca.crt': No such file or directory
Options error: --cert fails with 'client.crt': No such file or directory
Thu Dec 07 16:06:09 2017 WARNING: cannot stat file 'client.key': 系统找不到指定的文件。 (errno=2)
Options error: --key fails with 'client.key': No such file or directory
Options error: Please correct these errors.
Use --help for more information.
原来这些认证文件还是得指明绝对路径阿…… 修改配置文件(注意,运行时修改要直接在客户端中选择Edit Config) (因为导入之后,它实际的路径是C:\Users\Administrator\OpenVPN\confing\client\client.ovpn
)
ca D:\Programs\OpenVPN\ToVMware\ca.crt
cert D:\Programs\OpenVPN\ToVMware\client-wwz.crt
key D:\Programs\OpenVPN\ToVMware\client-wwz.key
继续报错,还好这次是报我路径写错了
Options warning: Bad backslash ('\') usage in client.ovpn:89: remember that backslashes are treated as shell-escapes and if you need to pass backslash characters as part of a Windows filename, you should use double backslashes such as "c:\\openvpn\\static.key"
Use --help for more information.
看来我要写成
ca D:\\Programs\\OpenVPN\\ToVMware\\ca.crt
cert D:\\Programs\\OpenVPN\\ToVMware\\client-wwz.crt
key D:\\Programs\\OpenVPN\\ToVMware\\client-wwz.key
这次总算是对了。虽然也有不指明路径而是将证书内容一并合并到配置文件上的做法,但这样一来就不算安全了。
这里还好我还记得是输了啥密码的,果然这个密码是要记住的呢!! 此密码也可以点选save password,这样在常用的电脑上不用每次都输密码,不过不记住也更安全。 输完之后连接成功(好吧,其实我还多了步操作,开放openvpn服务器中的防火墙!systemctl stop firewalld
, 当然生产环境不是关闭防火墙,而是设置开放对openvpn端口的规则)
windows版本的客户端连接Linux的openvpn服务端是搞懂了,再进行测试linux客户端。 ### 第九步 Linux openvpn客户端连接服务端测试
做为测试,这次我在centos6.9上安装openvpn客户端连接centos7.3的openvpn服务端。 同样使用yum install openvpn
省事,后面主要是修改运行配置文件指定为client端。
- 在客户端openvpn主目录
/etc/openvpn
下新建config目录, 同样将服务端的ca.crt
、client-wwz.crt
和client-wwz.key
放置进去。
复制一份客户端配置范例进config目录,这里要注意的是,之前windows用的配置文件后缀名为.ovpn
,到了linux用的就是.conf
了!
cp /usr/share/doc/openvpn-2.4.4/sample/sample-config-files/client.conf /etc/openvpn/config/client.conf
编辑配置文件:
client # 指定当前VPN是客户端 dev tun # 必须与服务器端的保持一致 proto udp # 必须与服务器端的保持一致 remote 172.16.1.128 1194 # 指定连接的远程服务器的实际IP地址和端口号
resolv-retry infinite
断线自动重新连接,在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
nobind # 不绑定特定的本地端口号 persist-key persist-tun
ca /etc/openvpn/config/ca.crt # 指定CA证书的文件路径 cert /etc/openvpn/config/client-wwz.crt # 指定当前客户端的证书文件路径 key /etc/openvpn/config/client-wwz.key # 指定当前客户端的私钥文件路径
ns-cert-type server # 指定采用服务器校验方式
tls-auth ta.key 1
#如果服务器设置了防御DoS等攻击的ta.key,则必须每个客户端开启;如果未设置,则注释掉这一行;
comp-lzo #与服务器保持一致 verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
注意:
- 配置文件中的文件路径涉及到相对路径的,均以启动OpenVPN时的所在目录为准。 由于在配置文件中设置的文件路径都是相对config目录的路径,因此也只能在config目录下才能正常启动OpenVPN。如果想在任何地方都能使用上述命令启动OpenVPN,建议将配置文件与文件路径相关的部分全部改为绝对路径。
- OpenVPN服务器所在计算机必须允许OpenVPN通过防火墙,你可以禁用掉防火墙,或者将OpenVPN设为可信程序,或者开放1194端口。
-A INPUT -p udp --dport 1194 -j ACCEPT
- 启动服务器和客户端都需要一定的权限,建议测试学习时用root账户或sudo命令进行启动。
运行openvpn客户端:
openvpn --daemon --cd 配置文件路径 --config client.ovpn(配置文件名称) --log-append /var/log/openvpn/openvpn.log(日志路径)
查看日志成功连接没有: tail -f /var/log/openvpn/openvpn.log
到此已经成功了。
设置开机自动连接
vim /etc/rc.local
openvpn --daemon --cd 配置文件路径 --config client.ovpn(配置文件名称) --log-append /var/log/openvpn.log(日志路径)
加入到
/etc/rc.local
配置文件里。
openvpn的搭建和简单使用本次就介绍到这里。
2018-9-7 重新修改成md文件
end