名称: 网络分析 描述: 从sosreport存档分析网络配置数据,提取接口配置、路由表、活动连接、防火墙规则(firewalld/iptables)和DNS设置,基于sosreport目录结构诊断网络连通性和配置问题
网络分析技能
该技能提供从sosreport存档分析网络配置和连通性的详细指南,包括接口、路由、防火墙规则和DNS配置。
何时使用此技能
使用此技能当:
- 分析
/sosreport:analyze命令的网络分析阶段 - 调查网络连通性问题
- 诊断防火墙或路由问题
- 验证网络配置
先决条件
- Sosreport存档必须解压到工作目录
- 必须知道sosreport根目录的路径
- 理解Linux网络概念
Sosreport中的关键网络数据位置
-
网络接口:
sos_commands/networking/ip_-o_addr- IP地址sos_commands/networking/ip_link- 链接状态sos_commands/networking/ip_-s_link- 带错误的链接统计etc/sysconfig/network-scripts/- 网络配置文件(RHEL)
-
路由:
sos_commands/networking/ip_route- 路由表sos_commands/networking/ip_-6_route- IPv6路由表proc/net/route- 内核路由表
-
网络连接:
sos_commands/networking/netstat_-neopa- 活动连接sos_commands/networking/ss_-tupna- 套接字统计proc/net/tcp- TCP连接proc/net/udp- UDP连接
-
防火墙:
sos_commands/firewalld/- Firewalld配置sos_commands/iptables/iptables_-vnxL- iptables规则sos_commands/nftables/- nftables配置
-
DNS和解析:
etc/resolv.conf- DNS服务器etc/hosts- 静态主机名映射etc/nsswitch.conf- 名称解析顺序
-
网络服务:
sos_commands/networking/networkmanager_info- NetworkManager状态systemctl status NetworkManager输出
实施步骤
步骤 1: 分析网络接口
-
列出所有网络接口:
if [ -f sos_commands/networking/ip_-o_addr ]; then cat sos_commands/networking/ip_-o_addr fi -
检查接口状态:
if [ -f sos_commands/networking/ip_link ]; then # 查找接口状态(UP/DOWN) grep -E "^[0-9]+:" sos_commands/networking/ip_link fi -
解析接口信息:
- 接口名称(eth0, ens192等)
- 状态(UP/DOWN)
- IP地址(IPv4和IPv6)
- MAC地址
- MTU大小
-
检查接口错误:
if [ -f sos_commands/networking/ip_-s_link ]; then # 查找RX/TX错误、丢包、超限 cat sos_commands/networking/ip_-s_link fi -
识别接口问题:
- 无IP地址的接口(当预期有时)
- 处于DOWN状态的接口(当应为UP时)
- 高错误计数(RX/TX错误、丢包)
- 重复IP地址
- MTU不匹配
步骤 2: 分析路由配置
-
检查默认路由:
if [ -f sos_commands/networking/ip_route ]; then grep "^default" sos_commands/networking/ip_route || echo "未找到默认路由" fi -
审查路由表:
if [ -f sos_commands/networking/ip_route ]; then cat sos_commands/networking/ip_route fi -
检查IPv6路由:
if [ -f sos_commands/networking/ip_-6_route ]; then cat sos_commands/networking/ip_-6_route fi -
识别路由问题:
- 缺少默认路由
- 多个默认路由(冲突)
- 错误的网关地址
- 无处可去的路由(不可达网关)
步骤 3: 分析网络连通性
-
检查活动连接:
if [ -f sos_commands/networking/netstat_-neopa ]; then cat sos_commands/networking/netstat_-neopa elif [ -f sos_commands/networking/ss_-tupna ]; then cat sos_commands/networking/ss_-tupna fi -
按状态统计连接:
# 统计TCP连接状态 if [ -f sos_commands/networking/netstat_-neopa ]; then grep "^tcp" sos_commands/networking/netstat_-neopa | awk '{print $6}' | sort | uniq -c fi -
查找监听服务:
# 显示监听端口 if [ -f sos_commands/networking/netstat_-neopa ]; then grep "LISTEN" sos_commands/networking/netstat_-neopa fi -
检查连接问题:
- 过多的TIME_WAIT连接
- 许多SYN_SENT连接(连接尝试失败)
- 高数量的CLOSE_WAIT(应用未关闭)
- 端口冲突(多个服务在同一端口)
步骤 4: 分析防火墙配置
-
检查firewalld是否活动:
if [ -d sos_commands/firewalld ]; then # Firewalld存在 if [ -f sos_commands/firewalld/firewall-cmd_--list-all-zones ]; then cat sos_commands/firewalld/firewall-cmd_--list-all-zones fi fi -
审查iptables规则:
if [ -f sos_commands/iptables/iptables_-vnxL ]; then cat sos_commands/iptables/iptables_-vnxL fi -
检查防火墙区域和规则:
- 活动区域
- 允许的服务
- 允许的端口
- 富规则
- 丢弃/拒绝策略
-
识别防火墙问题:
- 所需端口被阻止
- 过于宽松的规则(任意接受)
- 冲突规则
- 服务缺少规则
步骤 5: 分析DNS配置
-
检查DNS服务器:
if [ -f etc/resolv.conf ]; then cat etc/resolv.conf fi -
审查/etc/hosts:
if [ -f etc/hosts ]; then # 显示非注释、非空行 grep -v "^#\|^$" etc/hosts fi -
检查主机名解析:
# 检查主机名 if [ -f hostname ]; then cat hostname fi # 检查FQDN if [ -f etc/hostname ]; then cat etc/hostname fi -
验证nsswitch配置:
if [ -f etc/nsswitch.conf ]; then grep "^hosts:" etc/nsswitch.conf fi -
识别DNS问题:
- 未配置DNS服务器
- 不可达DNS服务器(在日志中检查连通性)
- 错误的搜索域
- 日志中的主机名解析失败
步骤 6: 检查日志中的网络错误
-
查找网络相关错误:
# 连接拒绝错误 grep -i "connection refused" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20 # 超时错误 grep -i "timeout\|timed out" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20 # 网络不可达 grep -i "network.*unreachable\|no route to host" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20 # DNS解析失败 grep -i "could not resolve\|dns.*fail\|name resolution" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20 -
检查链接状态变化:
grep -i "link.*up\|link.*down\|carrier.*lost" sos_commands/logs/journalctl_--no-pager 2>/dev/null | head -20 -
查找网络设备错误:
grep -i "network.*error\|eth[0-9].*error\|transmit.*error" var/log/dmesg 2>/dev/null
步骤 7: 生成网络分析摘要
创建结构化摘要,包括以下部分:
-
接口摘要:
- 所有接口列表及状态
- 分配的IP地址
- 接口错误/丢包
- 链接速度和双工设置
-
路由摘要:
- 默认网关
- 路由数量
- 任何路由异常
-
连通性摘要:
- 按状态的活动连接计数
- 监听服务和端口
- 检测到的连接问题
-
防火墙摘要:
- 防火墙类型(firewalld/iptables/nftables)
- 活动区域(如果firewalld)
- 关键允许的服务/端口
- 潜在阻止规则
-
DNS摘要:
- 配置的DNS服务器
- 搜索域
- 主机名配置
- DNS解析问题
-
网络问题:
- 关键网络问题
- 警告和建议
- 来自日志的证据
错误处理
-
缺少网络文件:
- 不同sosreport版本可能有不同文件名
- 回退到替代文件(netstat vs ss)
- 在摘要中记录缺失数据
-
多个网络配置:
- 系统可能使用NetworkManager、systemd-networkd或传统ifcfg
- 识别正在使用的并相应分析
-
IPv6存在:
- 检查IPv6是否启用
- 如果存在则分析IPv6配置
- 注意如果预期启用但禁用时
输出格式
网络分析应产生:
网络配置摘要
==============================
网络接口
------------------
接口:{名称}
状态:{UP|DOWN}
IP地址:{ipv4}, {ipv6}
MAC:{mac_address}
MTU:{mtu}
RX错误:{rx_errors} 数据包, {rx_dropped} 丢包
TX错误:{tx_errors} 数据包, {tx_dropped} 丢包
状态:{OK|WARNING|CRITICAL}
路由
-------
默认网关:{gateway_ip} 通过 {interface}
总路由:{count}
关键路由:
{destination} 通过 {gateway} 设备 {interface}
状态:{OK|WARNING|CRITICAL}
问题:
- {routing_issue_description}
连通性
------------
总活动连接:{count}
按状态连接:
ESTABLISHED: {count}
TIME_WAIT: {count}
CLOSE_WAIT: {count}
SYN_SENT: {count}
监听服务:
{port}/{protocol} - {service_name} (PID {pid})
状态:{OK|WARNING|CRITICAL}
问题:
- {connectivity_issue_description}
防火墙
--------
类型:{firewalld|iptables|nftables|none}
默认区域:{zone_name} (如果firewalld)
允许的服务:{service1}, {service2}, ...
允许的端口:{port1/protocol}, {port2/protocol}, ...
活动规则计数:{count}
状态:{OK|WARNING|CRITICAL}
潜在问题:
- {firewall_issue_description}
DNS配置
-----------------
DNS服务器:{dns1}, {dns2}, {dns3}
搜索域:{domain1}, {domain2}
主机名:{hostname}
FQDN:{fqdn}
状态:{OK|WARNING|CRITICAL}
问题:
- {dns_issue_description}
日志中的网络错误
------------------------
连接拒绝:{count} 次发生
超时:{count} 次发生
DNS失败:{count} 次发生
链接状态变化:{count} 次发生
最近网络错误:
{timestamp}: {error_message}
关键网络问题
-----------------------
{severity}: {issue_description}
证据:{file_path_or_log_excerpt}
影响:{impact_description}
建议:{remediation_action}
建议
---------------
1. {actionable_recommendation}
2. {actionable_recommendation}
数据源
------------
- 接口:{sosreport_path}/sos_commands/networking/ip_-o_addr
- 路由:{sosreport_path}/sos_commands/networking/ip_route
- 连接:{sosreport_path}/sos_commands/networking/netstat_-neopa
- 防火墙:{sosreport_path}/sos_commands/firewalld/
- DNS:{sosreport_path}/etc/resolv.conf
示例
示例 1: 接口分析
# 检查接口IP地址
$ cat sos_commands/networking/ip_-o_addr
1: lo inet 127.0.0.1/8 scope host lo
2: eth0 inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
2: eth0 inet6 fe80::a00:27ff:fe4e:66a1/64 scope link
# 检查错误
$ cat sos_commands/networking/ip_-s_link | grep -A 4 "eth0"
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
RX: bytes packets errors dropped overrun mcast
15234567 98234 0 0 0 123
TX: bytes packets errors dropped carrier collsns
8765432 54321 15 0 0 0
# 解释:eth0有15个TX错误 - 调查电缆/交换机
示例 2: 防火墙规则分析
# 检查firewalld活动区域
$ grep -A 20 "public" sos_commands/firewalld/firewall-cmd_--list-all-zones
public (active)
target: default
services: ssh dhcpv6-client http https
ports: 8080/tcp 9090/tcp
...
# 解释:允许HTTP/HTTPS,开放自定义端口8080和9090
示例 3: 连接状态问题
# 统计连接状态
$ grep "^tcp" sos_commands/networking/netstat_-neopa | awk '{print $6}' | sort | uniq -c
234 ESTABLISHED
1523 TIME_WAIT
12 CLOSE_WAIT
5 SYN_SENT
# 解释:
# - 过多的TIME_WAIT(关闭连接后正常)
# - CLOSE_WAIT表示应用未正确关闭套接字
# - SYN_SENT表示出站连接尝试失败
有效分析提示
- 检查接口一致性:确保IP地址匹配预期配置
- 验证网关可达性:默认网关应在同一子网
- 查找不对称路由:数据包进出可能走不同路径
- 检查MTU设置:MTU不匹配可能导致数据包分片问题
- 与日志关联:日志中的网络错误常解释配置问题
- 考虑网络拓扑:理解预期网络布局
- 检查IPv4和IPv6:如果使用IPv6,务必检查
常见网络模式和问题
- 无默认路由:"网络不可达"错误,无法访问互联网
- 接口关闭:"网络关闭"错误,无连通性
- 重复IP:ARP冲突,间歇性连通性
- 防火墙阻止:"连接拒绝/超时"针对特定端口
- DNS失败:无法解析主机名,但IP连通性正常
- 端口耗尽:太多TIME_WAIT连接,无法创建新连接
- MTU问题:大数据包失败,小数据包工作(PMTUD失败)
网络问题严重性分类
| 问题类型 | 严重性 | 影响 |
|---|---|---|
| 无网络接口 | 关键 | 完全失去连通性 |
| 无默认路由 | 关键 | 无外部连通性 |
| 接口错误 >1% | 警告 | 潜在数据包丢失 |
| 过多TIME_WAIT | 警告 | 可能表示性能问题 |
| 缺少DNS服务器 | 关键 | 名称解析失败 |
| 防火墙阻止所需端口 | 高 | 服务不可用 |
| IPv6自动配置失败 | 低 | IPv6连通性问题 |
另见
- 日志分析技能:用于详细网络错误日志分析
- 系统配置分析技能:用于网络服务状态
- 资源分析技能:用于网络I/O统计