使用 Cloudflare 配置个人站点,并深入理解 CDN 服务

工作后,对某项新技术的学习往往出自功利或焦虑。而学习 CloudFlare 则可能帮你找回学习新技术的乐趣。

前言

你可能对网络基础设施原理或搭建私有云服务不感兴趣,所以这里先从功利的角度分析下学习收益。有人说只有国内互联网分前后端工程师,国外只分初级高级工程师,初级写业务,高级写基础设施。

其实国内也一样,待过大厂的都知道,绩效全靠造轮子。部门内塔尖的工程师,都是在单独的子部门折腾跨端/bundler/CI 平台,直到今年行情不好,大家只得回头转向业务为先。

这也是必然的,对于业务而言,绩效当然是PM/运营的话语权更高,如果业务的绩效也都算给研发了,那还要 PM 有啥用。研发话语权更高的领域当然还是基础设施这种专为研发服务的业务。在股东们看来,基础设施占用了更高阶的研发人员,更贵的研发人力,当然也要挣钱,也要 ToB ,那就是云原生嘛。所以云原生也是科技行业大盘指数的晴雨表。去年年末 AWS 等云厂商的财报不好看,带动科技股整体的大跌,直到 ChatGPT 出现一转攻势,因而所有互联网公司都感谢它,逆转了市场的预期。

综上,作为一个互联网行业的工程师而言,对互联网基础设施领域的相关知识,往往是工程师之间,乃至行业判断个人水平的硬通货。对它的了解和实践能有效构建个人的护城河,提升个人行业竞争力。

CDN 原理

内容交付网络(CDN)是一个地理上分布的服务器群,在靠近终端用户的地方缓存内容。 CDN允许快速传输加载互联网内容所需的资产,包括HTML页面、JavaScript文件、样式表、图像和视频。 CDN服务的普及继续增长,今天大多数网络流量是通过CDN提供的,包括来自Facebook、Netflix和Amazon等主要网站的流量。

谈到 CDN 时,往往和 DNS, Anycast 混杂在一起,这里希望帮你理清他们的关联。其中最容易产生歧义的是 Anycast, 要理解它又不得不解释 AS 和 BGP。它们并不难,学习它们也是值得的。

什么是 AS (自治系统)

请看 什么是自治系统 (autonomous system)?

自治系统(AS)是具有统一路由策略的巨型网络或网络群组。连接到 Internet 的每台计算机或设备都连接到一个 AS。

AS 被授权解析某个具体的IP地址。

便于理解,这里做一些比喻。假如回到互联网诞生之初的实验室里,此时房间里的两台家用路由器就是两个单独的 AS,称为 AS1、 AS2 。暂时忽略掉内网外网,AS1 负责解析 1.1.1.1 - 2.2.2.2 区段,AS2 负责3.3.3.3 - 4.4.4.4 区段, 所有拉网线到 AS1 这台路由器的设备会获得这个区段的一个 IP,且设备藉由共通拉网线到这个路由器,两台其他设备可以使用区段 IP 直接进行局域网通信。

(图:家用路由器局域网地址间直接通信)

假设此时有 20 个路由器(当做 AS机器),且AS机器之间建立连接的方式只有物理拉网线。 AS1 和 AS2 直接拉网线连接,并通过内部协议同步了两边可以解析的 IP。由此两个"局域网"可以互相通信。

由于直接相连的 AS 之间会根据内部协议同步路由表,因此即使20台机器串连起来,每台机器最终也知道其他全部 AS 的路由表情况。 比如 AS1 <=> AS2 <=> AS3 , 对 AS2来说 AS123 的路由表它都知道,并且也能告诉 AS1,3, 所以 AS1 也知道 AS3 的路由表,即使它们不直接相连。对于拉网线到 AS1 的设备,自己的 AS1 知道目标IP 归属于哪个具体的 AS, 从而传输数据。

真实世界的 AS 亦是上述情况的扩大化。由国家,运营商,跨国公司运营的(物理介质也是海量的路由器机器组成的)的网络集群就是 AS,单个 AS 可以看做一个巨大的"局域网"(注意引号)。AS 之间也是由地理位置来拉网线,比如沪日专线、太平洋光缆之类的物理网线相互连接。

