V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
feiandxs
V2EX  ›  问与答

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

  •  
  •   feiandxs · 2012-05-10 18:25:37 +08:00 · 4450 次点击
    这是一个创建于 4599 天前的主题,其中的信息可能已经有所发展或是发生改变。
    很久前弄一个问题的时候,稍微研究了一下免备案主机这方面的事情。大抵上都是俩办法,一个是机房查的不严,逃过去,不过现在这个已经几乎销声匿迹了。二个就是反向代理了,这个也是老生常谈,没太多好说的。
    可就这时候我听说还有一种很牛逼的方法。域名解析在国外,自然无备案之烦恼。但接受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-
    20 条回复    2014-05-28 09:34:32 +08:00
    virushuo
        1
    virushuo  
       2012-05-10 18:31:02 +08:00
    奥秘在于这样内外的两台机器有个VPN,然后绑一个静态路由。不过我也自己试验过,就是和朋友讨论过这个是可行的。
    qq286735628
        2
    qq286735628  
       2012-05-10 18:44:12 +08:00
    曾经我也在想这个问题,后来发现,现在的DNS,就是这么一个模式,A向B发请求,B返回一个信息给A,A根据信息向C发送请求,C返回实际数据,AC建立通讯。

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

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

    我自己都觉得好纠结的做法~
    ipoh
        4
    ipoh  
       2012-05-10 18:51:12 +08:00
    教你的人也是一知半解
    manhere
        5
    manhere  
       2012-05-10 18:56:35 +08:00
    表示之前对这种方法闻所未闻。。。
    binux
        6
    binux  
       2012-05-10 19:06:07 +08:00
    不知道如何能透明地做到
    lqs
        7
    lqs  
       2012-05-10 21:32:10 +08:00
    假设用户(A),国内服务器(B),国外服务器(C),A向C发送请求,C可以把这次TCP连接的相关信息高速B,让B伪装成C(即在B上把发出的IP包的源地址改成C的地址)。计算好相关checksum即可。
    chaojie
        8
    chaojie  
       2012-05-10 21:42:39 +08:00
    nat数据传输也每次都要过路由的吧. 感觉@lqs说的才靠谱,只能伪造信息
    feiandxs
        9
    feiandxs  
    OP
       2012-05-10 22:45:38 +08:00
    @lqs 怎么看了这个,道理是明白了,但觉得有点像内谁,墙会干的事。。劫持,伪造。。。
    VYSE
        10
    VYSE  
       2012-05-10 23:23:11 +08:00
    这种伪造一TRACERT就发现了吧
    raptium
        11
    raptium  
       2012-05-10 23:26:40 +08:00
    伪造的话,也不是一般人能玩的,会被 router 丢掉的,ISP 没有义务传送不是自己用户的包
    delphiqin
        12
    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
        13
    dianso  
       2012-05-11 00:05:15 +08:00
    应该是BGP线路
    yelusiku
        14
    yelusiku  
       2012-05-11 00:35:59 +08:00
    7楼说的这个像是TCP spoofing
    benzhe
        15
    benzhe  
       2012-05-11 00:36:58 +08:00
    我的理解是,
    如果“国内80端口对外发数据,严格的时候都必须备案” ( @qq286735628 ),
    @virushuo 所说的应该是解决办法。cdn 接受请求后通过 vpn 路由强制走国内服务器线路,这样解决了 tracert 的问题 ( @VYSE ),不需要伪造和修改端口
    不过因为是国外 ip , 所以如果“ISP 没有义务传送不是自己用户的包”( @raptium ),
    那就木有办法了(不过我觉得应该没有这个问题吧,谁能能力测试一下)
    benzhe
        16
    benzhe  
       2012-05-11 00:44:51 +08:00
    上面的方法最终还是由 cdn 返回数据,如果是国内服务器返回数据的话,貌似还是得劫持/过滤什么的...一开始想得太单纯了
    qq286735628
        17
    qq286735628  
       2012-05-11 00:47:49 +08:00
    @benzhe @delphiqin
    国内的CDN服务,域名必须备案后才能使用
    benzhe
        18
    benzhe  
       2012-05-11 00:58:58 +08:00
    @qq286735628 上面我说的是国外的 cdn 哦
    feiandxs
        19
    feiandxs  
    OP
       2012-05-11 01:19:10 +08:00
    @delphiqin 您说的没错,是CDN服务的基本工作原理。
    但这没有解决解析在国外这个问题。
    在备案检查的时候,通过ping命令,dns服务器还是会就近分配IP的。在国内检查的还是遭殃。
    Themyth
        20
    Themyth  
       2014-05-28 09:34:32 +08:00
    我知道怎么做到的,但是这不适合公开。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1049 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:31 · PVG 02:31 · LAX 10:31 · JFK 13:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.