通过DNSPOD智能解析实现CDN国内外分流访问详细教程

此篇文章写给需要结合不同CDN配置DNS记录的小白站长,最开始我也什么都不懂,只知道注册域名然后绑定一个ip地址,以为这样就完事儿了,摸爬滚打踩了无数坑以后才总结出了一套配置方法。我写的这个教程非常适用于想要同时兼容国内外用户体验的站长,因为墙的存在让绝大多数国外免费CDN成为了名副其实的减速云,而国内的CDN都需要备案并且价格昂贵,所以国内外的流量要分流处理才能解决这个痛点。

三种主流的DNS配置方法

由于国内的网络环境复杂,需要多种技术结合来配置域名和CDN加速,总结一下主要有三类方法来配置域名,每种方法都有优缺点,最终的解决方案也许需要多种方法配合使用

直连服务器

此方法最简单,生成一个证书放在根目录即可,如果是用了Let’s EncryptZeroSSL还可以到期自动签发很省事儿,前提是不要设置转向,比如常见的301重定向,把www.example.com重定向到example.com,这样的设置存在就无法自动续签了,需要手动取消重定向后再手动续签,不差钱的可以去买一个有年费的证书,就不需要三个月签一次了。

这个方法的缺点是非常不安全,相当于自己服务器直接告诉了别人,容易遭到DDOS攻击,被扫描端口后暴力破解后台密码等。相当于在推特上发推文告诉了大家你的家庭住址,其实也没多大的事情毕竟小区有门禁和保安,但是扛不住别有用心的人要绞尽脑汁在你家门口蹲点要害你,最好的方法就是别透露自己的位置。

配置CloudFlare(以下简称CF)

这个方法在国外用速度非常快,如果你的网站不针对国内用户开放,这个方法非常推荐,只要不是什么严重违规的网站都不会被CF给踢了。CF相当于在访问者和源服务器之间又加了一层代理,首先CF有自己的DNS服务器,根据用户的地点CF会把用户请求指向最近的CDN边缘加速节点,加速节点再访问你的源服务器,因此配置证书方面会麻烦点,用了CF以后需要生成和配置三个证书。

  • Edge Certificates (边缘节点证书) - 这个不需要你更新,CF会自动更新以确保用户访问者和CF边缘节点可以通信,通常自带两个证书,其中一个是备用
  • Client Certificates (客户端证书) - 这个也基本不用管,是客户端访问API的时候需要加的客户端证书,不是给普通网站访问者用的
  • Origin Server(源站证书)- 这个证书用户保障边缘节点和源站之间的通信安全,CF也会自动生成,并且有效期最长可以选15年,这个证书导入后就啥也不需要管了

要是没有墙并且你也不干什么坏事儿,用免费的CF就可以实现全世界范围内不错的加速和缓存。可惜天不遂人意,国内的网络环境很复杂,国内的用户通过CF访问直接变成了减速云,原因是国内的CF节点很少又被很多人滥用,出现违法内容会导致某些节点被墙,不同运营商的线路差别也很大,前两天的测试就发现联通网络用户基本连不上CF,移动和电信的能连上但也比较慢。以前有些写脚本优选节点的方法,现在也用不来了,哪天CF被完全封禁也很有可能。

配置第三方普通CDN

国内大厂的CDN比如腾讯和阿里的我是没用过,因为这辈子都不可能备案和实名的,所以只能找一个本身自己都没备案的不知名CDN厂商。第三方的CDN用法也差不多,主要工作原理是让你的主域名CNAME到他给你生成的一个二级域名比如abc123.mycdn.com,这个二级域名就相当于一个中间人或者工具人,他间接指向你的源站ip同时由于这个二级域名是无法直接访问的,所以也很好的保护了隐私

以下是路径图:
mysite.com -> abc123.mycdn.com -> edge nodes(CDN厂商边缘节点)-> 源站ip(12.34.56.78)

给你自己的网站域名mysite.com申请证书后要上传到第三方CDN服务商那里,否则是没法启用HTTPS的。

针对国内路线的分流和优化

简单的说就是分两条路,国内的用户就访问第三方CDN,而国外的用户直接用CF就可以,这个说起来简单,做起来又很麻烦,之前我单独划出一个二级域名cf.mysite.com用于CF线路,其余的走根域名mysite.com,原理都一样但是用户都是很懒的,就和被舔废了的女神一样,稍微做个改动他们都不会用或者抱怨太麻烦,大部分人也都懒得开浏览器手动输入网址。针对这个问题我还是找到了解决方法,主要思路都是国内外分流走不同的路线。

前期准备工作

