Stay Hungry. Stay Foolish.

CNAME 接入 Cloudflare

为何选择 CNAME 接入 Cloudflare

Cloudflare 是国外 CDN 厂商,提供免备案无限流量 CDN,免费的 HTTPS 证书和无限量的 DDOS 防御,深受中小站长的喜爱,海外线路非常不错,国内的话移动线路也很棒。可惜的是默认免费版只能进行 NS 记录,这意味着还需要更改域名的 NS,实在是麻烦。CNAME 接入方式只支持 200 美元/月以上的 Business 或 Enterprise plan,这对于很多人来说都太贵了。同时 CNAME 接入可以完成一些骚操作,比如利用 GEO DNS 实现分区解析,国内 CDN + 海外 CDN 实现全球加速。

作为 Cloudflare 的 Partner 也就是所谓“合作伙伴”,我可以提供免费的 CNAME 接入方案,只需在 我的面板 登录 Cloudflare 账户即可,完全利用 Cloudflare 官方的 API,不涉及任何安全问题。

接入步骤

注意您输入的用户名和密码对 Partner 不可见,面板也不会获取您的 Global API Key,您的隐私安全可以得到保障。

  • 添加域名(注意域名不能在 Cloudflare 官方,百度云加速或其他 Cloudflare Partner 接入)

add

  • 查看域名,并修改解析

source

最重要的是要修改的是源站地址,在修改界面,填写源站的 CNAME 地址,注意是 CNAME 地址不是 IP 地址,如果源站服务器不提供域名的话怎么办呢,那就自行添加一条记录就 OK 啦。

然后我们需要在 DNS 管理商那边按需添加自己的 DNS,将 example.comwww.example.com 分别解析到 example.com.cdn.cloudflare.netwww.example.com.cdn.cloudflare.net 即可实现 CNAME 接入 Cloudflare.

当然如果你想要薅羊毛的话,可以直接解析到 www.cloudflare.com 享受 Cloudflare 5000 刀节点。

免费使用 Cloudflare Railgun

Railgun:一切皆可缓存

Cloudflare 的 Railgun 使用高级网络优化,确保尽快交付客户内容。过去,大多数 Web 内容无法缓存是因为它们是动
态的。然而,即便动态内容的变化速度十分缓慢也无法缓存。Railgun 会跟踪页面变化,一直向下跟踪至字节,并仅发
送整个网络上实际变化的字节。
Railgun 实现了 99.6% 的压缩率,这意味着,过去需要 200 个数据包才能发送的内容现在只需单个数据包即可发送。
这样一来,便为网站访问者带来 140% 的性能提升。
Railgun 可以与 Cloudflare 的其他性能优化技术结合使用,其中包括自动网络路由优化、SPDY 支持、Polish™ 和
Mirage™ 图像优化以及 Rocket Loader™。通过这套工具,Cloudflare 可确保您的主机托管服务在世界各地都尽可能快
地运行。

简单来说,Railgun 能让源站的动态内容几乎全部静态化,进而大大加快加载的速度,也能一定程度上缓解对于动态页面的 CC 攻击,当然正常的用户需要付出 200 刀才可以享受这一特性,那么作为 Partner 用户,也可以免费享受这一特性。

在源站安装 Railgun

  • CentOS 7
sudo rpm -ivh http://pkg.cloudflare.com/cloudflare-release-latest.el7.rpm
sudo yum update && yum install railgun-stable -y
  • Ubuntu 16 / Debian 9
# Ubuntu 16
echo 'deb http://pkg.cloudflare.com/ xenial main' | sudo tee /etc/apt/sources.list.d/cloudflare-main.list
# Debian 9
echo 'deb http://pkg.cloudflare.com/ stretch main' | sudo tee /etc/apt/sources.list.d/cloudflare-main.list
# 安装过程一致
curl -C - https://pkg.cloudflare.com/pubkey.gpg | sudo apt-key add -
sudo apt-get update && sudo apt-get install railgun-stable -y

