验证实验:基于地理位置解析的域名作为Cloudflare Spectrum的源

验证实验:基于地理位置解析的域名作为Cloudflare Spectrum的源

背景

Cloudflare的Spectrum可以为TCP端口的四层服务提供扛DDOS、隐藏实际服务端口等安全防护功能。

现在我们假设有一个域名spectrum-origin-domain.aeolusnet.com;

该域名做了基于地理位置的DNS解析,比如美国地区解析为美国服务器IP1、中国香港地区解析为香港服务器IP2(这也是常见的一种部署方式,保证用户可以就近接入可用的服务器);

此时,如果我们配置一个spectrum防护服务,把该域名作为spectrum的源站,然后把spectrum提供的anycast高防IP,作为用户接入的IP;

则,用户的请求在经过spectrum防护后,送到源站的过程中,会保证用户的请求可以就近走到对应的源站服务器上吗?

针对这个问题,我们计划搭建一个测试环境,以便尝试得到上述问题的答案。

思路

为了完成本次验证,目前想到几个关键问题点:

  1. Spectrum配置域名作为源站,是否对域名有限制;
  2. 如何搭建环境,直观的体现测试结果。

为了确认如上几个关键点,先进行如下验证。

关键点1

目前在我Cloudflare账号中,已经注册在Cloudflare的域名有限。

我们先找一个已经配置了spectrum的域名,在不影响生产环境的情况下,进行如下测试:

一、在Cloudflare的XXgroup.com的zone下面,新增spectrum配置,其Origin源站配置为另一个zone的现有域名blog.axesdn.com,提交后,得到报错如下图。

报错为:

You may only use DNS records or Load Balancers that are on the same zone or on permitted zones, as origins. (Code: 11050)

意思是说,如果要用域名作为源的话,得用相同的zone也就是相同的一级域名,或者被允许的域名。

Cloudflare还有相关的API指令可以做类似操作,reference:

https://api.cloudflare.com/#spectrum-applications-create-spectrum-application-using-a-name-for-the-origin

我们用postman软件,发送相应的API试一下。

得到的报错结果相同,所以后面我就统一用GUI来操作了。

二、在Cloudflare的XXgroup.com的zone下面,新增spectrum配置,其Origin源站配置为当前zone的域名spectrum-test.XXgroup.com,提交后,得到报错如下图。

报错和上面一样。

三、在Cloudflare的XXgroup.com的zone下面,配置域名spectrum-test.XXgroup.com的DNS解析,A记录解析到某IP,再新增spectrum配置,其Origin源站配置为上述域名。

此时spectrum便可以成功配置了。

完整的spectrum配置页面如下图。

四、在Cloudflare的XXgroup.com的zone下面,配置域名spectrum-test.XXgroup.com的DNS解析,CNAME解析到某域名,再新增spectrum配置,其Origin源站配置为上述域名。

此时spectrum也可成功配置,这里不重复截图了。

小结:

通过上述配置,我们了解到:

  1. Spectrum的源站如果是域名,则必须是该配置页面下(也就是Cloudflare的zone)的相同一级域名,不能是随便写的其他域名;
  2. spectrum配置的源域名,必须在Cloudflare的DNS配置中,有对应的DNS解析条目,该解析可以是A记录,也可以是CNAME。

关键点2

有了关键点1的测试结论,我们就可以尝试梳理出一个测试环境了,该环境配置概述如下:

  1. 在美国和中国香港分别部署一个http服务器,通过TCP 80端口提供服务,访问页面显示其服务器所在位置;
  2. Cloudflare的DNS中配置域名spectrum-origin-domain.XX.com,cname到spectrum-origin-cname.axesdn.net;
  3. 域名spectrum-origin-cname.axesdn.net配置基于地理位置的DNS解析:
    • 美国区域,解析为美国服务器IP1;
    • 其他默认区域,解析为香港服务器IP2;
  4. Cloudflare上配置spectrum,配置spectrum域名spectrum-front-domain.XX.com,用于给用户访问,提供服务端口为TCP 80,防护的源为spectrum-origin-domain.XX.com的80端口;
  5. 完成上一步创建后,用户访问spectrum-front-domain.XX.com.cdn.cloudflare.net这个域名,即可访问到spectrum的带防护的anycast IP。

注意:

这里第2条中,spectrum-origin-domain.XX.com的DNS解析,必须在公网生效,否则第4条中,spectrum在尝试解析源站spectrum-origin-domain.XX.com时不会生效。

这就意味着,我们除了需要在Cloudflare中注册域名XX.com,同时,还必须有这个域名公网DNS解析的管理权限。

验证