本文源站域名都写mysite.com,注册一个新域名当作工具人用于对接,我们就用域名mysite-proxy.com来表示,这个在CF注册更方便,因为后面要套上CF的服务。再注册一个智能解析服务dnspod使用他们的只能解析来实现国内外分流,这样就可以把来自不同地区的访问者分配到不同的路线,不仅可以按照地区还可以区分不同的运营商。其实国外也有很多提供相同功能的服务,比如亚马逊的Route 53,有强迫症不喜欢国内厂商的可以自己多搜索一下类似的智能解析服务。

更换DNS服务器

用了dnspod就得换成他们的DNS服务器,免费的目前用着也挺好,除了好像不支持DNSSEC,我是一个贫穷又抠门的站长,一个月花1美金我觉得太贵了!主域名别注册在CF那里,因为改不了DNS服务器只能用CF自家的,这坑我又踩过了,反复transfer域名差点导致域名被注销。用dnspod免费服务的话,就在域名商加三个DNS服务器地址,a.dnspod.comb.dnspod.comc.dnspod.com,如果是付费版的话可能会不一样,改了以后全球生效最慢需要72小时。

配置海外路线

海外路线还是走CF这边,这次需要用主域名CNAME到工具人域名的二级域名上,比如主域名mysite.com会被CNAME到ms.mysite-proxy.com,而这个二级域名再指向源ip,记得打开橙色小云开代理,否则就是直连源服务器了有风险。

配置国内路线

这边就不推荐第三方CDN了,原理也在前面一章节已经讲过了,给第三方服务商提供域名和自己源服务器ip,对方就能自动生成一个或者多个工具人二级域名abc123.mycdn.com,和海外路线一样最后要把mysite.com给CNAME到这个二级域名上。

配置DNSPOD根据访问区域分流

由于使用了dnspod,我们才能实现一个域名CNAME到两个不同的地方,dnspod最大的作用就是它可以识别访问者的地理位置等信息,从而把访问者引导到不同的路线上访问源站,因此在CNAME的时候可以加两条记录:

1
2
CNAME mysite.com 默认 ms.mysite-proxy.com
CNAME mysite.com 中国 abc123.mycdn.com

显而易见,默认是使用CF的服务加速访问,遇到ip是中国的就跳到第三方CDN厂商走另外一条路线实现缓存和加速。

配置证书

源服务器需要加证书才能让某几个域名可以加密访问源站增加安全性,因为抠门所以从来没买过付费的SSL证书,就用用Let’s Encrypt和ZeroSSL这种三个月续签一次的,如果单用CF可以15年不用换,配置域名证书分好几种情况。下面是两种最简单的配置方法,如果不考虑国内用户的访问体验和不怕被攻击服务器的可考虑使用:

  • 直连服务器 - 这个不太推荐除非是搭机场直接访问IP地址,宝塔里面设置自动申请证书用三个月,不加HTTPS强制跳转,第三方CDN和域名301跳转的可以直接在宝塔里加个定时任务,快到期的时候自动续期证书,非常方便不需要自己每三个月去手动换一次,但要是没设置好就麻烦了,会出事故导致网站无法访问
  • 配置Cloudflare - 配完理论上15年不用管,源的根证书可以在CF上生成然后加进服务器,用于CF节点和你服务器之间的加密访问,用户和节点之间的证书就不用你操心了,CF会全权负责自动更新,用的也是Let’s Encrypt的三个月免费证书