会自动安装 Railgun Server 和 memcached,其中 memcached 的版本一般非常老,如果需要的话可以自行编译安装新版。

修改配置并启动

vi /etc/railgun/railgun.conf

找到如下两行进行修改:

activation.token = <这里填写 Railgun 的 Token>
activation.railgun_host = <这里填写服务器的公网 ip>

然后启动 Railgun

service railgun start

成功的话可以看到面板上已经显示开通。

关于 Cloudflare 的一些设置

Cloudflare 有很多可选择的配置这边简单的列出一些,包括源站和 CF 面板上的配置。

Real-IP

加了 CDN 以后如何获取访客真实 IP 是一个问题,特别是加了 Railgun 以后,日志里所有的访问 IP 都是本机这就很尴尬了
我们建立一个 cloudflare.conf 放在 conf.d 中,在 http 块或者 server 块中引入即可。

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
real_ip_header CF-Connecting-IP;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
real_ip_recursive on;
# V6 部分可以自行决定是否选择

防止泄漏源站 IP

在 nginx http 块中添加:

# 禁止外网访问
allow 127.0.0.1/8;
allow 10.0.0.0/8;
allow 192.168.0.0/16;
# allow railgun server ip
deny all;

在 nginx server 模块中写 listen 127.0.0.1:80,然后对外网开启 2408 Railgun 端口。

如何修利用 API 修改源站地址

有同学觉得源站设置为 CNAME 地址很麻烦,而且有泄露源 IP 的风险,当然 Cloudflare 默认的 Partner API 就是这样的,当然这边有个利用 API 手动设置源站的办法。

  • 获取 Global API Key

首先要说明,Global API Key 非常重要,相当于你的账户邮箱和密码,普通的 CNAME 接入不需要获取 Global API Key 就可以修改,但是部分面板会有获取该密钥,请务必注意账户安全。

个人信息页面 最下方获取 Global API Key,最好用小本本记下来。下面我们会用 your_cloudflare_global_api_key 来代替该密钥。

  • 获取 Domain ID

Domain ID 就是你需要更改源站的标志,假设你的域名为 example.com,Cloudflare 账户邮箱为mail@example.com 执行如下代码:

curl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com&status=active&page=1&per_page=20&order=status&direction=desc&match=all" \
     -H "X-Auth-Email: mail@example.com" \
     -H "X-Auth-Key: your_cloudflare_global_api_key" \
     -H "Content-Type: application/json"

返回记录里找到 "id":"your_account_domain_id","name":"example.com" 内容,记录为 your_account_domain_id

  • 获取 DNS Record ID

这边是你需要修改的某个域名的记录,假设已经存在的,要修改的记录为 CNAME www cf.www.example.com,我们这样操作:

curl -X GET "https://api.cloudflare.com/client/v4/zones/your_account_domain_id/dns_records?type=CNAME&name=www.example.com&content=cf.www.example.com&page=1&per_page=20&order=type&direction=desc&match=all" \
     -H "X-Auth-Email: mail@example.com" \
     -H "X-Auth-Key: your_cloudflare_global_api_key" \
     -H "Content-Type: application/json"

返回记录里找到 "id":"your_account_dns_record_id","type":"CNAME" 内容,记录为 your_account_dns_record_id

  • 修改该 DNS 记录

终于到了修改源站的部分了,利用之前获得的 your_account_domain_id your_account_dns_record_id 我们进行如下操作:

curl -X PUT "https://api.cloudflare.com/client/v4/zones/your_account_domain_id/dns_records/your_account_dns_record_id" \
     -H "X-Auth-Email: mail@example.com" \
     -H "X-Auth-Key: your_cloudflare_global_api_key" \
     -H "Content-Type: application/json" \
     --data '{"type":"A","name":"www.example.com","content":"8.8.8.8","ttl":120,"proxied":false}'

就完成了对源站的修改,新源站记录为 A www 8.8.8.8,一旦修改完毕源站地址,在管理面板上就看不到该条记录了。所以推荐在之前配置已经生效的情况下操作。