使用Frp实现无公网地址(家庭宽带)环境下的SSL VPN部署
  

Windroid Lv4发表于 2018-11-12 16:48

一、需求与背景
由于IPv4地址紧缺,而IPv6在国内还未广泛普及,因此很多非专线的宽带接入,ISP并未提供静态固定的IP地址,甚至连动态的公网IP地址都没有,采用PPPoE拨号的家庭宽带,在接入后会获得一个100开头的地址(如下图),该地址叫运营商级别的私有地址。虽然深信服对于动态公网地址的SSL VPN已经有相关的解决方案,但是前不久咨询400得知,对于这种根本没有公网地址的拨号环境,目前还没有相应的解决方式。
193615be91744d122b.png
本文目的就是实现在这种极为苛刻的网络条件下的SSL VPN接入,理论上采用本方案可以实现在可上Internet的前提下任何网络环境的SSL VPN接入

二、Frp简介
Frp是一款免费、开源、高性能的反向代理工具,项目地址在GitHub:https://github.com/fatedier/frp
使用Frp可以实现在无公网地址环境下的内网资源发布、端口映射、代理等功能。Frp分为有公网地址的Frps(Frp服务端)和在内网代理发布流量的Frpc(客户端),工作时,Frpc需要通过指定端口向Frps发起注册,通告需要发布的资源IP地址,端口等信息,Frps需要有可访问的固定IP地址或域名。此后,Frps将监听访问流量,然后通过已建立的Frps-Frpc通道,将请求发布到内网Frpc,Frpc代理访问内网资源,再通过Frps-Frpc的通道,将回包交给Frps,最后Frps就可以将数据返回给请求方,如下拓扑:
frp.jpg

三、实现思路
根据上面的拓扑,我们需要实现的就是通过frpc将内网服务发布到frps,此后外面的访问者就能通过frps访问到内网的服务了。但是由于frp本身不具备身份验证,授权等隧道级的高级功能,而这些恰好是SSL VPN所能胜任的,因此,我们只需要通过frp发布SSL VPN服务,再通过SSL VPN进行身份认证和资源授权即可

四、准备
1、Frps需要部署在有静态公网地址的网络环境中,最方便的方式可以考虑在各大公有云购买一台带有静态地址的VPS或云主机,操作系统选择Linux即可。
2、Frpc需要部署在内网,最好也使用独立的一台Linux主机或虚拟机。
3、Frp的程序可以在GitHub下载:https://github.com/fatedier/frp/releases。注意软件架构和平台兼容性。该软件包包含了Frps和Frpc,只需要下载一个就可以。

五、具体步骤
5.1 部署Frps
首先将刚才下载的软件包上传到VPS并解压,就看到了Frp的软件目录
179245be923ea3aba0.png
进入frp的目录,可以看到frpc frpc.ini frpc_full.ini frps frps.ini frps_full.ini这几个文件,frpc开头的都是与客户端相关的文件,frps都是和服务端相关的文件,因此在这里我们完全可以删除和服务器无关的文件,删除后如下图
529565be924a2476de.png
frps是主程序,frps_full.ini是可供参考的全部配置信息,frps.ini是实际的配置文件。
完整的配置文件较为复杂,功能也很多,这里只介绍一部分参数,以下就是frps.ini配置文件
302815be926f11501f.png
bind_addr是frps的监听地址,0.0.0.0表示监听本地全部地址
bind_port是frps监听frpc的通信端口,默认为7000
dashboard_port是frps的Web监控页面的端口,下面两个是监控页面的登录用户名以及密码,可以根据需要更改
token是密钥,只有客户端配置了相同的token值,才允许接入frps。
配置完成后,使用./frps -c frps.ini启动frps服务端,-c参数可以指定启动时采用的配置文件。启动后,放开本地防火墙相应端口和VPS防火墙的相关端口,下图是腾讯云的网络安全组的配置,其他云服务商可参考相应的配置文档
360445be928db0ee4c.png
之后尝试打开frps监控页面,正常显示表示frps配置成功
699645be929389dbb1.png
5.2 部署Frpc
frpc的安装和frps完全一致,只是启动的程序不同。不再赘述。
frpc的配置与frps类似,这里直接介绍frps.ini
339765be92aa822e09.png
完整的配置文件同样可以参考frpc_full.ini或官方文档,这里仅介绍部分配置
server_addr是服务端的公网地址
server_port是frps的监听端口,这里也就是上文的7000
token字段需要和服务端的token字段一致
下面的内容,每个字段头代表一个需要发布的独立服务名,如SSL VPN。
type表示服务类型,因为这里仅仅需要将SSL VPN的443端口映射即可,因此选择tcp
local_ip为服务的内网地址,如192.168.xxx.xxx
local_port为服务的真实端口,对于SSL VPN就是443
remote_port为发布到公网的端口,即用户访问时所使用的端口,自定义即可,只要不冲突
配置完成后使用./frpc -c frpc.ini启动客户端
然后同样地,需要在frpc和frps的本地防火墙放通相关端口,然后VPS防火墙也要放通相关端口
5.3 SSL VPN配置
这里只要按照SSL VPN单臂部署的流程正常配置就可以,不再赘述

