真心求教一个问题,解析在国外,返回数据确是从国内服务器走的,这其中的原理是?

2012-05-10 18:25:37 +08:00
 feiandxs
很久前弄一个问题的时候,稍微研究了一下免备案主机这方面的事情。大抵上都是俩办法,一个是机房查的不严,逃过去,不过现在这个已经几乎销声匿迹了。二个就是反向代理了,这个也是老生常谈,没太多好说的。
可就这时候我听说还有一种很牛逼的方法。域名解析在国外,自然无备案之烦恼。但接受web服务器返回的80端口的数据的时候,却是从国内服务器返回给用户,速度自然大是不同。当时我觉得这是天方夜谭,以我粗浅的网络知识我都知道,我是跟国外服务器握手的,你个国内服务器跑过来响应我的请求算哪门子事,我本机也不认你呀。
但看到有人说的确是这样,我就稍微探究了一下,请教了一个人,大概是这么说的。

“说白了,(国外)CDN服务器相当于一个中转DNS,只是这个DNS在国外。触发信道端口不是默认的,是分发中转的。所以域名不需要进行备案,因为直接Ping域名出来的是CDN服务器的地址。”

“你研究一下局域网的NAT原理就明白了,把一个端口映射给一个IP。只是这个稍微改装一下,是公网的NAT映射。由于http协议默认都是80端口,所以中转服务器需要一个数据库,来识别不同域名。另外一个就是这个端口是可以动态分配回收的,从而满足上万的转发。”

看到这里仍然云里雾里,似乎有点门道,但又说不出什么来。这位大师于是又指点我。

“QQ的文件传输你想想,QQ服务器就相当于CDN 比如A用户要给B用户发数据会出现什么情况。”
“整个握手是要走2次CDN的,但是页面的数据传输是点对点的。第1次是问地址,第2次是答地址。”


今天想起这件事来,于是又翻了下找到当时这段记录(QQ聊天记录能入mysql就好了,现在检索太慢了……),研读了十几遍,还是觉得无法理解。
我困惑的就是,为什么我向A发起的请求,A告诉B,B直接就返回给了我,都不经过A了?
这倒似乎和LVS里的direct routing有点像了……
因为也好久没关注过这方面的事情,所以也没找到什么实力。V2EX牛人众多,不知道有没有从事研究过这方面东西的,是否有人在实际使用类似的系统,求指教,先行拜谢了。

-eof-
4458 次点击
所在节点    问与答
20 条回复
virushuo
2012-05-10 18:31:02 +08:00
奥秘在于这样内外的两台机器有个VPN,然后绑一个静态路由。不过我也自己试验过,就是和朋友讨论过这个是可行的。
qq286735628
2012-05-10 18:44:12 +08:00
曾经我也在想这个问题,后来发现,现在的DNS,就是这么一个模式,A向B发请求,B返回一个信息给A,A根据信息向C发送请求,C返回实际数据,AC建立通讯。

你上面说的,我向A发请求,A告诉B,B返回给我,有点像回调函数的意思。
qq286735628
2012-05-10 18:49:46 +08:00
貌似国内80端口对外发数据,严格的时候都必须备案吧~

能不能在DNS上面做手脚,让解析出来的IP带上其他端口号,然后通过.htaccess之类的方法把端口号隐藏起来,不显示在浏览器地址栏。

我自己都觉得好纠结的做法~
ipoh
2012-05-10 18:51:12 +08:00
教你的人也是一知半解
manhere
2012-05-10 18:56:35 +08:00
表示之前对这种方法闻所未闻。。。
binux
2012-05-10 19:06:07 +08:00
不知道如何能透明地做到
lqs
2012-05-10 21:32:10 +08:00
假设用户(A),国内服务器(B),国外服务器(C),A向C发送请求,C可以把这次TCP连接的相关信息高速B,让B伪装成C(即在B上把发出的IP包的源地址改成C的地址)。计算好相关checksum即可。
chaojie
2012-05-10 21:42:39 +08:00
nat数据传输也每次都要过路由的吧. 感觉@lqs说的才靠谱,只能伪造信息
feiandxs
2012-05-10 22:45:38 +08:00
@lqs 怎么看了这个,道理是明白了,但觉得有点像内谁,墙会干的事。。劫持,伪造。。。
VYSE
2012-05-10 23:23:11 +08:00
这种伪造一TRACERT就发现了吧
raptium
2012-05-10 23:26:40 +08:00
伪造的话,也不是一般人能玩的,会被 router 丢掉的,ISP 没有义务传送不是自己用户的包
delphiqin
2012-05-10 23:57:20 +08:00
我对此也是一知半解,大概说一下我对CDN的了解:
你在使用CDN之前,需要先将你的域名A设置成CNAME解析,指向CDN提供商给你的域名B
然后当一个用户访问你的网站时,他会先向你的域名A的DNS发起域名解析请求,然后因为你的域名设置的是CNAME解析,所以会将CDN的域名B返回给用户,于是用户再向域名B的DNS发起解析请求,CDN提供商会将域名B的DNS指向全局负载均衡DNS,此全局负载均衡DNS会根据用户的地理位置(由IP得到)将域名B解析为离用户最近节点N的IP并返回给客户。至此,域名解析完成,用户拿到了CDN节点N的IP,之后,用户向此节点发送请求,获取内容。
如果节点N上没有用户要请求的内容,则节点N向你的服务器(这个需要事先在CDN提供商的后台设置)发起此内容的请求,你的服务器返回后,节点N缓存并返回给用户。
以上说的是内容缓存在CDN提供商的节点上的情况。如果你希望使用自己的服务器做内容缓存,那将CDN提供商的节点换成你的服务器即可。
dianso
2012-05-11 00:05:15 +08:00
应该是BGP线路
yelusiku
2012-05-11 00:35:59 +08:00
7楼说的这个像是TCP spoofing
benzhe
2012-05-11 00:36:58 +08:00
我的理解是,
如果“国内80端口对外发数据,严格的时候都必须备案” ( @qq286735628 ),
@virushuo 所说的应该是解决办法。cdn 接受请求后通过 vpn 路由强制走国内服务器线路,这样解决了 tracert 的问题 ( @VYSE ),不需要伪造和修改端口
不过因为是国外 ip , 所以如果“ISP 没有义务传送不是自己用户的包”( @raptium ),
那就木有办法了(不过我觉得应该没有这个问题吧,谁能能力测试一下)
benzhe
2012-05-11 00:44:51 +08:00
上面的方法最终还是由 cdn 返回数据,如果是国内服务器返回数据的话,貌似还是得劫持/过滤什么的...一开始想得太单纯了
qq286735628
2012-05-11 00:47:49 +08:00
@benzhe @delphiqin
国内的CDN服务,域名必须备案后才能使用
benzhe
2012-05-11 00:58:58 +08:00
@qq286735628 上面我说的是国外的 cdn 哦
feiandxs
2012-05-11 01:19:10 +08:00
@delphiqin 您说的没错,是CDN服务的基本工作原理。
但这没有解决解析在国外这个问题。
在备案检查的时候,通过ping命令,dns服务器还是会就近分配IP的。在国内检查的还是遭殃。
Themyth
2014-05-28 09:34:32 +08:00
我知道怎么做到的,但是这不适合公开。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/35382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX