介绍
Willow Commons 已经有一个正常运行的社区网站。在迁移之前,先弄清客户端实际使用哪个地址。保存的 DNS 记录、缓存中的回答和网站响应,分别描述了请求过程中的不同环节。
你将先使用正常网站,再比较真实权威服务器与独立缓存解析器,并修改一个单独的练习名称。本单元不会改变社区正式使用的网站名称。两个 HTTP 后端和 DNS 服务已准备在隔离的 Linux 网络命名空间中,它们共享一个 VM 内核。
你应熟悉输入终端命令、识别路径和切换标签页。本实验会解释所需的 DNS 命令和少量配置编辑,不要求公共域名账户或 BIND 管理经验。请预留约 40 分钟,包括阅读和处理普通错误;这是作者估计。
使用正常运行的命名网站
在这一步中,你将阅读社区现有网站并保存它的真实活动安排。先打开 Community Preview,选择 Warm Client。你应看到 Willow Commons 页面、三项聚会,以及 old location 标签。选择 Download the programme 并打开下载的文本。位置标签表示后端身份,并非成功动画。

先阅读页面顶部附近的位置标签,再使用三项聚会下方的 Download the programme。图中的页面是真实旧后端返回的响应。
预览会从选定的课程客户端发起真实 DNS 查询和 HTTP 请求。外层平台 URL 是浏览器网关,并不表示你的电脑使用了课程 DNS。浏览器刷新会发出新请求,但不会清空课程解析器缓存。暂时不要使用 Fresh Client。
切换到 Warm Client 终端。它从 /home/labex/project/site-move/warm 启动,并拥有自己的解析器设置。pwd 打印当前目录:
pwd
DNS,即域名系统,把名称映射到地址。A 记录把名称映射到 IPv4 地址。随后 HTTP 使用该地址和端口请求内容。这里的名称是 site.community.test;8081 是 HTTP 端口,并不是 DNS 记录的值。.test 是保留的测试后缀,不是公共社区域名。
curl 发出 HTTP 请求。--noproxy '*' 表示本次请求完全不使用代理;引号使星号保持字面含义。-f 把 HTTP 错误视为失败,-s 隐藏进度条,-S 仍显示错误。--max-time 5 将请求限制为五秒:
curl --noproxy '*' -fsS --max-time 5 http://site.community.test:8081/
你应看到包含 Willow Commons 和 old location 的 HTML。终端显示源码文本,浏览器则渲染同一个页面。现在下载真实文本资源。-o programme.txt 把响应保存在这个客户端的当前目录中:
curl --noproxy '*' -fsS --max-time 5 -o programme.txt http://site.community.test:8081/programme.txt
cat 打印已保存文件:
cat programme.txt
你应看到全部三项聚会、无台阶入口信息和 Service location: old。仅有文件或 HTTP 状态,不能证明内容正确。
如果 curl 报告 Could not resolve host,请检查名称拼写。Failed to connect 表示没有建立 HTTP 连接;它不同于 HTTP 404,后者表示服务器已回答,但路径不存在。修正拼写错误后,重试所示 URL。不要修改平台 DNS、/etc/hosts 或课程解析器文件。如果打开了另一个终端,请使用实际的 Warm Client 标签页,并在保存文件前执行 cd /home/labex/project/site-move/warm。文件和终端工作目录属于各自客户端;浏览器下载的文件则属于浏览器。
比较权威服务器与缓存
在这一步中,你将区分源记录与临时缓存副本。留在 Warm Client。权威服务器负责 community.test,地址为 10.94.0.2。客户端的缓存解析器监听 127.0.0.1,也就是这个客户端内部的回环地址。另一个客户端拥有独立的解析器和缓存。
dig 用于向 DNS 提问。@10.94.0.2 显式选择服务器,A 请求 IPv4 地址。+noall 隐藏 dig 通常显示的各个部分,+answer 则显示回答行:
dig @10.94.0.2 site.community.test A +noall +answer
你应看到类似下面的记录行:
site.community.test. 120 IN A 10.94.0.10
各列依次是名称、TTL、类别、类型和地址。TTL,即生存时间,表示回答可以在缓存中保留多少秒。IN 表示 Internet 类别。结尾的点表示完整 DNS 名称。空格和制表符可能不同。
接着询问课程客户端的解析器:
dig @127.0.0.1 site.community.test A +noall +answer
地址仍应为 10.94.0.10,但 TTL 可能较低,因为先前请求已经填充了缓存。sleep 5 等待真实的五秒,不会改变 DNS:
sleep 5
dig @127.0.0.1 site.community.test A +noall +answer
通常剩余 TTL 会降低。如果先前的副本已过期,解析器会重新询问权威服务器,TTL 就会回升到接近 120。阅读本实验可能耗尽整个间隔。这属于正常过期,并不意味着缓存损坏;不要求在 setup 刚结束时抓住某个观察窗口。
为接下来的编辑使用另一个名称。它指向同一个旧后端,但不是社区的正式站点名称:
dig @127.0.0.1 practice.community.test A +noall +answer
留意名称、地址和剩余 TTL。查询成功不表示网站一定可达;步骤 1 已单独执行 HTTP 请求。运行本步骤的检查,然后先阅读下一步,再开始短暂的修改和比较过程。
修改练习记录并等待缓存过期
在这一步中,你将验证一个小范围的记录编辑,把它加载到权威服务器,并观察为什么降低 TTL 不能缩短已缓存副本的寿命。你只能修改 practice 和必要的 SOA serial,它们位于 community.zone 中。保留正式 site、keep、名称服务器和两个网站。
先阅读下方编辑说明。然后在 Warm Client 中再次查询练习名称,紧接着切换标签页:
dig @127.0.0.1 practice.community.test A +noall +answer
如果只剩几秒,请等待该间隔结束,并在权威服务器仍保留原记录时再次查询。这是通过真实 DNS 请求重新获得观察窗口,不会清空缓存。新副本最多持续 120 秒;按自己的节奏操作,错过时使用后面的恢复说明。
切换到 DNS Desk,它的目录为 /home/labex/project/site-move。阅读文件:
cat community.zone
zone 是权威服务器为 DNS 某个区域维护的数据集。$TTL 120 提供默认生存时间。practice 120 IN A 10.94.0.10 为练习名称显式设置生存时间和地址。SOA,即起始授权记录,包含一个 serial 版本号。发布变更时要增大该数字,并保留其他 SOA 值。DNS 生存时间与 SOA 计时器用途不同。这里的 @ 代表 zone 起点 community.test.。NS 指定其权威服务器,而 ns A 记录提供该服务器的地址。括号把 SOA 字段组合成一条记录。现有的刷新、重试、到期和负缓存值属于 zone 管理配置,请保持不变;它们不是练习 A 记录的 TTL。
下面的 here-document 写入完整的小型 zone。> 会替换文件。带引号的 'ZONE' 使 $TTL 保持字面文本,而不是展开为 shell 变量。结尾的 ZONE 必须位于行首。复制整个代码块:
cat > community.zone <<'ZONE'
$TTL 120
@ IN SOA ns.community.test. admin.community.test. (2 60 30 3600 30)
@ IN NS ns.community.test.
ns IN A 10.94.0.2
site 120 IN A 10.94.0.10
practice 45 IN A 10.94.0.20
keep 120 IN A 10.94.0.10
ZONE
这里只改变了练习地址、生存时间和 serial。named-checkzone 验证完整的已保存 zone,但不会加载它。第一个参数是 zone 名称,第二个参数是文件:
named-checkzone community.test community.zone
你应看到 loaded serial 2,随后是 OK。这只是文件验证结果,并不证明运行中的权威服务器已加载它。如果语法检查失败,请阅读文件、恢复完整代码块,然后再次检查。保存的文件即使有语法错误,之前的运行中 zone 也会一直可用,直到成功加载有效配置。
sudo 用于执行这一条管理命令。提供的窄范围辅助程序会在课程权威服务器内部调用 BIND 的真实 rndc reload community.test,不会重启任一缓存:
sudo /opt/labex/site-move/reload-zone
你应看到 zone reload queued。查询 运行中的权威服务器,确认实际加载的数据。工作台本身没有默认课程解析器,因此该诊断会显式进入权威服务器的网络命名空间。ip netns exec site-authority 只在该课程网络中运行紧随其后的命令:
sudo ip netns exec site-authority dig @10.94.0.2 practice.community.test A +noall +answer
你应看到 45 IN A 10.94.0.20。切换到 Warm Client 并查询其缓存:
dig @127.0.0.1 practice.community.test A +noall +answer
在原副本剩余寿命内,它仍可能返回 10.94.0.10,甚至还剩超过 45 秒。新的 45 秒 TTL 适用于新副本,不会改写旧缓存回答。在客户端可能合理地得到不同答案时,两个后端都保持正常工作。
等待刚刚观察到的剩余 TTL 再加一秒,然后再次查询。例如,如果显示还剩 37 秒,sleep 38 就足以等待该副本到期。下面的保守等待覆盖本练习原有的完整 120 秒最大值,即使你没有记下准确数字也能使用:
sleep 121
dig @127.0.0.1 practice.community.test A +noall +answer
现在应看到 10.94.0.20,剩余 TTL 不超过 45。请阅读实际记录行;仅有计时结束并不能证明任何结果。通过同一客户端发出命名 HTTP 请求:
curl --noproxy '*' -fsS --max-time 5 http://practice.community.test:8081/programme.txt
你应看到 Service location: new 和完整活动安排。正式名称 site.community.test 仍提供旧位置的内容。
如果错过了差异: 已完成的结果仍有效。若想重复观察,只使用 practice:在 DNS Desk 中,把该行恢复为 practice 120 IN A 10.94.0.10,并使用 nano community.zone 增大当前 SOA serial。nano 是文本编辑器:用方向键移动,只编辑该行与 serial,按 Ctrl+O、Enter 保存,再按 Ctrl+X 退出。使用上方相同命令验证和重载。等待练习客户端当前观察到的 TTL 自然过期,查询它以取得最多缓存 120 秒的旧地址,然后只把 practice 改回新地址和 45 秒,使用另一个更大的 serial,验证、重载并立即比较。最后等待自然过期并发出真实的新站请求。不要重置正式站点、重启解析器或替换网站内容来重复观察窗口。
如果路径输入错误,请在 DNS Desk 中用 pwd 和 cd /home/labex/project/site-move 恢复位置,再重新阅读文件。语法错误与内容错误是不同问题:依次验证文件、检查 运行中的权威服务器、检查缓存,然后请求 HTTP。等练习客户端解析到新地址后再运行最终检查。
总结
你使用了正常运行的命名网站,保存其完整活动安排,并区分了权威数据、缓存 DNS 回答与 HTTP 内容。你验证了一次限定范围的练习修改,观察到降低 TTL 不会缩短现有缓存副本的寿命。社区正式站点和旧后端仍然可用。下一单元会把这些知识用于分阶段地址迁移。



