提要
在有动态公网IPV6的情况下,使用DDNS和自定义端口对外提供WEB服务并不难,但是面临两个重要问题:
- 如果客户端不支持IPV6,怎么办?
- 需要打开防火墙,暴漏端口,是否不太安全?
对外提供Web服务的方案很多,比如使用端口映射方案,我也曾使用过 fatedier/frp 这样的开源项目,但是还需要另外再维护一台VPS,其带宽和成本都是个问题,另外,端口映射的方案其实也并不安全,所以我选用了另一种更加适合我目前场景的方案:
腾讯云 Edge One
EdgeOne 的全称叫做边缘安全加速平台,其中的具体介绍可以查看腾讯云的产品介绍,这里就不再赘述,可以简单的把他看作一个更加安全的 CDN 。我选择
- ¥9.9/月:1个站点,50GB安全加速流量,300万次安全加速请求,具有CDN功能、智能加速功能,并且提供了一些基本的DDoS防护、Web防护、基础 CC 防护。注意:这里的一个站点,指的是一个主域名,可以在这个站点里添加若干子域名。
- 支持IPV6的自定义端口源站:也就是说,CDN可以直接从指定v6地址的指定端口回源,而客户端访问web时,不再需要输入端口,也不必关注客户端是否支持v6地址。
- 多个子域名可以共用同一个源站组:可以配置一个源站组,然后在各个子域中引入这个源站组。这样,在IPV6地址变更时,只需要更新源站组的IP即可,不必操作多个源站。
- 支持使用API更新源站组:可以在源站上使用自动化脚本来监测IPV6地址变更情况,并及时自动更新源站组。
- 分大陆和海外提供了详细的节点IP地址的获取地址:可以自动化的更新防火墙,仅对 EdgeOne 节点放通入站请求,规避一些因开放防火墙导致的安全问题。
自动化更新防火墙配置
我的服务部署在一台 Windows Server 上,并使用 Python 脚本进行计划任务,来更新防火墙。
腾讯云通过地址 https://api.edgeone.ai/ips 提供EdgeOne的节点IP,并接收参数 version
和 area
来获取指定的节点IP。
我的脚本创建了四条防火墙规则,并在节点IP发生更新时,删除旧的防火墙规则并添加新的。该脚本示例中,并未对端口进行限制。
自动更新源站组IP
该脚本需要使用腾讯云账号的 SecretID
和 SecretKey
,以及源站组的 GroupId
,可以在源站组页面查到。
结语
该方案和内网穿透相比,有一定局限性,比较依赖运行商是否开放IPV6,其流量也很少。但是不局限于内网穿透的vps带宽,并且仅仅用于web服务时,价格相对还算可接受范围。并且提供了一些基础防护和CDN,总的来说,我的使用体验还不错。
sequenceDiagram
用户-->>+EdgeOne: ipv4发起请求
EdgeOne-->>+服务器: 公网V6回源
服务器-->>EdgeOne:
EdgeOne-->>+用户: 响应请求
用户->>+EdgeOne: ipv6发起请求
EdgeOne->>+用户: 返回302
用户->>+服务器: ipv6发起请求
服务器->>+用户: 响应请求