由于公司内部系统比较多,而且这部分系统都是只能在公司内网访问,当人员出差或者不在办公室的时候就没办法访问,根据需求搭建vpn,来提供给员工访问,之前做的ipsec vpn,由于不是特别的稳定的,于是就选择使用openvpn。这里采用tls认证登录,根据每个员工进行建立账号。
环境准备
OpenVPN 是一个用于创建虚拟专用网络加密通道的软件包,OpenVPN 允许创建的 VPN 使用公开密钥、电子证书、或者用户名/密码来进行身份验证。它大量使用了 OpenSSL 加密库中的 SSLv3/TLSv1 协议函数库。
目前 OpenVPN 能在 Solaris、Linux、OpenBSD、FreeBSD、NetBSD、Mac OS X 与 Microsoft Windows 以及 Android 和 iOS 上运行,并包含了许多安全性的功能。它并不是一个基于 Web 的 VPN 软件,也不与 IPsec 及其他 VPN 软件包兼容。
OpenVPN 的技术核心是虚拟网卡,其次是 SSL 协议实现。
openvpn有两种模式
数据包(TUN模式)或数据帧(TAP模式)
- TUN模式: TUN模拟了网络层设备,操作第三层数据包比如IP数据封包,创建的是三层路由隧道
- TAP模式: 等同于一个以太网设备,它操作第二层数据包如以太网数据帧,创建一个以太网桥接,相对复杂
TAP 接口的好处在于,客户端可以获得 VPN 服务器所处子网的 IP(忽略物理上的区别,可以完全将客户端看做是与VPN服务器处于同一子网的另一台机器),而TUN 接口下所有的客户端则处于一个完全独立的子网内,与 VPN 服务器所在的子网没有关系,这种使用比较好,和公司的网络区分开,完全一个虚拟的网络。
安装环境
1 | cat /etc/redhat-release |
添加yum源
1 | wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo |
安装 openvpn和easy-rsa
1 | yum -y install openvpn easy-rsa lzop |
开启系统系统IP转发
1 | vi /etc/sysctl.conf |
证书准备
配置easy-rsa-3.0
使用 easy-rsa 生成需要的证书及相关文件,在这个阶段会产生一些 key 和证书:
- CA 根证书
- OpenVPN 服务器 ssl 证书
- Diffie-Hellman 算法用到的 key
复制文件
将 easy-rsa 脚本复制到 /etc/openvpn/,该脚本主要用来方便地生成 CA 证书和各种 key,也可以根据版本号来进行复制,只复制需要的部分。查看 easy-rsa 版本号:yum info easy-rsa
1 | cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa |
编辑vars 文件
vars 文件中定义的变量是用于生成证书的基本信息,没这个文件可新建,填写如下内容(变量值根据实际情况随便填写)
1 | pwd |
生成 CA 根证书
1 | #初始化 pki 相关目录 |
生成 OpenVPN 服务器证书和密钥
第一个参数 server 为证书名称,可以随便起,比如 ./easyrsa build-server-full openvpn nopass
1 | # ./easyrsa build-server-full server nopass |
生成 Diffie-Hellman 算法需要的密钥文件
1 | ./easyrsa gen-dh |
生成 tls-auth key
这个 key 主要用于防止 DoS 和 TLS 攻击,这一步其实是可选的,但为了安全还是生成一下,该文件在后面配置 open VPN 时会用到。
1 | openvpn --genkey --secret ta.key |
生成自动吊销用户证书
1 | ./easyrsa gen-crl |
注:crl.pem证书的不能移动,否则在后期删除用户认证的时候不生效,保持该目录即可
整理证书
1 | mkdir /etc/openvpn/server/certs && cd /etc/openvpn/server/certs/ |
openvpn server配置
创建 open VPN 日志目录
1 | mkdir -p /var/log/openvpn/ |
配置 OpenVPN
可以从 /usr/share/doc/openvpn-/sample/sample-config-files 复制一份 demo 到 /etc/openvpn/(openvpn 版本号查看:yum info openvpn
。)然后改改,或者从头开始创建一个新的配置文件
1 | cd /etc/openvpn/ |
注意:
- openvpn 2.4.8 版本启动协议需要使用udp,否则无法启动,启动的时候会提示
Options error: --explicit-exit-notify can only be used with --proto udp
,而且默认配置文件里面协议也是udp。udp协议有很多好处,可以参考说明 - push “redirect-gateway def1”: 参数,如果添加该参数,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过这里。但是在实际的应用中,我们期望的是只有需要进过vpn流量的时候才走vpn,其他的就正常走我们自己的网络就可以啦。所以在server.conf文件里面这行就需要注释掉。
防火墙相关配置
禁用 Centos7 默认的 firewalld和SELinux
1 | systemctl stop firewalld |
启用iptables
1 | systemctl enable iptables |
添加防火墙规则
1 | # 将 openvpn 的网络流量转发到公网:snat 规则 |
规则查看
1 | iptables -nvL -t nat |
启动 open VPN
1 | systemctl start openvpn@server |
验证
1 | netstat -antpu | grep openvpn |
路由器端口映射
由于公司只有一个公网Ip,所以只能在路由器上做端口映射,端口映射参考
openvpn client
OpenVPN客户端配置
要连接到 open VPN 服务端首先得需要一个客户端软件,在 Mac 下推荐使用 Tunnelblick。Tunnelblick 是一个开源、免费的 Mac 版 open VPN 客户端软件。如果Tunnelblick安装失败,不要用常见的方式进行卸载,要在Tunnelblick的官方下载一个Tunnelblick的卸载安装包进行Tunnelblick的卸载,否则不成功。
下面在服务端创建一个 open VPN 用户:其实创建用户的过程就是生成客户端 SSL 证书的过程,然后将其他相关的证书文件、key、.ovpn 文件(客户端配置文件)打包到一起供客户端使用。由于创建一个用户的过程比较繁琐,所以在此将整个过程写成了一个脚本 vpn_user.sh,然后定义一个客户端基础的模版文件 sample.ovpn。
首先创建一个客户端配置模板文件 sample.ovpn,该文件在脚本中会用到,放到 /etc/openvpn/client/ 目录,内容如下:
1 | cat sample.ovpn |
注: client.key 和 client.crt 替换为用户的key。
linux 客户端
需要在linux服务器上安装openvpn,安装完成以后增加配置文件即可。client.ovpn配置文件和上述mac 配置文件一致,下面贴出有区别后的结果。
1 | # 安装openvpn |
可以查看/tmp/openvpn.log日志输出的记录信息。里面包含了一些路由的添加
linux 下结果验证
1 | ifconfig tun0 |
windows下的client.ovpn配置文件
windows 客户端在官方下载对应的系统的客户端进行安装,安装完成后会在当前的用户目录下面有一个C:\Users\username\OpenVPN\config\
的路径,吧在服务器上生成的username.zip解压到该目录下面即可。然后点击链接。windows 客户端的配置文件如下,和上面的一样。
1 | cat sample.ovpn |
注释:
- auth-user-pass: 该参数是注释掉的,如果开启该参数,任意的账户和密码都可以链接vpn,非常的不安全,如果客户端开启这个参数,服务器端一定要启用用户认证。用户认证参考
创建 open VPN 用户脚本
1 | cat vpn_user.sh |
执行上面脚本创建一个用户:sh vpn_user.sh
1 | . |
删除一个 OpenVPN 用户
上面介绍了如何添加一个用户,如果公司员工离职了或者其他原因,想删除对应用户 OpenVPN 的使用权,只要吊销对应用户的 SSL 证书即可。因为OpenVPN 的客户端和服务端的认证主要通过 SSL 证书进行双向认证。
编辑 OpenVPN 服务端配置 server.conf 添加如下配置:
1 | crl-verify /etc/openvpn/easy-rsa/3.0.6/pki/crl.pem |
吊销用户证书
1 | cd /etc/openvpn/easy-rsa/3.0.6/ |
重启 OpenVPN 服务端使其生效
1 | systemctl restart openvpn@server |
一键删除用户
1 | cat del_vpn_user.sh |
上述配置完成了用户流量的分配,必要的地址都vpn,其余的走正常的自己的网络。不会全部走vpn。
引用: https://www.yeboyzq.com/linux/fuwuqipeizhi/989.html
https://qhh.me/2019/06/16/Cenos7-%E4%B8%8B%E6%90%AD%E5%BB%BA-OpenVPN-%E8%BF%87%E7%A8%8B%E8%AE%B0%E5%BD%95/