Linux 网络故障排除和调试

dr.*_*dr. 88 linux networking debugging troubleshooting

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

通过提出这个问题,我的目的是创建一个社区 wiki页面,它可以概括我们的网络故障排除和调试经验。我希望 Linux 和 Unix 用户可以使用此页面更容易地识别和解决(“分而治之”)他们的网络问题。

此页面的父页面应该是 诊断问题的最佳实践。但在这里我们应该专注于从用户空间和内核空间解决网络问题

我想,如果你:

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

它非常适合这个主题。


我将从分享 varios诊断工具的链接和12 年前的简单教程开始。此外,archlinux 教程似乎有关于我们主题的实际信息。为了深入了解 linux 网络,我们绝对需要访问Linux Networking-HOWTO

dr.*_*dr. 125

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

  1. 找出问题发生在TCP/IP 堆栈(或某些其他堆栈)的哪个级别。
  2. 了解什么是正确的系统行为,什么是与正常系统状态的偏差
  3. 尝试用一句话或几个词来表达问题
  4. 利用从buggy系统获得的信息,自己的经验和其他人的经验(google,各种论坛等),尝试解决问题,直到成功(或失败)
  5. 如果失败,请向其他人寻求帮助或建议

至于我,我通常使用所有需要的工具获取所有必需的信息,并尝试将这些信息与我的经验相匹配。确定包含错误的网络堆栈级别有助于切断不太可能的变体。借助别人的经验,可以快速解决问题,但往往会出现这样的情况,有的问题我不理解也能解决,如果再出现这个问题,没有网络我就不可能再解决了。

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

我通常使用这个集合中的 utils 进行网络调试:

  • 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网络工具套件)和lsof作为lsof -ai tcp -c some-cmd
  • telnet <host> <port> - 对于与各种 TCP 服务(例如在 SMTP、HTTP 协议上)进行通信非常有用,我们还可以检查连接到某个 TCP 端口的一般机会。
  • iptables-save(在 Linux 上) - 转储完整的iptables 表
  • ethtool - 获取所有网络接口卡参数(链接状态、速度、卸载参数...)
  • socat- 用于测试所有网络协议(UDP、多播、SCTP...)的瑞士军队工具。有几个-d选项特别有用(比 telnet 更有用)。
  • 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)将记录完整的数据包。

  • 我会添加`nmap`。例如,机器上开放端口的配置文件可以快速提示您是在查看 Linux 还是 Windows 服务器。 (7认同)
  • 我会添加`tcpdump`。作为 TCP 的标准数据包分析器。 (7认同)

Bru*_*ger 17

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

验证IP连接,布线后,nslookuphost并且dig可以产生信息。请记住,“锁定”可能表示 DNS 超时正在发生。

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


Bru*_*ger 9

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

远程,您必须依赖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
Run Code Online (Sandbox Code Playgroud)

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