介绍
Lantern Festival 已准备 Main Stage 到 Workshop 的去程路由,但回复无法返回。你将观察真实建连报文,修复缺失的回程,同时保留已有服务。
请先完成“到达另一个活动区域”,或掌握其中的目标查询、限定路由添加/替换及恢复流程。你应已能识别 IPv4 地址、简单的 /24 范围、客户端/服务端角色和端口,并能输入终端命令、用 ip addr 查看地址。已准备的 Linux 节点共享同一个内核;它们是网络命名空间,不是独立实体机器。不要求编程、防火墙、动态路由或子网算术。
使用 Area Plan 发起真实节目请求,使用 Area A 和 Area B 操作各自客户端,使用 West Router 和 East Router 修改路由。每个终端保留自己的目录和网络状态。打开 Tab 不会重置进度。这个实验独立开始。时长是包含阅读和普通错误处理的作者估计,未经过初学者计时研究。
恢复回复路径并保留活动网络
本步骤先观察连接的两个方向,再修改路由。这个独立场景已经准备 West Router 到 Workshop 的路由。从 Area Plan 开始:从 Area A 请求 Main Stage,从 Area B 请求 Workshop。两处本地节目都正常。再从 Area A 请求 Broadcast Room。从 Area A 请求 Workshop 仍会失败。
TCP(传输控制协议)在本次 HTTP 交换前建立连接。客户端选择一个临时源端口,也称临时端口;回复将源和目标地址、端口对调。TCP 连接从客户端的 SYN 报文开始;服务器在发送 HTTP 前用 SYN-ACK 回答。在服务器网络上看到 SYN,不能证明 HTTP 请求已经到达服务。你将在两个路由器上观察真实、有界的流量。
切换到 West Router。tcpdump 观察报文;-n 保留数字地址,-i any 观察这个节点的接口,-c 8 在至多八个匹配报文后停止。引号中的过滤条件选择 TCP 端口 8080。如果一直没有八个报文,timeout 120 也会在两分钟后停止。这样只限制收集范围,不会生成流量。报文行可能在停止收集时才显示。切换 Tab 前等待启动消息,停止后再阅读收集的行。
timeout 120 tcpdump -ni any -c 8 'tcp port 8080'
等待 listening on any,然后切换到 East Router,启动相同的有界观察:
timeout 120 tcpdump -ni any -c 8 'tcp port 8080'
看到 listening on any 后,切换到 Area A 发起一次请求。预计会在三秒后超时:
curl --noproxy '*' -fsS --max-time 3 http://10.72.0.10:8080/programme.txt
echo $?
应看到 28。请求失败后切换到 East Router。如果观察程序仍在运行,按 Ctrl+C 停止并刷新缓冲的报文行。如果已经返回提示符,就保持停止状态。无论哪种情况,都应在执行其他命令前立即打印其状态:
echo $?
124 表示刻意设置的两分钟上限结束了收集。0 可能表示 tcpdump 达到报文数量,也可能表示它正常处理了 Ctrl+C;被中断的包装程序也可能报告 130。把报文行作为证据,不要只看观察程序的退出状态。如果请求前窗口已结束,或没有捕获到报文,重复两处有界抓包和请求。两分钟是为切换 Tab 留出的空间,不是经过实测的初学者时间保证。
查找源 10.71.0.10 发往 10.72.0.10.8080、带 Flags [S] 的报文,它从 transit 进入,再从 lan 发出。回复将地址反转:10.72.0.10.8080 发往 10.71.0.10,带 Flags [S.],从 lan 进入。它没有可继续转发的路径。切换到 West Router,如果观察程序仍在运行,按 Ctrl+C 停止,再读取其状态:
echo $?
West 能看到向 Workshop 发出的 SYN,却看不到返回的 SYN-ACK。具体时间、客户端临时端口和重传次数可能变化。这些证据将故障缩小到回复路径;它们不是一次已完成的 HTTP 交换。
添加回程路由
本部分将为回复目标提供自己的路由。从 East Router 开始。读取路由表,查询原始客户端地址:
ip route
ip route get 10.71.0.10
应看到 RTNETLINK answers: No route to host。East Router 连接着 10.72.0.0/24 和中转网 172.22.0.0/24,但回复目标属于 10.71.0.0/24。下一跳必须是相邻的 West Router,即 172.22.0.1,而不是远端客户端自身。
使用上一个实验教过的相同限定路由语法:
ip route add 10.71.0.0/24 via 172.22.0.1 dev transit
ip route get 10.71.0.10
应看到 via 172.22.0.1 dev transit。切换到 Area A,重复业务请求:
curl --noproxy '*' -fsS --max-time 3 http://10.72.0.10:8080/programme.txt
阅读 Workshop 的完整节目及 Request received from: 10.71.0.10。现在的成功包含连接握手、HTTP 请求和 HTTP 响应。来源仍是 Area A 的地址;地址转换或代理会掩盖缺失的回程,而不是修复它。
如果路由已存在,读取表格并使用 ip route replace 10.71.0.0/24 via 172.22.0.1 dev transit。如果仍失败,比较两个路由器的目标和下一跳,再从正确的客户端 Tab 重试。不要重启全部服务或修改端点地址。
保持其他路径正常
本部分将检查双向通信和必须保留的第三网络。从 Area B 开始,请求 Main Stage:
curl --noproxy '*' -fsS --max-time 3 http://10.71.0.10:8080/programme.txt
应看到开场演出、灯笼巡游和 Request received from: 10.72.0.10。也请求本地节目和广播提示:
curl --noproxy '*' -fsS --max-time 3 http://10.72.0.10:8080/programme.txt
curl --noproxy '*' -fsS --max-time 3 http://10.73.0.10:8080/programme.txt
切换到 Area A,保持其原有的本地和广播访问:
ip -4 addr show dev eth0
ip route show default
curl --noproxy '*' -fsS --max-time 3 http://10.71.0.10:8080/programme.txt
curl --noproxy '*' -fsS --max-time 3 http://10.73.0.10:8080/programme.txt
地址仍为 10.71.0.10/24,客户端默认路由仍为 via 10.71.0.1。切换到 Area B,读取对应值:
ip -4 addr show dev eth0
ip route show default
地址保持 10.72.0.10/24,默认路由为 via 10.72.0.1。在 Area Plan 中,分别从 Area A 和 Area B 请求三个资源。阅读内容和原始来源身份,再展开各路由器的表格。两个原有的 unreachable default metric 32760 都保留。限定目标路由优先匹配,不必替换默认路由。
如果误删 East Router 上受保护的第三网络路由,只用已教过的替换形式恢复这一项:
ip route replace 10.73.0.0/24 via 172.22.0.1 dev transit
端点的原默认路由已列在上方。路由器的原默认路由可以在各自 Tab 中用 ip route replace unreachable default metric 32760 恢复;不要对平台网络执行这些课程命令。每次纠正后读取路由表,并重试受影响的所有请求。保留原直连路由、地址、链路及服务进程。检查只进行只读观察和普通 GET 请求,不会添加路由或修复现场。允许使用公开远端区域范围内等效的精确路由。

通过路线图定位两个中转邻居,再对照目标行和保留的默认路由。展开的表格显示正在工作的实验中的真实内核路由。
总结
你使用真实目标查询和限定路由交付了活动节目,同时保留原地址和其他路径。你还通过有界实时抓包区分了建连请求和回复。



