VPN实战_部署OpenVPN实现远程访问企业内网

  本文通过开源的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 条评论

    暂无评论