为什么要搭建vpn
- 单独购买vpn服务器的成本比较高,可以在公司现有的服务器上搭建vpn服务
- 可以在任何有网络的地方访问到公司资源,比使用跳板机和高端口访问要安全
- 爱折腾的小伙伴可以搭建vpn来满足自己的技术需求
选择
- vpn种类有这么多,有PPTP协议,有L2TP协议, 有OpenVPN 如何进行选择?
首先先看下对比:https://cn.giganews.com/vyprvpn/compare-vpn-protocols.html - 看了上面的对比之后,选择了OpenVPN做为首选的vpn协议,还有一个最主要的原因是安装方法比较简单。
下面开始介绍如何一步一步搭建vpn (centos版本):
centos安装服务端
- 我的服务器是centos 6.8版本的,亲测6.4无法安装openvpn,亲测5不能运行安装脚本
- 服务器并且拥有固定的内网ip, 和一个外网ip
- 然后在网上找了一大坨安装文档,第一感觉是太复杂,后面发现在github上有一键安装的脚本:https://github.com/Nyr/openvpn-install
- 果断clone之,然后把shell放到服务器上进行执行,(1)输入ip地址:由于服务器上只能获得到内网ip,所以这里填写内网ip,(2)输入端口,有默认端口:1194(首先确保该端口已经允许访问,我安装的时候因为1194未开放,所以导致客户端无法连接vpn)(3)如果有外网ip,并且和内网ip不一致,程序会提示要你输入外网ip,输入回车就可以了,否则没有这一步。
- 安装完成以后会生成一个.ovpn结尾的文件,这个文件是给客户端使用的。
- 看一下1194端口是否被启动(netstat -anp | grep 1194),如果启动了就证明openvpn的服务端顺利启动了,接下来就是安装客户端了。
安装客户端
- mac用户请自行下载Tunnerblick,安装完成之后,将服务端生成的rrjf.ovpn文件导入(此文件名是我自己设定的)。
- windows用户请下载OpenVPN,安装完成之后将rrjf.ovpn复制到OpenVPN的安装目录的config中,例如:“C:\Program Files\OpenVPN\config”。导入完成之后,以“管理员身份运行”即可。
- 启动openvpn的客户端进行连接(无法连接原因如下:1、udp方式不允许,可修改为tcp方式 2、上面的默认端口未开放,更换开放的端口)
- 顺利的话就应该可以通过内网ip进行访问服务器了。
设置用户名/密码登录即User/Pass登录
- 修改openvpn的配置文件,即安装目录里面的server.conf,在配置文件里面添加如下几行:
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
client-cert-not-required
username-as-common-name
script-security 3
- 添加完毕之后请重启openvpn服务,sercice openvpn restart (不同的centos系统,命令不一样,具体请自行百度)
- 添加验证脚本checkpsw.sh,下载后添加到步骤一第一行你设定的目录中。注意修改PASSFILE、LOG_FILE这两个参数,PASSFILE路径保持和server.conf在同一级目录即可,LOG_FILE这个参数推荐使用默认参数
- chmod +x /etc/openvpn/checkpsw.sh,# 给脚本添加执行权限
- mkdir -p /var/log/openvpn touch /var/log/openvpn/openvpn-password.log # 创建目录以及日志文件,用来记录用户名密码认证产生的日志
- echo “test 123456” >>/etc/openvpn/psw-file chmod 400 /etc/openvpn/psw-file # 创建用户名密码文件,并修改权限
- 修改客户端文件 注释掉cert和key(客户端不需要crt和key文件,但是需要服务器的CA证书);cert eva.crt ;key eva.key(如果在客户端配置中没有找到则不用修改)在最后一行添加如下内容 auth-user-pass
过程中遇到的坑
- 使用client去连接server端发现能够连上vpn,但是连不上internet。是因为此脚本默认的dns是读取服务器上/etc/resolv.conf的内容,如果安装完毕之后不能上网,自行修改server.conf为如下即可 (push “dhcp-option DNS 8.8.8.8” push “dhcp-option DNS 8.8.4.4”)。
- udp方式无法连接,采用的tcp方式。原因未知,可能是防火墙问题
- 日志写入问题 checkpsw.sh 脚本是用来读取用户名和密码以及写入登录日志,当一切都搞定之后发现无法写入日志,修改权限即可(因为不知道当前操作用户,所以赋予了最高权限)