验证实验:基于地理位置解析的域名作为Cloudflare Spectrum的源
背景
Cloudflare的Spectrum可以为TCP端口的四层服务提供扛DDOS、隐藏实际服务端口等安全防护功能。
现在我们假设有一个域名spectrum-origin-domain.aeolusnet.com;
该域名做了基于地理位置的DNS解析,比如美国地区解析为美国服务器IP1、中国香港地区解析为香港服务器IP2(这也是常见的一种部署方式,保证用户可以就近接入可用的服务器);
此时,如果我们配置一个spectrum防护服务,把该域名作为spectrum的源站,然后把spectrum提供的anycast高防IP,作为用户接入的IP;
则,用户的请求在经过spectrum防护后,送到源站的过程中,会保证用户的请求可以就近走到对应的源站服务器上吗?
针对这个问题,我们计划搭建一个测试环境,以便尝试得到上述问题的答案。
思路
为了完成本次验证,目前想到几个关键问题点:
- Spectrum配置域名作为源站,是否对域名有限制;
- 如何搭建环境,直观的体现测试结果。
为了确认如上几个关键点,先进行如下验证。
关键点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:
我们用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也可成功配置,这里不重复截图了。
小结:
通过上述配置,我们了解到:
- Spectrum的源站如果是域名,则必须是该配置页面下(也就是Cloudflare的zone)的相同一级域名,不能是随便写的其他域名;
- spectrum配置的源域名,必须在Cloudflare的DNS配置中,有对应的DNS解析条目,该解析可以是A记录,也可以是CNAME。
关键点2
有了关键点1的测试结论,我们就可以尝试梳理出一个测试环境了,该环境配置概述如下:
- 在美国和中国香港分别部署一个http服务器,通过TCP 80端口提供服务,访问页面显示其服务器所在位置;
- Cloudflare的DNS中配置域名spectrum-origin-domain.XX.com,cname到spectrum-origin-cname.axesdn.net;
- 域名spectrum-origin-cname.axesdn.net配置基于地理位置的DNS解析:
- 美国区域,解析为美国服务器IP1;
- 其他默认区域,解析为香港服务器IP2;
- Cloudflare上配置spectrum,配置spectrum域名spectrum-front-domain.XX.com,用于给用户访问,提供服务端口为TCP 80,防护的源为spectrum-origin-domain.XX.com的80端口;
- 完成上一步创建后,用户访问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这个域名来做测试,配置测试环境如下:
- 在美国和中国香港分别部署一个http服务器,通过TCP 80端口提供服务,访问页面显示其服务器所在位置;
- Cloudflare的DNS中配置域名spectrum-origin-domain.aeolusnet.com,cname到spectrum-origin-cname.aeolusnet.com;
- Cloudflare上配置spectrum,配置spectrum域名spectrum-front-domain.aeolusnet.com,用于给用户访问,提供服务端口为TCP 80,防护的源为spectrum-origin-domain.aeolusnet.com的80端口;
- 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;
- yushuoxin.one的公网DNS解析管理处,新增如下公网DNS解析:
- web-us.yushuoxin.one解析为美国服务器IP1;
- web-hk.yushuoxin.one解析为香港服务器IP2;
- 完成上一步创建后,用户访问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应该可以基于地理位置做解析:
- 从美国访问http://user-acess-domain.aeolusnet.com/,应该看到“This is a server on USA……”
- 从其他区域访问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 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的截图也附上,就当图一乐吧~~
发表回复