我们最终决定用aeolusnet.com这个域名来做测试,配置测试环境如下:

  1. 在美国和中国香港分别部署一个http服务器,通过TCP 80端口提供服务,访问页面显示其服务器所在位置;
  2. Cloudflare的DNS中配置域名spectrum-origin-domain.aeolusnet.com,cname到spectrum-origin-cname.aeolusnet.com;
  3. Cloudflare上配置spectrum,配置spectrum域名spectrum-front-domain.aeolusnet.com,用于给用户访问,提供服务端口为TCP 80,防护的源为spectrum-origin-domain.aeolusnet.com的80端口;
  4. aeolusnet.com的公网DNS解析管理处,新增如下公网DNS解析:
    • 域名spectrum-origin-domain.aeolusnet.com,cname到spectrum-origin-cname.aeolusnet.com;
    • 域名spectrum-origin-cname.aeolusnet.com配置基于地理位置的DNS解析:
      • 美国区域,解析为CNAME web-us.yushuoxin.one;
      • 其他默认区域,解析为CNAME web-hk.yushuoxin.one;
    • 域名user-acess-domain.aeolusnet.com,cname到spectrum-front-domain.aeolusnet.com.cdn.cloudflare.net;
  5. yushuoxin.one的公网DNS解析管理处,新增如下公网DNS解析:
    • web-us.yushuoxin.one解析为美国服务器IP1;
    • web-hk.yushuoxin.one解析为香港服务器IP2;
  6. 完成上一步创建后,用户访问user-acess-domain.aeolusnet.com这个域名,即可访问到spectrum的带防护的anycast IP。

下面开始操作。

1. 香港起一个AWS EC2,并配置合适的安全组(开放ssh http)。

登陆EC2配置如下指令:

# get admin privileges
sudo su
# install httpd (Linux 2 version)
yum update -y
yum install -y httpd.x86_64
systemctl start httpd.service
systemctl enable httpd.service
echo "Hi~ This is a server on Hong Kong from AWS EC2 $(hostname -f)" > /var/www/html/index.html

然后浏览器访问http://web-hk.yushuoxin.one/,即可看到“Hi~ This is a server on Hong Kong from AWS EC2……”

美西California也起一个EC2,步骤类似,页面文字描述“Hong Kong”处改为“USA”。

然后浏览器访问http://web-us.yushuoxin.one/,即可看到“Hi~ This is a server on USA from AWS EC2……”

2. Cloudflare的DNS中配置域名spectrum-origin-domain.aeolusnet.com,cname到spectrum-origin-cname.aeolusnet.com;

3. Cloudflare上配置spectrum,配置spectrum域名spectrum-front-domain.aeolusnet.com,用于给用户访问,提供服务端口为TCP 80,防护的源为spectrum-origin-domain.aeolusnet.com的80端口;

4. aeolusnet.com的公网DNS解析管理处,新增如下公网DNS解析:

  • 域名spectrum-origin-domain.aeolusnet.com,cname到spectrum-origin-cname.aeolusnet.com;
  • 域名spectrum-origin-cname.aeolusnet.com配置基于地理位置的DNS解析:
    • 美国区域,解析为CNAME web-us.yushuoxin.one;
    • 其他默认区域,解析为CNAME web-hk.yushuoxin.one;
  • 域名user-acess-domain.aeolusnet.com,cname到spectrum-front-domain.aeolusnet.com.cdn.cloudflare.net;

5. yushuoxin.one的公网DNS解析管理处,新增如下公网DNS解析:

  • web-us.yushuoxin.one解析为美国服务器IP1;
  • web-hk.yushuoxin.one解析为香港服务器IP2;

最后,按照我们的设计,当访问套用了spectrum服务的域名http://user-acess-domain.aeolusnet.com/时,spectrum应该可以基于地理位置做解析:

好!万事俱备了~~我们开始验证。

一、从美国出口1测试:

访问https://whatismyipaddress.com/查看本机当前出口IP如下图

访问http://user-acess-domain.aeolusnet.com/

看到“This is a server on USA……”

二、从美国出口2测试:

访问https://whatismyipaddress.com/查看本机当前出口IP如下图

访问http://user-acess-domain.aeolusnet.com/

看到“This is a server on USA……”

三、从香港出口1测试:

访问https://whatismyipaddress.com/查看本机当前出口IP如下图

访问http://user-acess-domain.aeolusnet.com/

看到“This is a server on Hong Kong……”

四、从东京出口1测试:

访问https://whatismyipaddress.com/查看本机当前出口IP如下图

访问http://user-acess-domain.aeolusnet.com/

看到“This is a server on Hong Kong……”

上述测试结果可见,访问的页面确实都是就近的服务器。

注:上述测试中提到的域名解析和EC2资源,在测试完成后都释放掉了。所以现在无法访问到了,因此服务器IP之类的,我也就不打码了。

小结

上面的测试,验证了我们的猜想,即:

如果Cloudflare的spectrum上配置的源是域名,且该域名是基于地理位置做不同解析的,则用户去访问这个spectrum的时候,可以根据用户的地理位置,走到spectrum后面域名的就近的源站IP。

写在后面的话

其实根据我们的经验,这部分的工作机制应该就是我们猜想的那样,只不过通过这次搭建一个小的测试环境,也算验证了我们的猜想。

在做这个验证之前,我还请教了下chatGPT,也得到了肯定的答案,但是本着质疑的态度,我也让chatGPT提供了他回答参考的网站或者链接。但是~但是~它给我的链接,除了wiki的那个,其他的都不可用(虽然那些链接长得挺像那么回事儿的),因此它说的话我也不敢全信,所以才有了这次验证。

请教chatGPT的截图也附上,就当图一乐吧~~

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注