由于我还是要照顾国内用户的访问体验,所以不能只用CF减速云,需要用两个CDN实现国内外走两条线路分流,操作步骤如下:

  1. 申请一个主域名mysite.com并且不能放在CF,因为CF都不能改DNS服务器,只能是默认的DNS给你解析到一些国内的垃圾节点,国外没问题访问很快。不幸放在CF可以申请auth code把域名迁出放到其他域名商,真不差钱就开CF的企业版。

  2. 申请国内第三方CDN,这个就麻烦点了,得先在宝塔用Let’s Encrypt生成对应几个域名的证书,然后加到CDN服务商后台指定的区域,这样mysite.com才能成功解析到abc123.mycdn.com,否则中间就断了。

  3. 来个工具人域名mysite-proxy.com,每个不同的网站都要开一个二级域名比如ms.mysite-proxy.com,这个工具人域名反倒是在CF上申请域名更方便,从CF然后解析到源站,记得开CF小橘云代理。这样工具人站就用上CF加速并隐藏ip,工具人就是工具人,证书里都不需要加这个工具人域名,所以输入工具人网址是访问不了网站的。

  4. 在dnspod上面确保已经加了根域名CNAME记录解析到工具人二级域名CNAME mysite.com 默认 ms.mysite-proxy.com,CF上面工具人域名要指向源站ip。只有这样主域名最后才能溯源多次指向源服务器地址,总的路线就是dnspod -> mysite.com -> ms.mysite-proxy.com -> CF边缘节点网络 -> 源站服务器

  5. CF上的工具人域名可不是谁都可以CNAME解析到它头上的,工具人只给验证过的女神(主域名)当工具人,其余的骗子都滚。那么如何证明呢?用个形象的比喻就是工具人在自己的额头上刻字儿写“XXX是我的女神”来表忠心,当然还可以写好几位。

    对应CF上的设置就是在以下路径mysite.com - DNS - Custom Hostnames里面进行配置,把解析到任意工具人二级域名xxx.mysite-proxy.com的所有主域名例如mysite.com都加进去,CF收到后会自动生成两条新的TXT记录,需要你加到源站mysite.com的DNS记录中也就是dnspod上面。

  6. 最后就需要耐心等待了,如果前面更换过DNS服务器往往要72小时才能在全球范围内生效,上一步里面加了TXT记录这个东西也不是马上就能识别的,也需要等待几分钟甚至几小时,一旦CF检测到那两条TXT记录,CF马上就会发出一个SSL证书用于访问者和CF中继节点的通信,这个应该会到期自动更新吧。有时候等上几天都没动静,令人绝望!

  7. 坐以待毙不如主动出击,查阅很多资料和站长群里询问无果后我差点放弃,有人说先关了工具人域名的DNSSEC,有人说Universal SSL关了再开,还有暂时关闭小橘云直接连接源站的,我试过都没有用。这个其实是CF自己的问题,好比一个黑箱我们谁也不知道CF什么时候自动去扫那两条TXT记录,我也理解CF不可能每秒都去扫码DNS记录。很多时候Homename Status显示已经激活,而Certificate Status却迟迟没有动静。我试出来的一个解决方案是确认两条TXT记录都加了以后再点编辑,把推荐的TXT Validation改成HTTP Validation,然后返回后不停点刷新几次,不知道什么魔法就会突然被激活。

  8. 有个地方需要改进,那就是最好要记得解析www开头的二级域名,有些用户抱怨网站打不开其实是被浏览器坑了,比如在Chrome浏览器里我发现输入mysite.com会自动变成https://www.mysite.com,这个情况就要设置一个301跳转,好处不仅是成功解析还避免了站点在搜索引擎里权重的分散,最方便的方法就是直接在DNS记录里加一条跳转的记录,如果DNS那边支持的话,不支持的话就得自己在nginx配置文件里改规则。

    www跳转根域名的方法虽然可以用,但是依然存在许多问题。首先RFC协议里规定根域名是不建议使用CNAME的,虽然用上了也可以解析,然而CNAME直接解析到根域名很爽,其他根域名下的记录就遭殃了,很多比如MX就有可能解析不出来了,我发现根域名底下的cookie或多或少也有点问题,所以主站尽量就别用根域名了。除非你把根域名放在CF底下开启小橘云CDN,因为CF有一套奇淫巧计解决了这个规范问题,采用了CNAME flattening技术,又俗称“拉平”技术,让原本的CNAME记录看起来像是从域名直接解析到源站ip从而来符合标准,当然其实开了小橘云中间还是有那么一层隔离,因此不会泄露源站ip。

    一个解决办法是反过来让www子域名解析到主站,然后根域名mysite.com再301永久跳转到www.mysite.com子域名。根域名最好加一层CDN隔离再设置301跳转。CF的CDN各种蛋疼国外快但国内减速,还不能改DNS服务器,其实还有很多别的厂商的CDN可以使用,也都可以用来隐藏ip和实现CDN缓存来减小源站的压力,不要在一棵树上吊死。其实这里不用考虑内容缓存,因为只是做一个301跳转,在CDN那边要设置Redirection from origin加上301,302转向,否则CDN不知道要处理从源服务器返回的redirect(转向通知),另外就算是只设置个跳转规则SSL也还是要开的,否则HTTPS的请求都没反应了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    server
    {
    listen 80;
    listen 443 ssl;
    listen [::]:80;
    listen [::]:443 ssl http2;
    server_name mysite.com;
    return 301 $scheme://www.mysite.com$request_uri;
    }

    上面是额外的nginx配置用于把根域名301转发www子域名,只要证书设置好其实80端口都可以不开,如果开了也没事,只需要在CDN里面设置下HTTP自动跳转HTTPS就可以了,全部设置完以后最好去把缓存清理一下应该就能正常工作了。

域名被墙的预案

这个事情的发生是迟早的,解决方案和女主天地学的,就是域名后加数字,从mysite001.com一直加到几十上百。主域名可以先留着并关闭第三方CDN厂商的路线,只走CF路线给海外用户使用就行了。新的备用域名按照前面的方法走两条路线适配国内外两种情况。

还有一种叫做防红链接的东西,就是在微信QQ里面生成一个中转页面,然后再跳到浏览器里面去打开,防止被国内几个流氓软件屏蔽和导致最终被墙。当然最后做大了的话,肯定还是会被工信部还有国安局手动墙掉的,规模小还能藏起来没人注意,规模大了和大象一样大就用什么都遮不住了。