比如我接入了移动的家庭宽带,即接入了移动的 AS , 藉由它知道了世界上所有 IP 归属哪些 AS (路由表),并由现实世界的网络光纤传输,可以连通到世界上任何一个 AS=>IP=>物理设备。

什么是 BGP(边界网关协议)

什么是 BGP?

每个 AS 使用 BGP 通知它们负责的 IP 地址以及它们连接的其他 AS。BGP 路由器从世界各地的 AS 中获取所有这些信息,并将其放入称为路由表的数据库中,以确定从 AS 到 AS 的最快路径。当数据包到达时,BGP 路由器会参考其路由表来确定数据包接下来应转到哪个 AS。

沿用上文的场景,假设这 20 个 AS (想象为家用路由器)分布在几栋教学楼里,把每台路由器和其他所有路由器拉网线一对一连接不现实,根据地理位置,机器器之间的拉线情况可能错综复杂,如图所示:

(图来自这篇文章

开始时 IP 归属情况就是清楚的,比如家用宽带IP归属 AS1 ,请求目标的IP归属AS3,现在要做的就是找到 AS1 到 3最优的物理路径 ,可能存在多条路径时,使用 BGP 协议用来找到最优的那条物理路径。

暂时不管实现细节,BGP 可以简单理解为找到连接到目标 IP 最佳 AS 路径的协议。 它往往对应现实世界的物理链路质量(网线怎么拉), 如 AS1 AS2 AS3 。但真实世界的情况可能复杂的多,不一定路径最短就好,仍要考虑路径节点之间的连接质量,并随时间定期更新。 比如上图 BGP 会给出路径 1-2-3, 这时某个国家断网了, AS2 挂掉了,BGP 就会返回 1-6-5-4-3 路径。

互联网是人类上一个最伟大的发明,BGP 就很好的的体现出互联网分布式的特点,AS1、3 不依赖任何一个固定的第三方来进行通信,真实世界中可能的路径有无数条。AS 之间是对等(peer)的关系。

什么是 Anycast (任播)

任播这个概念原本不好理解,但如果你理解了 AS 和 BGP 后,就非常容易理解了。

任播就是在多个不同地点的 AS 广播同一个IP 地址 (如 223.5.5.5)。 不同地理位置的用户请求这个相同的 IP ,会藉由 BGP 协议自动找到离他最近的 AS ,从而优化链路和响应时间。

大多数 AS 连接到其他几个 AS。如果一个 AS 仅连接到另一个 AS 并共享相同的路由策略,则可以将其视为第一个 AS 的子网。

AS 取决于真实世界中物理机的拉线情况,往往一栋楼,一个学校都可以专用一个 AS ,只要它们属于同一个运营商(ISP,如电信、阿里云),可以认为它们属于同一个 AS,当然 AS 编号不同。

比如阿里部署一个服务到 223.5.5.5 这个IP 地址, 并且用北上广深多个 AS 机房广播这个 IP,在全国不同地方的用户请求这个相同 IP,则可藉由 BGP 找到最近的 AS 地址,优化网络链路。 www.zhihu.com/question/61...

Anycast 是防御 DDoS 的最佳手段

假设一个服务域名为 dnspod.com , 解析到223.5.5.5 这个地址,此时 dnspod.com 被 DDoS 打挂了,有两种方式缓解:

  • dns 切流,将 dnspod.com 切换解析到 223.6.6.6 , 因为存在世界范围的解析以及客户端的 TTL 缓存,仍会有小段时间服务处于挂掉的状态
  • 223.5.5.5 做 Anycast ,同时在 AS1,2,3广播。假如 AS1 被打挂了,BGP 会立马更新到 AS2,不会出现短时间的挂掉状态。

综上,相信你已经基本理解了什么是 AS,BGP,Anycast及之间的联系。

什么是弹性公网 IP?

Anycast EIP和EIP对比

对于AWS ,阿里云这种使用 Anycast 提供的 EIP服务就是上文的实践,绑定给用户实例的固定IP已经有了 Anycast 优化,AS 机房挂了会有无感主备切换。但有时会切不动,就很影响公司声誉:什么样的故障让阿里云换了总裁?

DNS实现

DNS 简单来说就是把域名查询到对应 IP(或 CNAME 等其他记录) 的服务。这个想必大家都十分熟悉了,就不在本文分析了。

什么是 DNS

值得一提的是,互联网厂商往往会提供公共 DNS 服务地址,这种地址是典型的 Anycast IP

比如: Google 的 8.8.8.8 , Cloudflare 的 1.1.1.1 ,阿里云的 223.5.5.5

全球各地的用户都可以将个人路由器的 DNS 服务器写死为这个 IP ,很明显上述跨国公司都是用了全球多城市多地多地的机房 AS 广播了上述 IP , 优化用户的网络链路。

值得一提的是 google 在大陆没机房,最近的 AS 在台湾,所以 DNS 写死为 8.8.8.8 没有用处,反而可能拖慢网速。对 WFG 而言 DNS 能抢答,8.8.8.8 来不及返回正确的记录。且 8.8.8.8 可能会导致请求目标站点误判客户端的地理位置(最近的AS在台湾),所以反而可能会降低网速。

CDN 实现

CDN 其实有很多种实现,通过上文可以知道 Anycast 都一定程度的实现了 CDN 的效果。时至今日,最常见功能最强大的是使用 DNS 实现,简单流程如图:

我们来实践验证一下。

上传一张图片时会自动生成 CDN 地址,如 p3-juejin.byteimg.com/tos-cn-i-k3...

地址为 p1-juejin.byteimg.com , 它必然指向真实 CDN 地址的一个 CNAME 记录,为 p3-juejin.byteimg.com.queniuuf.com , 客户端转而请求这个 CDN 服务地址,服务从而能获得客户端最全的信息,然后返回距离客户端最近最优的 IP 地址。将一个 CDN 域名解析到不同的ip,根据请求者的位置返回离它近的ip,这叫智能dns。

使用两台 HK ,US 网络环境的机器分别执行

js 复制代码
nslookup p3-juejin.byteimg.com

可以清晰看到上述过程,如图

这些择优的 CDN 服务器 IP 自然也存在 Anycast 优化。将不同主机分配同一个ip,请求者访问此ip是路由 AS 到离它近的,这叫 Anycast。此过程与dns无关。

值得一提的是静态资源文件的 CDN 地址 origin 往往和主站不同, 例如图片是 p1-juejin.byteimg.com 之于主站 juejin.cn 。 这体现出 Web 架构的细节,一个网站的多个部分,它的资源也可能由不同的云服务商提供 CDN 服务,这很常见。

使用 Cloudflare

如何建立账号,购买域名,并把域名配置到 Cloudflare 里就不展开了,可以参考这篇文章。

域名的记录如图所示,相较于普通的 DNS 服务商,CF 的特色是记录上的 Proxy status 云朵按钮,这个是CF CDN 功能的入口。

图中的 AAAA IPv6记录都是通过 DDNS-GO 更新的。DDNS 简单来说就是机器上跑个定时任务,调 DNS 厂商的API 来更新记录值。2409 是移动的 IPv6 前缀,以此开头的都是个人的私有云服务。

(私有云机房局部实拍,N5105 外接机械盘,加上左上外置散热,百洁布底座)

结合 DNS 服务的 CDN

假如域名为 dev.test.cc , 目标 IP 为 34.43.34.43

如果不勾选 proxy,就是一条普通的 DNS 记录

如果勾选 proxy,链路会如下图所示

dev.test.cc 首先打到 CF DNS 解析服务=>CF CDN 服务,返回优选的 CF IP 地址 104.21.49.11 (可以在浏览器直接输入 104.21.49.11 , 页面会提示这是个 Cloudflare IP)。对于 104.21.49.11 的服务 ,通过request 的name dev.test.cc , 找到具体的解析记录34.43.34.43,从而请求源站。

可以看到全部 dev.test.cc 的请求,remote address 即为 CF IP 104.21.49.11

HTTP response header 也能校验业务信息。

可见,只要接入了CF 的DNS,并勾上了 proxy , 即获得了使用全球 CF CDN 节点访问个人域名的能力。

值得一提的是这和上传图片返回的图片 CDN 的这种图床服务有很大差异。对于 DNS 记录来说,域名比如 dev.test.cc ,以及目标 IP 如 34.43.34.43 都是你自己定义的,非常灵活。 在 abuse 场景下, CF CDN 节点都能直接作为资源使用,比如:

大陆地区 Cloudflare 无法直接返回优质节点,但借由 许多工具 我们能获取到特定网络环境的 CF 优质节点。所以在添加 DNS proxy 记录后,我们使用一些网络协议时,写死 request server 为优选的 CF IP,并通过header.host 字段传入域名如 dev.test.cc, 就能将这个优选的 CF 节点 162.159.136.50 当做纯代理节点使用。

一个实践

流量计费:宽带联盟

对于云原生业务,单个 VPS 而言计费可谓是重中之重,网络带宽成本为 VPS 最重要的成本之一。

比如这台机器,内存200M,磁盘 4G ,可以说成本全在网络资源上。有时运营商还会把上行下行流量分开计费,而流量本身可能根据来源不同而分开计费,甚至豁免计费。

Cloudflare 带宽联盟

是由 CF 主导组建的旨在节省云计算服务商间数据流量开销的组织。在联盟中,受益最大的就是CF和末端用户,CF由此巩固自身的互联网带宽权益地位,更有底气向ISP压低带宽价格,用户则获得了来自服务商的流量费用豁免。

实际上,阿里云OSS已确认除迪拜和中国大陆的地域外流量传出至CF边缘节点不计费。

WARP :客户端接入 CDN,保护链路

从互联网最初的理念来看,客户端和服务端理应都拥有独立的 IP 地址,可以说是对等设备。因而客户端也能接入CDN网络

今年来网络评论直接显示 IP 属地更像是全民的网络安全教育课,非常直接的提醒了我们网络链路安全的重要性。使用 https://1.1.1.1/ 接入 warp。当然在有 WFG 的前提下接入 WARP 一定会劣化网络性能,但给 VPS 也可以使用这个来达到特殊作用,使用安装脚本来实践它。

假设这台机器的 IP 为 34.34.34.34 ,处于某个黑名单中,每次访问 Google 都会跳验证,则用这种方式,可以将出站 IP 修改为 104.28.203.57 , 为 CF 的 IP ,在 Google 的白名单内。 当然这种方式只管机器的出站,不管入站,比如我远程连接这台机器仍然使用 34.34.34.34。

另一个用处在于可以为 IPv4 only 的服务器开启 IPv6 连通性,因为国内加宽没有独立的 IPv4, 但已普及 IPv6, 开启远程服务器的 IPv6 连通性会解锁更多玩法,这里就不展开了。

总结

写文章本身也是一个学习的过程,也请读者能指出文章中的疏忽错漏之处。如果本文对你有所帮助,欢迎点赞收藏。

相关推荐
液态不合群2 小时前
低代码革命:加速云原生时代的端到端产品创新
低代码·云原生
城南云小白8 小时前
web基础+http协议+httpd详细配置
前端·网络协议·http
Tony聊跨境9 小时前
什么是 SSL 代理?
网络·网络协议·ssl
沛沛老爹10 小时前
服务监控插件全览:提升微服务可观测性的利器
微服务·云原生·架构·datadog·influx·graphite
汀、人工智能10 小时前
报错error: RPC failed,curl 16 Error in the HTTP2 framing layer解决方法
网络·git·网络协议·rpc
huaqianzkh11 小时前
了解华为云容器引擎(Cloud Container Engine)
云原生·架构·华为云
Alone804611 小时前
K8s中HPA自动扩缩容及hml
云原生·容器·kubernetes
一叶飘零_sweeeet12 小时前
为什么 Feign 要用 HTTP 而不是 RPC?
java·网络协议·http·spring cloud·rpc·feign
KookeeyLena712 小时前
动态IP与静态IP:哪种更适合用户使用?
网络·网络协议·tcp/ip
HoweWWW12 小时前
k8s-API 访问控制
云原生·容器·kubernetes