本文通过开源的SSL VPN解决方案OpenVPN部署实现员工远程访问企业内网。
SSL是一个安全协议,为基于TCP的应用层协议提供安全连接,如SSL可以为HTTP协议提供安全连接。而OpenVPN则是一款优秀的SSL VPN解决方案,这里我们使用社区版(社区版除去没有付费的商业特性支持,功能上和商业版一致),因为商业版超过2个以上并发客户端需要额外购买授权。
网络规划
该测试环境使用三台虚拟机分别模拟出VPN服务器(CentOS 7)、外网客户端(win7)、内网机器(CentOS 7)。
-
VPN服务器:192.168.137.141/24(对外的网卡ens33,客户端可以访问到的IP),172.31.1.100/24(连接内网的网卡ens37)。
-
外网client:192.168.137.1/24。
-
内网机器:172.31.1.101/24。
-
VPN互联后互访的子网:10.0.0.0/24。
VPN服务器与VPN客户端均获得10.0.0.X网段地址。当客户端访问公司内网地址172.31.1.101时,网关为VPN服务器,(考虑到子网内其他服务器上可能不方便再指定返回10.0.0.1/24的路由下一跳为VPN server),在VPN服务器上做好转发,将客户端的请求数据的源地址NAT为VPN自己连接公司内网的网卡地址(172.31.1.100),即可实现接入。
最终目标:在外网client机器上ping通172.31.1.101。
配置VPN服务器
完成基本开局配置后,安装扩展源:
yum install -y epel-release yum clean all yum makecache # 升级系统包&内核 # yum update -y
补充环境包并安装服务端openvpn。注意,如果离线安装,OpenVPN官网提供的商业版本在未购买许可证的情况下只能并发2个用户,使用社区免费版即可:
yum install -y openssl lzo pam openssl-devel lzo-devel pam-devel yum install -y easy-rsa yum install -y openvpn
查看确认安装的easy-rsa版本是否为3,旧版本easy-rsa请根据help结果操作:
配置证书密钥:
cp -a /usr/share/easy-rsa/3.0.3 /etc/openvpn/server/easy-rsa cd /etc/openvpn/server/easy-rsa # 初始化PKI(Public Key Infrastructure)目录 ./easyrsa init-pki # 以非加密的方式创建CA证书 ./easyrsa build-ca nopass # 本地签发生成一对密钥,非加密 ./easyrsa build-server-full server nopass ./easyrsa build-client-full client1 nopass ./easyrsa build-client-full client2 nopass # 生成戴夫赫尔曼参数 ./easyrsa gen-dh # 创建openvpn提供的额外的ta安全证书来防止DoS攻击和UDP洪水 openvpn --genkey --secret ta.key
创建Server使用的目录:
mkdir -p /var/log/openvpn/ chown openvpn:openvpn /var/log/openvpn #mkdir -p /etc/openvpn/server/user
复制服务端的示例配置文件/usr/share/doc/openvpn-2.4.7/sample/sample-config-files/server.conf到/etc/openvpn/server/内后,编辑配置文件server.conf,修改下列信息:
# 本地监听IP local 192.168.137.141 # 必要时更改默认端口防止被探测 port 1194 # 数据传输方式为tcp,防止运营商存在针对udp的QoS proto tcp # 加密认证参数 ca /etc/openvpn/server/easy-rsa/pki/ca.crt cert /etc/openvpn/server/easy-rsa/pki/issued/server.crt key /etc/openvpn/server/easy-rsa/pki/private/server.key dh /etc/openvpn/server/easy-rsa/pki/dh.pem # VPN网段设置 server 10.0.0.0 255.255.255.0 # 推送给客户端的静态路由 push "route 172.31.0.0 255.255.255.0" # 推送给客户端的DNS(FQ时才有用,访问指定内网IP时没有意义) push "dhcp-option DNS 114.114.114.114" # 额外的安全防护 tls-auth /etc/openvpn/server/easy-rsa/ta.key 0 # 进程初始化以后降低权限以提高安全性 user openvpn group openvpn # 指定记录客户端连接状态log文件的位置 status /var/log/openvpn/status.log # 以覆盖模式开启log,方便调试。两种模式只能二选一,正式上线可以修改为追加模式 log /var/log/openvpn/server.log # 提高日志详细程度,辅助排错。正式上线后可适当降低为4。 verb 6 # 注释掉通知,因为该功能需要开启udp #explicit-exit-notify 1
做个软链接,因为systemctl运行openvpn时会去默认目录下寻找配置文件:
cd /etc/openvpn/ ln -s /etc/openvpn/server/server.conf server.conf
防火墙配置,一方面是放行接收外界客户端发起的VPN请求。另一方面,一般内网服务器量级较大的时候,不方便逐个增加回指路由,故需要让客户端的数据包到达内网服务器时其源IP是VPN服务器的内网接口IP,从而能保证顺利回包。故对已经建立起连接的客户端进行NAT转发,将客户端访问内网IP的数据包通过自己的另一个接口转发出去的同时修改源IP:
firewall-cmd --set-default-zone=dmz firewall-cmd --zone=dmz --add-interface=ens33 --permanent firewall-cmd --zone=dmz --add-interface=ens37 --permanent firewall-cmd --zone=dmz --add-port=1194/tcp --permanent # 为访问内网添加NAT firewall-cmd --add-masquerade --permanent firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.0.0.0/24 -o ens37 -j MASQUERADE firewall-cmd --complete-reload
启动服务:
systemctl start openvpn@server
此时网卡状态:
排错(重要)
查看系统数据包转发是否开启:
cat /proc/sys/net/ipv4/ip_forward
若未开启则开启之:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
状态查询:
tail -20 /var/log/messages systemctl status openvpn@server.service cat /var/log/openvpn/server.log cat /var/log/openvpn/status.log
配置客户端
这里配置windows客户端。下载客户端安装包openvpn-install-2.4.7-I603.exe,并根据提示完成安装:
将服务端生成的ca.crt、client1.crt、client1.key、ta.key,下载到C:\Program Files\OpenVPN\config文件夹内(可提前准备好该文件夹内的配置内容,直接在安装好客户端的机器上覆盖config文件夹即可):
在安装目录C:\Program Files\OpenVPN\sample-config下找到客户端示例配置client.ovpn,拷贝一份到config文件夹内,并修改。需要修改下列内容使其与服务端相匹配:
proto tcp remote 192.168.137.141 1194 ca ca.crt cert client1.crt key client1.key tls-auth ta.key 1 verb 6
右键管理员运行OpenVPN快捷方式,然后在桌面右下角图标处点击连接(若配置了额外的密码认证,还需要输入用户名和密码,本次测试并未配置启用该功能):
连接成功,可以看到虚拟适配器获得了规划好的10.0.0.0/24网段内的地址:
查看路由表,可以看到额外生成的去往公司内网服务器的路由:
这里做个测试,关闭VPN服务器上的防火墙,尝试ping:
发现可以正常ping通VPN服务器的内网接口172.31.0.100(因为有路由),但暂时还无法访问内网测试机172.31.1.101。
开启服务器上的防火墙,VPN服务器开始转发,发现员工客户端已经可以正常访问内网测试机:
评论列表,共 0 条评论
暂无评论