Linux 网络诊断与端口验证题】
一、为什么页面打不开要按固定顺序查想象你在寄快递。包裹没送到可能是你家楼下的快递点关门了链路、你写的地址不对地址、你不知道收件小区怎么走邻居、快递分拨中心不知道该往哪个城市发路由、你只写了收件人姓名但姓名对应多个地址名称、收件人根本不在家端口、收件人在家但拒收或者不回话应用。Linux 网络诊断就是这个逻辑从离主机最近的位置一层层往外查链路网卡本身在不在、有没有启动。网卡都没起来后面全免谈。地址你的 IP 和掩码对不对对方地址对不对。邻居同一栋楼里的人同网段或者小区门卫网关你能不能拿到对方的门牌号MAC 地址。路由内核决定从哪个门出去、用哪个身份源地址、先送到哪下一跳。名称域名有没有翻译成正确的 IP。翻译错了后面连的是错误的地方。端口对方机器上有没有程序在听这个号码。应用程序听到了回复的内容对不对。这个顺序的核心原则是先找最后一个成功证据再检查紧邻的失败层。就像快递追踪先看包裹最后出现在哪一站出问题的一定是那一站和下一站之间而不是从头重来。二、诊断四件套现象、假设、证据、结论很多人排障的毛病是「只记录执行了什么不说看到了什么」。正确的做法是把四件事说清楚现象出了什么问题。例如从 web01 访问 10.0.0.20:8080 超时。假设怀疑哪里。例如路由错误、目标没监听、主机防火墙丢包。证据拿什么验证。例如 ip route get、ss、nc 和双端 tcpdump 的输出。结论最终确认了什么。例如 SYN 到达了 app01、8080 也在监听但主机过滤规则把连接丢了。执行 ping 只是「做了一次检查」看到 ICMP 有来有回才构成「源端到目标 IP 当前可达」这个证据。检查动作和检查结果不是一回事。三、ping 到底证明了什么ping 就像敲门喊一声在吗对方回一句在。它只证明这一声喊出去、对方回了。具体说ping 成功只证明当前 ICMP Echo 请求和应答能够往返。它不能证明8080 端口正在监听。人在家不代表电话线插着。TCP 端口未被过滤。可能物业只放行了敲门声挡住了电话。HTTP 返回了正确状态码。电话通了不代表对方会用正确语言回答。应用依赖的数据库工作正常。反过来ping 失败也不能直接等于目标不可达。有些网络设备或主机规则会限制 ICMP不让别人敲门但允许 TCP 业务端口正常通信。也就是说敲门没人理不代表家里没人也不代表打电话打不通。ping 输出里几个字段的意思icmp_seq探测报文的序号第几声敲门。ttl报文剩余生存时间可以理解为一张贴纸上的还能过几个关卡不是距离的固定值。time单次往返时间。packet loss这一轮探测的丢包比例。min/avg/max/mdev最小、平均、最大延迟以及波动情况。四、traceroute 的星号不是丢包证明traceroute 的原理是逐步增加 TTL第一跳的设备收到报文后发现过站次数用完了就回一张到站过期的通知第二跳也是这样一层层往远推就能画出整条路径。中间节点显示星号没有回应常见原因有三种那台路由器设置了不回复这种探测、ICMP 被限速、报文被过滤。关键判断标准是只要后续节点和最终目标都正常中间的星号就不能认定业务丢包。课件实验里第一跳是网关 10.0.0.2中间很多跳全是星号最后照样在第 13 跳到达 223.5.5.5。tracepath 和 traceroute 是兄弟工具tracepath 通常不需要管理员权限还能显示路径 MTU一次能装多大包裹相关信息traceroute 默认探测方式可能受实现和网络策略影响-I 参数改用 ICMP Echo。五、mtr 报告怎么读mtr 相当于边走边持续 ping把路径发现和延迟丢包统计合在一起。用 -r -n -c 20 表示输出一次报告、保持数字地址、采集 20 轮。读报告的口诀先看最终目标再看丢包从哪一跳开始连续出现。中间某几跳显示 100% 丢包但最终目标 0%说明中间节点只是不回答探测不是路径坏。从某一跳开始后续所有跳和最终目标丢包率相近这才像真实路径问题。一次短报告不能代表全天质量处理生产问题要记录时间、源端、目标和探测次数。六、nc 的三种结果开放、拒绝、超时ncnetcat是对着某个 IP 的某个端口打电话。三种结果含义完全不同开放succeeded电话打通了。报文层面是收到 SYN/ACK完成 TCP 建连ss 里能看到 LISTEN。下一步该验证应用协议。拒绝Connection refused对方明确回了不打这电话。报文层面是目标返回 RSTss 里没有 LISTEN。要查监听进程、监听地址、目标端口。Refused 是主动回应说明协议栈明确拒绝往往信息量更大。超时timed out电话一直没人接也没人挂。报文层面是 SYN 重传、没有预期回应ss 里可能有 LISTEN服务在但被挡了。要查路径、主机过滤、中间设备、安全策略。Timeout 只说明等待时间内没有得到预期回应不能仅凭它断定是防火墙。ss 里三个常见状态的含义LISTEN 是服务端在等电话SYN-SENT 是你拨出去了还没听到回铃ESTAB 是电话接通正在通话。SYN-SENT 一直卡着要检查路径或过滤。另外记住nc 用 -u 测 UDP 时没有三次握手没报错不等于UDP 应用正常。UDP 应该用对应协议的查询工具比如 DNS 查询继续验证。七、三个结论不能互相替代ping 成功证明的是 ICMP 当前能够往返不能证明目标 TCP 端口开放。nc -vz 成功证明的是 TCP 目标端口能够建立连接不能证明 HTTP 内容正确。curl 成功证明的是指定 HTTP 请求获得了实际响应不能证明应用所有业务功能正常。每一层只证明本层的事。链路成功不代表端口通端口通不代表应用对。排障时要一层一层累积证据不能跳步下结论。八、抓包为什么强调双端对照tcpdump 是在网线上装监听器把经过的报文抄下来。单端抓包有个大问题你在源端没看到回应不知道是对方没收到还是收到了没回。所以要在两端同时抓源端抓我发出去没有目标端抓我收到没有。对照四种情况源端看见 SYN 发出目标端看见 SYN 到达路径至少把请求送到了目标主机。源端看见 SYN 发出目标端看不见问题在目标主机之前或者抓错了接口、过滤条件写错了。源端看见 SYN 重传目标端看见 SYN 到达但无回应检查目标过滤规则、监听和返回路径。两端都看见完整握手TCP 建连成立问题要往应用请求与响应方向查。抓包输出里的 Flags 是报文的动作标签[S] 是客户端发出 SYN想建连[S.] 是服务端回 SYN/ACK同意[.] 是 ACK确认三次握手完成[R] 或 [R.] 是主动复位常与未监听或主动拒绝有关。入门阶段只用这些标志判断请求有没有发出、回应有没有返回不用碰序列号、确认号和窗口这些深水区。tcpdump 过滤条件里host 10.0.0.20 限定通信主机tcp port 8080 限定协议和端口and 表示两个条件同时满足。组合条件要整体放在单引号里。抓包不指定条件会抄下海量无关报文什么都看不出来。九、监听地址为什么本机能访问、外面不行程序监听有三个常见范围只听 127.0.0.1只有本机能访问等于电话只接内线。监听业务地址如 10.0.0.20指定线路可访问。监听 0.0.0.0所有线路都能打进来。判断方法不是看进程在不在而是用 ss 核对监听协议、地址、端口和关联进程。本机 curl 成功、远程 nc 失败十有八九是监听地址的问题。十、主机防火墙只做观察不要上来就关端口不通时先看防火墙状态和规则不要直接关闭防火墙——那等于为了找钥匙把整栋楼的门都拆了。Ubuntu 的入口是 ufw status 和 nft list ruleset。注意一个易混点UFW 显示 Status: inactive只说明 UFW 这个管理入口没启用不自动证明系统里没有其他 nftables 规则在过滤。所以要两条都查UFW 是前台登记处nftables 是底层实际执行的规则。RHEL 和 openEuler 常用 firewalld--state 看运行没有--get-active-zones 看接口属于哪个区域--list-all 看当前区域放行了什么。发行版入口不同最终判断标准相同目标端口是被接受、拒绝还是丢弃。十一、VLAN 与 Bond 是什么VLAN在同一台物理交换机上划分出多个逻辑广播域。两台主机哪怕插在同一台交换机上只要属于不同 VLAN就要经过三层设备转发才能通信。物理位置相同不代表在同一个喊一嗓子都能听到的圈子里。Bond把多块物理网卡组合成一个逻辑接口用途是链路冗余或聚合。应用程序只认 bond0 这个逻辑接口。注意 Bond 不等于两块网卡速度必然相加能不能叠加、怎么做冗余取决于 Bond 模式和交换机配置。十二、Refused 与 Timeout一张纸巾引发的思考用最后一段把最容易混的两个现象钉死。你可以把 TCP 建连想象成敲门办事Refused拒绝门里有人明确告诉你不办。说明门是好的、路是通的只是没有对应的服务在听或者规则明确拒绝。优先查监听进程、监听地址、端口。Timeout超时喊了半天一点动静都没有。可能是路上有人把你的声音拦了防火墙 drop、门根本不存在、或者中间设备吞了报文。优先查路径、主机过滤、中间设备、安全策略最好用双端抓包确认报文死在哪一段。