Linux 网络故障排除和调试

Linux 网络故障排除和调试

Linux 和 Unix 用户有时会面临各种网络问题。其中许多问题都在此处和其他一些故障排除论坛中提出,但它们非常具体并包含大量附加技术信息,有时很难理解有问题的系统行为的要点和真正原因。

我问这个问题的目的是创建社区 wiki页面允许概括我们的网络故障排除和调试经验。我希望 Linux 和 Unix 用户能够使用此页面更轻松地识别和解决(“分而治之”)他们的网络问题。

该页面的父页面应该是诊断问题的最佳实践。但这里我们应该重点关注故障排除网络问题用户空间和内核空间。

我想,如果你:

  1. 分享有关使用一些出色的网络诊断工具的信息,以及它们有助于捕获的具体使用示例和网络错误示例,
  2. 分享与该主题相关的优秀网络教程的链接,
  3. 告诉我们可以解决某些类型的网络问题的通用方法或秘诀,或者
  4. 分享有关网络调试和故障排除工具集的信息

那么它就非常适合这个主题了。


我将首先分享各种链接诊断工具和一个12岁简单教程。还有这个Arch Linux 教程似乎有关于我们主题的实际信息。为了深入了解 Linux 网络,我们绝对需要访问Linux 网络-HOWTO

答案1

我认为,网络故障排除的一般原则是:

  1. 看看处于什么水平TCP/IP协议栈(或其他一些堆栈)出现问题。
  2. 了解什么是正确的系统行为以及什么是与正常系统状态的偏差。
  3. 尝试用一句话或几个词来表达问题。
  4. 利用从有缺陷的系统中获得的信息、您自己的经验以及其他人(Google、各种论坛等)的经验,尝试解决问题,直到成功(或失败)。
  5. 如果失败,请向其他人寻求帮助或建议。

对于我来说,我通常使用所有需要的工具来获取所有需要的信息,并尝试将这些信息与我的经验相匹配。确定网络堆栈的哪个级别包含错误有助于消除不太可能的变体。利用别人的经验有助于快速解决问题,但常常会导致这样的情况:我可以在不了解问题的情况下解决它,如果这个问题再次出现,我不可能在没有互联网的情况下再次解决它。

一般来说,我不知道如何解决网络问题。似乎我的大脑中有一个名为 的神奇功能SolveNetworkProblem(information_about_system_state, my_experience, people_experience),它有时可以返回完全正确的答案,有时也可能会失败(就像这里TCP 在 Linux 笔记本电脑上失效)。

我通常使用这组工具进行网络调试:

  • ifconfig(或ip link, ip addr) - 用于获取有关网络接口的信息
  • ping- 用于验证目标主机是否可以从我的计算机访问。ping也可用于基本的 DNS 诊断 - 我们可以通过 IP 地址或主机名 ping 主机,然后确定 DNS 是否正常工作。然后traceroutetracepathmtr看看那里发生了什么。
  • dig- 诊断所有 DNS
  • dmesg | lessdmesg | taildmesg | grep -i error——对于理解Linux内核的想法有些麻烦。
  • netstat -antp+ | grep smth- 我最常用的 netstat 命令,它显示有关 TCP 连接的信息。我经常使用 grep 执行一些过滤。另请参阅新ss命令(来自iproute2标准Linux 网络工具套件)以及lsoflsof -ai tcp -c some-cmd.
  • telnet <host> <port>- 对于与各种 TCP 服务(例如 SMTP、HTTP 协议)进行通信非常有用,我们还可以检查连接到某些 TCP 端口的一般机会。
  • iptables-save(在 Linux 上)- 转储满的iptables 表
  • ethtool- 获取所有网络接口卡参数(链路状态、速度、卸载参数...)
  • socat- 用于测试所有网络协议(UDP、多播、SCTP...)的瑞士军队工具。特别有用(比 telnet 更有用),有几个-d选项。
  • iperf- 测试带宽可用性
  • openssl( s_client, ocsp, x509...) 调试所有 SSL/TLS/PKI 问题。
  • wireshark- 用于捕获和分析网络流量的强大工具,可让您分析和捕获许多网络错误。
  • iftop- 显示网络/路由器上的大用户。
  • iptstate(在 Linux 上)- 防火墙连接跟踪的当前视图。
  • arp(或 Linux 中的新功能ip neigh)- 显示 ARP 表状态。
  • route或较新的(在 Linux 上)ip route- 显示路由表状态。
  • strace(或trussdtracetusc取决于系统) - 是一个有用的工具,可以显示有问题的进程执行哪些系统调用。当系统调用失败时,它还会显示错误代码 (errno)。这些信息通常足以理解系统行为和解决问题。或者,在某些网络函数上使用断点gdb可以让您了解它们的创建时间和参数。
  • 调查 Linux 上的防火墙问题:iptables -nvL显示每个规则匹配的数据包数量(iptables -Z将计数器清零)。插入防火墙链中的目标LOG对于查看哪些数据包到达它们以及它们到达那里时已经如何转换非常有用。为了进一步了解,NFLOG(与 相关ulogd)将记录完整的数据包。

答案2

数量惊人的“网络问题”都可以归结为某种 DNS 问题。初始故障排除应忽略ping -n w.x.y.z主机名的 DNS 解析,而仅检查 IP 连接。之后,用于route -n检查没有 DNS 解析的默认 IP 路由。

验证 IP 连接和路由后,nslookuphost、 和dig可以产生信息。请记住,“锁定”可能表明发生了 DNS 超时。

不要忘记检查 的存在和内容/etc/resolv.conf。 DHCP 客户端在每次租用时都会更改该文件,有时它们会出错,或者如果磁盘空间紧张,则可能不会发生更新。

答案3

可能存在布线问题。如果您有权使用硬件,请确保所有电缆均已插入并机械啮合。如果您可以看到路由器或以太网接口,请确保链路指示灯亮起。

远程时,您必须依赖ethtoolmii-tool

[root@flask ~]# ethtool eth0
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Speed: 10Mb/s
        Duplex: Half
        Port: MII
        PHYAD: 24
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: g
        Wake-on: d
        Current message level: 0x00000001 (1)
                               drv
        Link detected: yes

“检测到链接:是”很好,但 10Mb/s 和半双工不好,因为该计算机上的 NIC 可以做得更好。我需要弄清楚是网卡出了问题还是电缆出了问题。插入同一路由器的另一台计算机显示 100Mb/s,全双工。

相关内容