写在前面
这篇文章讲述的内容分发网络(CDN)
,听名字不明所以,但是实际上很简单,在实际的电商仓储系统中已经实现了,比如京东物流的的前置仓、中央仓等.目的只有一个,缩短时间.在网络上是缩短访问时间,在物流上是缩短物流运输时间.
我会用实际的物流场景
和网络场景
来分别描述CDN
文章末尾有彩蛋,不要错过.
一、经典网络结构
物流场景:
在网上买个东西,假设发货地是新疆,收货地是福建,来看看地理直线跨度(西藏到黑龙江更远)
正常情况下,专车把这个快递送来,没个5天
以上根本到不了.
网络场景:
最简单的一种网络结构,现在依旧有大量企业在使用(成本低、不追求网页响应速度).它们通常由一个服务器
-> 公网IP
-> DNS
组成.我们访问的顺序就是其倒过来的顺序.
但是这种网络结构有一个非常大的问题,如果服务器离咱们很远(地域距离),那么就会出现很多的网络接驳(转发、代理、协议转换等等),我在 网络访问那点事儿 一文中有过一丢丢提及.导致的结果就是访问很慢,甚至经常因为请求超时无法访问.
二、内容分发网络
内容分发网络
就是分发内容的网络,为的是提高网络的内容响应速度,针对静态内容还提供了缓存策略.请注意,它不是网络加速
,而是类似京东物流的策略,把一些事情提前做了.
物流场景:
京东在全国省会城市设置中央仓,在小区人口密集的区域设置前置仓,坐在家里买个东西,一天内就能送到,前置仓没有就找中央仓,把距离缩短到了市区内.有效的解决了物流运输时间过长的问题.
网络场景:
使用爬虫或者访问时的内容缓存,对网络上的资源进行多地同步存储(数据存多久、多久更新一次取决于CDN
策略,可以自定义).对访问频率高的数据可以设置热点数据高速缓存.
当有人访问时,马上根据访问者的地理位置,选择最近的CDN
区域,再根据CDN
的网络质量寻找最合适的CDN
服务器拿数据,获取数据的基本过程是:
- 找
高速缓存服务器
拿 - 没有再去找
内容存储服务器
拿 - 再没有就去找
源站
拿
而根据CDN
的策略,当获取到数据后可以反向操作.将其存储到内容存储服务器
一段时间,也可以进一步在高速缓存服务器
上存储一段时间.
ps:源站通常是指在经典网络中的一个服务器+公网IP
或一个服务器+DNS
模式,保持协议/主机/端口元组
能够访问到即可.不理解这个的可以看我的另一篇文章 跨域
三、内容分发网络原理
我画了一张图来描述最基本的内容分发网络(CDN)
原理
值得注意的是内容分发网络(CDN)
工作在 OSI协议
的第四层协议(传输层
),所以应用范围不只是 web
四、内容分发网络的简单使用
我找到了一篇介绍的非常好的文章 Cloudflare CDN Reference Architecture
场景1:
- 家庭宽带获取到了
公网ip地址
后不开放80
和443
端口时. - 需要隐藏自己的真实服务器地址时.
- 在不同地域对源站访问速度有要求时
场景1-使用:
只需要找一个其他可以正常访问的端口(假设为8080
),将其配置为CDN
源站即可.
假设源站访问地址是http://「公网ip或DNS」:8080
,使用CDN
之后就可以变成http://DNS
或https://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
其实这两种实施方案原理是一样的
评论区