TT Lab
博客 开始
学习 学习路径 课程

Linux 网络诊断

连通性与路径确认

在 TT Lab 中继续学习

目标

读取接口和路由,解读 ping 统计,用本环境中可用的模式运行 traceroute 和 mtr。最后亲自证明 ICMP 可达性与 TCP 可达性是两个不同的问题。

为什么重要

ping 只能证明到 IP 层为止。它既不能证明上面的端口、应用,甚至不能证明大数据包能否通过。反过来,ping 失败也不意味着服务器宕机——很多组织会屏蔽 ICMP echo。本实验环境去除了 capability,因此像 traceroute 的 TCP 模式这样需要 raw 套接字的模式无法运行;即使是同一个工具,也会因模式不同而有的能用、有的不能用。这种限制本身就是很好的教材:诊断工具需要什么,不要靠猜,而要在该环境中实际运行后再确定。

步骤

  1. 创建 /root/reach 目录,把接口的单行摘要保存到 /root/reach/iface.txt。必须包含 lo。
  2. 把路由表保存到 /root/reach/route.txt。必须有以 default 开头的行。
  3. 把向 127.0.0.1 ping 3 次的完整输出保存到 /root/reach/ping-loop.txt。丢包率必须为 0%。
  4. 把向自己的默认接口 IP ping 3 次的输出保存到 /root/reach/ping-self.txt。丢包率必须为 0%。
  5. 从第 3 步的结果中只取 RTT 的 min / avg / max 三个值,用空格分隔写成一行,保存到 /root/reach/rtt.txt。
  6. 对 127.0.0.1 运行 traceroute,把输出保存到 /root/reach/trace.txt,并在 /root/reach/trace-mode.txt 中用小写写一行所用的模式(udp、icmp 或 tcp)。
  7. 对 127.0.0.1 运行 3 个周期的 mtr 报告,保存到 /root/reach/mtr.txt。必须包含 Loss% 表头。
  8. 把 /root/reach/summary.txt 写成以下 3 行。每个值都必须是实际尝试得到的结果。 icmp=<ok|fail> / tcp2222=<ok|fail> / tcp9999=<ok|fail> (ICMP 以 127.0.0.1 判断,TCP 以 127.0.0.1 的对应端口判断。)

参考

确认接口列表

创建 /root/reach 目录,把接口的单行摘要保存到 /root/reach/iface.txt。必须包含 lo。

ip 命令有单行摘要格式(-br)。回环接口和实际接口都要显示出来。

确认路由表

把路由表保存到 /root/reach/route.txt。必须有以 default 开头的行。

默认路由是以 default 开头的行。网关地址在 via 后面。

ping 回环地址

把向 127.0.0.1 ping 3 次的完整输出保存到 /root/reach/ping-loop.txt。丢包率必须为 0%。

用 -c 指定次数,最后会输出统计摘要。丢包率就在那一行摘要中。

ping 自己的 IP

把向自己的默认接口 IP ping 3 次的输出保存到 /root/reach/ping-self.txt。丢包率必须为 0%。

使用第 01 步确认的接口地址。发往自己的数据包也不能有丢失。

读取 RTT 统计

从第 3 步的结果中只取 RTT 的 min / avg / max 三个值,用空格分隔写成一行,保存到 /root/reach/rtt.txt。

统计的最后一行以斜杠分隔显示 min/avg/max/mdev。只取前三个值即可。

用可用的模式运行 traceroute

对 127.0.0.1 运行 traceroute,把输出保存到 /root/reach/trace.txt,并在 /root/reach/trace-mode.txt 中用小写写一行所用的模式(udp、icmp 或 tcp)。

不同模式使用的套接字不同,权限要求也不同。请亲自运行默认、-I 和 -T 模式,并写下输出了跳行的其中一种模式。

mtr 报告

对 127.0.0.1 运行 3 个周期的 mtr 报告,保存到 /root/reach/mtr.txt。必须包含 Loss% 表头。

mtr 也因模式不同而有的能用、有的不能用——如果跳行为空,请换一种模式运行。同时使用运行一轮即结束的报告模式和指定次数的选项。

比较 ICMP 与 TCP

把 /root/reach/summary.txt 写成以下 3 行。每个值都必须是实际尝试得到的结果。 icmp=<ok|fail> / tcp2222=<ok|fail> / tcp9999=<ok|fail> (ICMP 以 127.0.0.1 判断,TCP 以 127.0.0.1 的对应端口判断。)

sshd 在 2222 上运行,9999 上没有任何程序监听。想一想这三个结果各自证明了什么。