六、实现与验证
以上全部配置完成后,前往frps监控页面,即可看到如下发布的资源:
969255be92d286be90.png
现在就尝试使用VPS的公网地址和发布的端口号访问SSL VPN了
299625be92d945b8f7.png
登录,访问SSL VPN发布的资源
176675be92df1d447a.png
成功打开资源页面
779445be92e2ac3b59.png

七、TIPS
1、本方案理论上可使用frp在任何NAT网络环境中实现SSL VPN的接入
2、对于SSL VPN其他高级功能,并未验证可行性,需要后续进一步验证。
3、SSL VPN发布资源时,B/S应用资源建议采用“TCP资源”或“L3VPN”发布,使用HTTP资源发布时,测试环境下跨三层的资源无法访问
4、Frp的功能远不止这些,其他玩法可以参考官方文档,并且Frp的开发还在进行,后续功能可持续关注
5、Frp是一个前台程序,意味着一旦关闭终端,ssh或者ctrl+c,程序将终止,因此在生产环境中,建议使用Supervisor等守护程序控制frp的启动与终止,当然这部分超过了本文讨论的内容

八、方案价值与建议
目前运营商专线的价格依然远高于家庭宽带,一些小型企业,尤其对移动办公有需求的小型企业,对SSL VPN依然有需求,采用这种家庭宽带+VPS 部署的方案,成本依然远低于运营商专线,每月平均多花100到300元,就能获得与专线一样的SSL VPN使用体验。
同时,如果深信服考虑后续版本中将Frpc模块内置到SSL VPN中,内网穿透能力将大大增强,则理论上SSL VPN产品将适用于所有网络环境中

喜欢这篇分享吗?喜欢就给楼主打点赏吧!点个赞也是极大的鼓励!

发帖可获得5S豆;若您的分享被加精或推荐优秀等,将获得更多S豆奖励,了解更多S豆奖励信息

完善手机号和公司名称,让服务更省心更便捷!立即完善

sangfor_闪电回_小六 发表于 2018-11-14 09:27
  
干货很足,感谢分享
余泳杰 Lv3发表于 2018-11-15 11:04
  

干货很足,感谢分享
nightmare Lv5发表于 2018-11-16 08:30
  
干货很足,感谢分享
ie5000 Lv12发表于 2018-11-16 23:43
  
学习一下
弓长湿兄 Lv6发表于 2018-11-19 15:11
  
学习一下
ID404 Lv5发表于 2018-11-19 21:10
  
这样的话所有流量都经过frps服务器,如果VPS按流量计算的话费用就比较高了。
ie5000 Lv12发表于 2018-11-19 23:34
  
厉害,学习一下
法律框架 Lv7发表于 2018-11-20 08:42
  
干货很足,感谢分享
xiexie Lv4发表于 2018-11-20 13:50
  
干货很足,感谢分享