一、需求与背景 由于IPv4地址紧缺,而IPv6在国内还未广泛普及,因此很多非专线的宽带接入,ISP并未提供静态固定的IP地址,甚至连动态的公网IP地址都没有,采用PPPoE拨号的家庭宽带,在接入后会获得一个100开头的地址(如下图),该地址叫运营商级别的私有地址。虽然某公司对于动态公网地址的SSL VPN已经有相关的解决方案,但是前不久咨询400得知,对于这种根本没有公网地址的拨号环境,目前还没有相应的解决方式。 本文目的就是实现在这种极为苛刻的网络条件下的SSL VPN接入,理论上采用本方案可以实现在可上Internet的前提下任何网络环境的SSL VPN接入
二、Frp简介 使用Frp可以实现在无公网地址环境下的内网资源发布、端口映射、代理等功能。Frp分为有公网地址的Frps(Frp服务端)和在内网代理发布流量的Frpc(客户端),工作时,Frpc需要通过指定端口向Frps发起注册,通告需要发布的资源IP地址,端口等信息,Frps需要有可访问的固定IP地址或域名。此后,Frps将监听访问流量,然后通过已建立的Frps-Frpc通道,将请求发布到内网Frpc,Frpc代理访问内网资源,再通过Frps-Frpc的通道,将回包交给Frps,最后Frps就可以将数据返回给请求方,如下拓扑:
根据上面的拓扑,我们需要实现的就是通过frpc将内网服务发布到frps,此后外面的访问者就能通过frps访问到内网的服务了。但是由于frp本身不具备身份验证,授权等隧道级的高级功能,而这些恰好是SSL VPN所能胜任的,因此,我们只需要通过frp发布SSL VPN服务,再通过SSL VPN进行身份认证和资源授权即可
四、准备 1、Frps需要部署在有静态公网地址的网络环境中,最方便的方式可以考虑在各大公有云购买一台带有静态地址的VPS或云主机,操作系统选择Linux即可。 2、Frpc需要部署在内网,最好也使用独立的一台Linux主机或虚拟机。
五、具体步骤 5.1 部署Frps 首先将刚才下载的软件包上传到VPS并解压,就看到了Frp的软件目录 进入frp的目录,可以看到frpc frpc.ini frpc_full.ini frps frps.ini frps_full.ini这几个文件,frpc开头的都是与客户端相关的文件,frps都是和服务端相关的文件,因此在这里我们完全可以删除和服务器无关的文件,删除后如下图 frps是主程序,frps_full.ini是可供参考的全部配置信息,frps.ini是实际的配置文件。 完整的配置文件较为复杂,功能也很多,这里只介绍一部分参数,以下就是frps.ini配置文件 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防火墙的相关端口,下图是某公司的网络安全组的配置,其他云服务商可参考相应的配置文档 之后尝试打开frps监控页面,正常显示表示frps配置成功 5.2 部署Frpc frpc的安装和frps完全一致,只是启动的程序不同。不再赘述。 frpc的配置与frps类似,这里直接介绍frps.ini 完整的配置文件同样可以参考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监控页面,即可看到如下发布的资源: 现在就尝试使用VPS的公网地址和发布的端口号访问SSL VPN了 登录,访问SSL VPN发布的资源 成功打开资源页面
七、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产品将适用于所有网络环境中 |