Linux网络故障排除和调试


80

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

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

此页面的父级应该是 诊断问题的最佳实践。但在这里我们要着重故障诊断网络问题,用户和内核空间。

我想,如果您:

  1. 与它们一起帮助捕获的具体用法示例和网络错误示例共享有关使用一些出色的网络诊断工具的信息。
  2. 分享与该主题相关的出色网络教程的链接
  3. 介绍可以解决某些网络问题的通用方法或方法
  4. 共享有关您的工具集的信息以进行网络调试和故障排除

它完全适合该主题。


我将从共享varios 诊断工具的链接和12岁的简单教程开始。同样,archlinux教程似乎也有关于我们主题的实际信息。为了深入研究Linux网络,我们绝对需要访问Linux Networking-HOWTO


这个问答环节还需要考虑另一件事,网络上的两台配置了相同IP地址的机器:unix.stackexchange.com/questions/85887/…
slm

Answers:


118

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

  1. 找出问题所在的TCP / IP堆栈(或其他堆栈)的级别。
  2. 了解什么是正确的系统行为,以及与正常系统状态的偏离是什么
  3. 尝试用一个句子或几个单词来表达问题
  4. 使用从越野车系统获取的信息,您自己的经验以及其他人(谷歌,各种论坛等)的经验,尝试解决问题,直到成功(或失败)为止
  5. 如果失败,请向其他人咨询帮助或建议

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

通常,我不知道如何解决网络问题。我的大脑似乎有一个神奇的功能,名为SolveNetworkProblem(information_about_system_state, my_experience, people_experience),有时可能返回正确的答案,有时也可能失败(例如TCP在Linux笔记本电脑上死亡)。

我通常使用此工具集中的utils进行网络调试:

  • ifconfig(或ip linkip addr) -用于获得关于网络接口的信息
  • ping-用于验证是否可以从本机访问目标主机。ping也可以用于基本的DNS诊断-我们可以通过IP地址或主机名ping主机,然后确定DNS是否可以正常工作。然后traceroute或或tracepathmtr看看那里正在发生的事情。
  • dig -诊断所有DNS
  • dmesg | lessdmesg | taildmesg | grep -i error-对于理解Linux内核想着一些什么麻烦。
  • netstat -antp+ | grep smth-我最常用的netstat命令用法,它显示有关TCP连接的信息。我经常使用grep执行一些过滤。另请参阅新ss命令(来自Linux网络工具iproute2的新标准套件)和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 -测试带宽可用性
  • openssls_clientocspx509...)调试所有的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),将记录完整的数据包。

哎呀,说说彻底!
mVChr

7
我会补充nmap。例如,机器上开放端口的配置文件可以快速提示您是在查看Linux还是Windows服务器。
亚当·蒙森

7
我会补充tcpdump。作为TCP的标准数据包分析器。
jhvaras

14

数量惊人的“网络问题”归结为一种或另一种DNS问题。ping -n w.x.y.z为了排除主机名的DNS解析,应该使用最初的疑难解答,仅检查IP连接。之后,用于route -n检查没有DNS解析的默认IP路由。

验证IP连接性和路由后nslookuphostdig可以产生信息。请记住,“锁定”可能表明DNS超时正在发生。

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


8

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

在远程,您必须依赖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可以做得更好。我需要弄清楚NIC是被弄坏了还是电缆被弄乱了。插入同一路由器的另一台计算机显示为100Mb / s,全双工。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.