侧边栏壁纸
博主头像
术业有道之编程博主等级

亦是三月纷飞雨,亦是人间惊鸿客。亦是秋霜去叶多,亦是风华正当时。

  • 累计撰写 99 篇文章
  • 累计创建 50 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

内容分发网络(CDN)原理及一些网络应用

Administrator
2024-01-03 / 0 评论 / 0 点赞 / 70 阅读 / 8396 字

写在前面

这篇文章讲述的内容分发网络(CDN),听名字不明所以,但是实际上很简单,在实际的电商仓储系统中已经实现了,比如京东物流的的前置仓、中央仓等.目的只有一个,缩短时间.在网络上是缩短访问时间,在物流上是缩短物流运输时间.

我会用实际的物流场景网络场景来分别描述CDN

文章末尾有彩蛋,不要错过.

一、经典网络结构

物流场景:

在网上买个东西,假设发货地是新疆,收货地是福建,来看看地理直线跨度(西藏到黑龙江更远)
地域跨度

正常情况下,专车把这个快递送来,没个5天以上根本到不了.

网络场景:

最简单的一种网络结构,现在依旧有大量企业在使用(成本低、不追求网页响应速度).它们通常由一个服务器 -> 公网IP -> DNS 组成.我们访问的顺序就是其倒过来的顺序.

但是这种网络结构有一个非常大的问题,如果服务器离咱们很远(地域距离),那么就会出现很多的网络接驳(转发、代理、协议转换等等),我在 网络访问那点事儿 一文中有过一丢丢提及.导致的结果就是访问很慢,甚至经常因为请求超时无法访问.

二、内容分发网络

内容分发网络就是分发内容的网络,为的是提高网络的内容响应速度,针对静态内容还提供了缓存策略.请注意,它不是网络加速,而是类似京东物流的策略,把一些事情提前做了.

物流场景:

京东在全国省会城市设置中央仓,在小区人口密集的区域设置前置仓,坐在家里买个东西,一天内就能送到,前置仓没有就找中央仓,把距离缩短到了市区内.有效的解决了物流运输时间过长的问题.

网络场景:

使用爬虫或者访问时的内容缓存,对网络上的资源进行多地同步存储(数据存多久、多久更新一次取决于CDN策略,可以自定义).对访问频率高的数据可以设置热点数据高速缓存.

当有人访问时,马上根据访问者的地理位置,选择最近的CDN区域,再根据CDN的网络质量寻找最合适的CDN服务器拿数据,获取数据的基本过程是:

  • 高速缓存服务器
  • 没有再去找内容存储服务器
  • 再没有就去找源站

而根据CDN的策略,当获取到数据后可以反向操作.将其存储到内容存储服务器一段时间,也可以进一步在高速缓存服务器上存储一段时间.

ps:源站通常是指在经典网络中的一个服务器+公网IP一个服务器+DNS模式,保持协议/主机/端口元组能够访问到即可.不理解这个的可以看我的另一篇文章 跨域

三、内容分发网络原理

我画了一张图来描述最基本的内容分发网络(CDN)原理

CDN

值得注意的是内容分发网络(CDN) 工作在 OSI协议 的第四层协议(传输层),所以应用范围不只是 web

四、内容分发网络的简单使用

我找到了一篇介绍的非常好的文章 Cloudflare CDN Reference Architecture

场景1:

  • 家庭宽带获取到了公网ip地址后不开放80443端口时.
  • 需要隐藏自己的真实服务器地址时.
  • 在不同地域对源站访问速度有要求时

场景1-使用:

只需要找一个其他可以正常访问的端口(假设为8080),将其配置为CDN源站即可.
假设源站访问地址是http://「公网ip或DNS」:8080,使用CDN之后就可以变成http://DNShttps://DNS

注意:这个方法不能完全隐藏真实服务器地址,即使套了CDN也有其他的办法可以查到源站地址.

场景2:

  • 因某些原因,服务器无法使用tcp/udp协议通信时,比如ssh协议,或者干脆直接封了22端口时

场景2-使用:

服务器ip地址加端口(比如22端口)直接套上CDN,后面访问时使用经过CDN的域名加端口.

以上两种场景的情况实际时相同的,解决方案也是相同的.都是利用CDN代理绕过了公网环境的网络限制.

这些情况是基于不可访问的源站是自己可以控制的.下面说说,针对不可访问的源站不是自己控制的情况.

彩蛋在这里

分享一些应对内网网络限制的方法

假设现在www.baidu.com被公司限制,不允许访问.很显然我们也没有对www.baidu.com控制的权限,它属于百度公司.所以没法套CDN了.

下面我将简单讲讲一些方法,让它能够正常被我们访问.仅仅是一个示例,不保证都能成功,具体需要先试探网络环境,分析被什么方式禁止的,再来针对性的做解决方案.

1、利用内网网络限制域名匹配漏洞

大部分企业网络对不可访问的网络资源设置是DNS策略,也就是用表达式匹配DNS黑名单列表(想禁止什么不能访问就加进去),这种列表在开源社区有很多.

第一阶段实施:

  • 在你当前所处的地域(同城),找一台可以正常访问www.baidu.com的电脑,先ping一下要访问的DNS,我这里的例子是ping www.baidu.com,得到一个公网ip地址,通常这个地址是区域CDN负载均衡服务器地址.记下这个公网ip地址.
  • 增加本地DNS解析记录(需要系统管理员权限),windows系统更改C:\WINDOWS\system32\drivers\etc\hosts文件,liunx系统更改/etc/hosts文件.打开文件后在文件最底下加一行「刚刚记下的公网ip地址」 www.baidu.com(注意ip地址DNS中间有一个空格),然后保存
  • 重启电脑或执行命令刷新本地DNS解析记录

简单的限制做完这些就能绕过了,但是往往有多重限制,比如电脑没有系统管理员权限,无法更改那个hosts文件,那就用第二阶段的办法.

第二阶段实施:

  • 用一个支持反向代理的中间件,比如nginx、haproxy、squid等.免安装的绿色版就行(不需要管理员权限).配置一个正向代理,比如将http://localhost:8080代理到「刚刚记下的公网ip地址」
  • 打开浏览器访问http://localhost:8080即可看到www.baidu.com网页了

2、利用内网网络限制规则不完整漏洞

网络限制除非使用排他策略(祈祷一下网管当个人,不会搞白名单策略),只要使用黑名单策略的一定无法穷举出所有的DNS公网ip地址来完善黑名单的列表.所以可以利用不完整的黑名单列表,直接使用一个灰色DNS公网ip地址来进行正向代理.

ps:这里的灰色是指当前DNS公网ip地址对规则解析来说是不明确的,这个地址既不在黑名单,也不在白名单.

第一种方案实施:

  • 找一台能正常访问www.baidu.com的电脑,要有公网ip地址,最好是一台服务器
  • 使用SSH的正向代理模式,例如 ssh -D localhost:1080 「服务器的公网ip地址」.
  • 在浏览器或者系统设置中设置代理服务器地址为localhost:1080,然后就可以用浏览器正常访问www.baidu.com
  • 注意千万不要把SSH的终端关了,关了代理就没了.

windows系统上,安装(绿色版也行)一个git、xshell、putty等,支持SSH即可.liunx系统自带.

第二种方案实施:
直接使用代理软件,开启指定的路由规则代理(自定义pac模式),甚至是全局代理.比如常见的游戏加速器或者Open VPN

其实这两种实施方案原理是一样的

最后说一句,好好做人哈,别搞坏事.技术价值是造福社会,而不是挑战公司规则或者危害社会

个人公众号

0

评论区