OpenVpn 搭建教程
参考下面文档 centos7 搭建openvpn
环境:
KVM虚拟机
操作系统:centos7.4
openvpn版本:2.4
easyrsa版本:3.0
VPN客户端内网地址段:10.0.80.0/24
公司服务器内网地址网段:10.0.0.0/24
note: RSA3.0的版本和2.0的使用有差别,注意区分
步骤:
一.获取新版本yum源
1 | [root@localhost ~]$wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm |
二.安装yum源
1 | [root@localhost ~]$rpm -Uvh epel-release-7-11.noarch.rpm |
三.安装openvpn和easy-rsa
1 | [root@localhost ~]$ yum install easy-rsa openssh-server lzo openssl openssl-devel openvpn NetworkManager-openvpn openvpn-auth-ldap |
四.拷贝server.conf配置文件到/etc/openvpn
1 | [root@localhost ~]$cp /usr/share/doc/openvpn-2.4.6/sample/sample-config-files/server.conf /etc/openvpn |
五.拷贝easy-rsa程序到/etc/openvpn
1 | [root@localhost openvpn]$cp -R /usr/share/easy-rsa/ /etc/openvpn |
六.easyrsa初始化私钥..easyrsa3.0的配置步骤和老版本2.0比有点变化.不需要定义var变量.
1 | [root@localhost 3.0.3]$./easyrsa init-pki |
1 | [root@localhost 3.0.3]$./easyrsa build-ca nopass |
七.创建服务端秘钥.openvpn表示openvpn服务器的服务器名称.nopass选项说明不需要密码.
1 | [root@localhost 3.0.3]$./easyrsa build-server-full openvpn nopass |
八.生成dh密码算法
1 | [root@localhost 3.0.3]$./easyrsa gen-dh |
九.拷贝生成的秘钥到openvpn的配置文件夹下
1 | [root@localhost 3.0.3]$cd pki |
十.修改server.conf配置文件
关于配置文件的说明可以参考:https://my.oschina.net/liucao/blog/863112
1 | [root@openvpn ~]$sed -e 's/^[;#].*//g' /etc/openvpn/server.conf | sed '/^$/d' |
特别注意push “redirect-gateway”选项和duplicate-cn选项..下面来重点分析一下
1.redirect-gateway参数表示将推送一条指向本机的默认网关到客户端.这就意味着只要客户端拨了VPN,不管他访问什么,只要是访问互联网就走VPN通道.先到VPN服务器,由你VPN服务器转发请求再返回给你客户端.这样一来访问互联网速度会受很大影响.
注释该参数,表示不推送默认网关给客户端.这样客户端只访问公司内网服务器才走VPN通道,而访问互联网仍然是走本地网络.在我这个例子中.push “route 10.0.0.0 255.255.0.0”表示推送给客户端的公司内网服务器网段.当客户端访问10.0.0.0/16网络时走VPN通道
2.duplicate-cn:这个选项表示可以多人同时共用一个客户端账号.如果注释此选项,则同一个账号,同时只能一个人使用.如果有第二个人用同样的账户登录,会将之前的使用该账号登录的人挤下去.这一点后续还会讲到
十一.关闭centos7自带的firewalld.然后保存iptables设置,开启自起
1 | [root@openvpn ~]$systemctl stop firewalld.service |
十二.修改防火墙.将下列保存成脚本文件,然后执行
1 | #!/bin/bash |
上面的Iptables规则过于严格.如果你的服务器Iptables不需要做任何限制.那么只需要添加一条iptables的nat规则就可以了:
1 iptables -t nat -A POSTROUTING -s 10.0.80.0/24 -o eth0 -j MASQUERADE
十三.开启OpenVPN服务器的网卡转发功能*
1 | echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf |
十四.启动openvpn
1 | # sudo systemctl -f enable openvpn@server.service |
note: 这个openvpn@server格式的server表示Openvpn使用erver.conf配置文件启动
十五.创建一个客户端秘钥.dwdtech是客户端名称,nopass选项表示不需要密码
1 | [root@localhost 3.0.3]$./easyrsa build-client-full dwdtech nopass |
十六.配置客户端的配置文件
1.创建客户端配置文件夹.拷贝客户端秘钥
1 | [root@openvpn 3]$ mkdir ~/vpn-client |
2.创建客户端配置文件
1 | [root@openvpn 3]$cd ~/vpn-client/ |
3.打包配置文件.下载到本地,并且拷贝到客户端
1 | [root@openvpn ~]$tar -cvf vpnclient.tar vpn-client |
十七.修改出口设备的NAT转发
在出口设备上增加一条NAT转发规则.注意是UDP协议转发.转发1194端口到Openvpn服务器的1194端口
至此配置完成..接下来使用openvpn客户端拨号
推荐VPN客户端软件 Windows: OpenVPN && Mac:Tunnelblick
如果是windows,安装完以后把服务器上配置的客户端秘钥,配置文件拷贝到openvpn安装路径的config路径下
如果是MAC,安装完成后把ovpn配置文件拖拽到Tunnelblick软件界面即可
第二部分: 多账号使用Openvpn
一个比较懒散的做法是像刚才的教程一样,所有人都使用同一个秘钥账号连接Openvpn.但是公司里如果所有人都使用一个秘钥的话,人员离职后,仍然可以使用该秘钥通过Openvpn访问公司内网,非常不安全.
而此时重新创建秘钥则又”前一发动全身”,意味着每个人都要更新VPN秘钥.非常复杂.
此时就需要对于每个用户创建并注销单独的秘钥.接下来的教程演示如何实现这一功能
一.创建多个客户端账户
创建客户端账户步骤和刚才教程一模一样
1.修改server.conf配置文件,注释duplicate-cn参数
1 | [root@openvpn openvpn]$vim server.conf |
Note: 注释这个参数就表示每个客户端秘钥账户就只能同时一个人使用,如果多个人同时同一个账户会挤掉前面已经连接上的vpn的用户:
下面是故障出现时,服务器Openvpn日志的报错:
1 | Sat Jun 16 01:08:56 2018 10.0.99.1:29167 [dwdtech] Peer Connection Initiated with |
2.创建另外一个客户端秘钥
1 | [root@openvpn 3]$./easyrsa build-client-full test nopass |
此时就创建了多个客户端秘钥
二.注销客户端账户
这里以刚才的test账户为例
1.删除该客户端秘钥
1 | [root@openvpn 3]$./easyrsa revoke test |
2.按照提示,生成crl文件
1 | [root@openvpn 3]$./easyrsa gen-crl |
3.复制crl.pem文件到OpenVpn根目录下
1 | [root@openvpn 3]$cp pki/crl.pem /etc/openvpn/ |
4.添加配置到server.conf配置文件,开启crl验证功能,并且制定crl文件路径.crl文件可以用绝对路径也可以用相对路径
添加下面这一行到server.conf配置文件
1 | [root@openvpn openvpn]$tail -1 server.conf |
使用下面命令可以检查crl.pem文件查看被注销的账户信息
1 | [root@openvpn openvpn]$openssl crl -in /etc/openvpn/crl.pem -text -noout |
在pki目录下.有一个index.txt文件.此文件列举了活跃的和已经注销的客户端证书信息:
1 | cd /etc/openvpn/easy-rsa/3/pki |
第一个字母R表示已经注销的账户.
此时,test客户端虽然有秘钥,但是无法拨入Openvpn.服务端的openvpn.log日志记录了这一行为:
1 | Tue Jul 3 02:23:47 2018 10.0.99.1:23273 VERIFY ERROR: depth=0, error=certificate revoked: CN=test |
后续删除其他客户端账户,需要重复上面1-3步骤.
note:我在这里踩过很深的坑.如果需要注销多个账户时,会生成新的crl.pem文件.此时直接把新的crl.pem文件覆盖老的就可以,其他不用管.
请看我的stackoverflow的提问:how to revoke multiple OpenVPN clients Certificate
第三部分.Openvpn加速
这篇文档详细解释了为什么Openvpn拨号之后宽带速度很慢的原因
https://www.lowendtalk.com/discussion/40099/why-openvpn-is-so-slow-cool-story
配置步骤:
1.修改内核缓冲区参数
1 | [root@openvpn ~]$vim /etc/sysctl.conf |
2.修改Openvpn的配置文件,添加下面2个参数
1 | [root@openvpn ~]$tail -2 /etc/openvpn/server.conf |
如果客户端文件已经下发给用户,无法手动修改,则继续在server.conf添加下面2个参数,将配置推送给客户端
push “sndbuf 393216”
push “rcvbuf 393216”
3.重启openvpn
1 | [root@openvpn openvpn]$systemctl restart openvpn@server.service |
4.重新编辑客户端的ovpn配置文件,添加下面2个参数
1 | [root@openvpn ~]$tail -2 vpn-client/client.ovpn |
5.将客户端配置文件重新下载到本地,拷贝到openvpn安装目录的conf目录下.重新拨号
第四部分 批量创建openvpn客户端账号
每次手动创建客户端账号的工作太繁琐.于是写了一个脚本来进行批量化创建工作
脚本功能如下:
1.使用-f参数从文件中批量读取账户进行创建,也可以使用-u参数指定要创建的账户.
2.判断账户是否已经存在
3.创建完客户端证书和秘钥文件后,会自动创建客户端配置文件.
4.打包客户端所需要的文件到/root目录下.
如果需要加入注销客户端账号的功能可以自行修改脚本,或者联系本人
1 | #!/bin/bash |
例如从文件中批量创建账号:
1 | [root@openvpn ~]$./createAccount.bak.sh -f name.txt |