CentOS网络故障排查秘笈:实战指南

前言

作为一名热爱折腾 Linux 的技术达人,我深知网络故障会让人抓狂!在这篇文章里,我和你分享了我的心得体会,从如何分析问题、识别瓶颈,到利用各种神器解决网络难题。不管你是新手小白还是老鸟大神,这里都有适合你的解决方案。赶紧看一看吧,让网络故障成为你的过去式!

我平时使用CentOS系统比较多,所以我在写这篇文章的时候所使用的操作系统是CentOS7,如果你使用的是Ubuntu,也没有关系,排除网络故障的过程是一样的,不同的是可能使用命令工具、配置文件会有所不同,希望我的分享给能你带来一些帮助。

网络故障的常见原因

导致网络发生故障的原因有很多,但是常见的却不多,如果你的系统发生网络故障,可以先从下面这些方面开始检查,这些是一此常见的原因:

  • 网络接口配置错误:
    • IP 地址、子网掩码、网关配置错误。
    • DNS 配置错误或 DNS 服务器不可达。
  • 网络硬件故障:
    • 网络线缆连接不良或损坏。
    • 网络接口卡硬件故障。
  • 网络交换机或路由器故障。
    • 防火墙配置错误:
    • 防火墙规则设置错误,导致阻止了必要的网络流量。
    • 防火墙服务未启动或异常。
  • 服务未启动或配置错误:
    • 网络服务(如网络管理器、网络接口服务等)未启动。
    • 服务配置文件错误导致服务无法正常工作。
  • 路由配置错误:
    • 路由表配置错误。
    • 网关配置错误或不可达。
  • DNS 解析问题:
    • DNS 解析配置错误。
    • DNS 服务器不可达或不可用。
  • 网络流量拥塞:
    • 网络带宽使用过大导致网络拥堵。
    • 网络设备过载导致网络性能下降。
  • 安全策略限制:
    • SELinux 或其他安全策略阻止了必要的网络访问。
    • 安全软件或防病毒软件过滤了网络流量。

排除网络故障的基本流程

有问题一点不可怕,可怕是手心脚乱地瞎搞,没有解决问题反而产生更大的问题,所以遇到问题不要慌!先想想处理这个问题的基本流程是什么。在CentOS中,排除网络故障可以遵循以下的基本流程:

  1. 检查网络连接:首先,检查网络连接是否正常。可以使用ping命令测试与远程主机之间的连通性,如果无法ping通目标主机,则可能存在网络故障。
  2. 检查IP地址和网关设置:确认本地主机的IP地址和网关设置是否正确。可以使用ifconfig或ip命令检查当前网络接口的配置,并确认其IP地址和网关是否正确。
  3. 检查DNS解析:如果网络故障是由于DNS解析问题导致的,则需要使用nslookup或dig命令查询域名的IP地址,以确认DNS解析是否正常。
  4. 检查防火墙设置:如果网络故障是由于防火墙设置导致的,则需要使用iptables命令查看防火墙规则是否正确配置。如果需要更新规则,则需要使用iptables命令进行添加或删除规则。
  5. 检查网络服务:确认网络服务是否正常运行。可以使用systemctl命令检查网络服务的状态,如果网络服务未启动,则需要使用systemctl命令启动它。
  6. 检查网络设备:如果所有上述步骤都无法解决问题,那么可能是网络设备(如路由器、交换机等)或网络线路出现了问题。可以考虑更换网络线路或联系网络设备供应商进行进一步检查。

基本流程是清楚的,但是具体要怎么做呢?那就先从一些常见的检查项开始,一步一步来,不要急。当然,如果你已经明确知道问题出在了哪里,那另当别论。下面是一些排除网络故障时的常见检查项:

常见检查项

验证网络物理连接

这个就相对简单一些,检查一下网线是否插好、接插入的接口是否正确以及相关的网络设备,如交换机、路由器的指示灯状态是否正常。

检查网络连接状态

检查网络连接状态有很多方法,这里分享比较常用的几种:

  • 使用ping命令
  • 使用curl命令
  • 使用 ip link 命令

使用ping命令

使用 ping 命令可以测试与指定主机之间的连通性。例如,要检查与 baidu 的连接状态,可以执行以下命令:

bash 复制代码
ping -c 4 baidu.com

这将向 baidu 发送 4 个 ICMP 回显请求,并显示每个请求的响应时间和状态。

使用curl命令

使用curl -I 命令可以向https://www.baidu.com 发送 HTTP HEAD 请求,并显示服务器返回的 HTTP 头信息,而不会下载文件内容。HTTP 响应头信息非常有用,包含有 HTTP 状态码、服务器类型、响应头等可以判断网络响应情况的重要字段。

bash 复制代码
curl -I https://www.baidu.com

使用 ip link 命令可以查看系统中所有网络接口的状态:

bash 复制代码
ip link

确保所有网络接口都处于 UP(已启用)状态。

上述输出了两个网络接口的信息,一个是本地回环接口 lo,另一个是物理网络接口 ens33。

  • lo(本地回环接口):
    • lo:接口名称为 lo。
    • :表示该接口为回环接口,已启用,链路已启用。
    • mtu 65536:指定最大传输单元为 65536 字节。
    • qdisc noqueue:指定不使用队列调度器。
    • state UNKNOWN:接口状态未知。
    • mode DEFAULT:接口模式为默认模式。
    • group default:接口所属的默认分组。
    • qlen 1000:指定队列长度为 1000。
  • ens33(物理网络接口):
    • ens33:接口名称为 ens33。
    • :表示该接口支持广播和多播,已启用,链路已启用。
    • mtu 1500:指定最大传输单元为 1500 字节。
    • qdisc pfifo_fast:指定使用 pfifo_fast 队列调度器。
    • state UP:接口状态为已启用。
    • mode DEFAULT:接口模式为默认模式。
    • group default:接口所属的默认分组。
    • qlen 1000:指定队列长度为 1000。
    • link/ether 00:50:56:3e:26:4c:指定 MAC 地址为 00:50:56:3e:26:4c。
    • brd ff:ff:ff:ff:ff:ff:指定广播地址为 ff:ff:ff:ff:ff:ff。

检查网络接口配置

查看ifcfg-ens33

我的网络接口的名称是ens33,这个网络接口的配置文件在/etc/sysconfig/network-scripts/ifcfg-ens33,可以执行下面的命令,打开网络接口配置文件,检查IP 地址和子网掩码的配置:

bash 复制代码
ip link

我的ifcfg-ens33配置内容如下(这里我的CentOS系统使用的是静态IP):

bash 复制代码
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="cd43292c-4ccc-45df-a7ea-e8cc847143c8"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.253.166
NETMASK=255.255.255.0
GATEWAY=192.168.253.2
DNS1=114.114.114.114
DNS2=114.114.115.115

如果想使用动态IP,可以这样配置

bash 复制代码
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="DHCP"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="cd43292c-4ccc-45df-a7ea-e8cc847143c8"
DEVICE="ens33"
ONBOOT="yes"
  • TYPE="Ethernet":指定网络接口类型为以太网。
  • PROXY_METHOD="none":指定代理方式为无代理。
  • BROWSER_ONLY="no":指定不仅限于浏览器使用。
  • BOOTPROTO="static":指定使用静态 IP 地址配置方式,如果是动态IP,则应该配置dhcp。
  • DEFROUTE="yes":指定该接口作为默认路由。
  • IPV4_FAILURE_FATAL="no":指定 IPv4 连接失败不是致命错误。
  • IPV6INIT="yes":启用 IPv6 协议栈。
  • IPV6_AUTOCONF="yes":启用 IPv6 自动配置。
  • IPV6_DEFROUTE="yes":指定该接口作为 IPv6 默认路由。
  • IPV6_FAILURE_FATAL="no":指定 IPv6 连接失败不是致命错误。
  • IPV6_ADDR_GEN_MODE="stable-privacy":指定 IPv6 地址生成模式为稳定性隐私地址。
  • NAME="ens33":指定接口名称为 ens33。
  • UUID="cd43292c-4ccc-45df-a7ea-e8cc847143c8":指定接口的 UUID。
  • DEVICE="ens33":指定设备名称为 ens33。
  • ONBOOT="yes":指定系统启动时自动激活该网络接口。
  • IPADDR=192.168.253.166:指定接口的 IPv4 地址为 192.168.253.166。
  • NETMASK=255.255.255.0:指定接口的子网掩码为 255.255.255.0。
  • GATEWAY=192.168.253.2:指定接口的默认网关为 192.168.253.2。
  • DNS1=114.114.114.114:指定第一个 DNS 服务器地址为 114.114.114.114。
  • DNS2=114.114.115.115:指定第二个 DNS 服务器地址为 114.114.115.115。

此项检查的目的是,确保网络接口的 IP 地址和子网掩码配置正确。其中IP 地址应该属于正确的网络地址范围,并且子网掩码应该与网络配置一致。

使用 ip addr

使用 ip addr 命令可以查看系统中所有网络接口的配置信息,包括 IP 地址、子网掩码、MAC 地址等:

bash 复制代码
ip addr

这将列出系统中所有网络接口的配置信息。

这些信息描述了系统中两个网络接口的配置和状态。lo 接口是本地回环接口,用于本地通信,而 ens33 接口是物理网络接口,连接到网络中。

  • lo(本地回环接口):
    • 接口名称:lo
    • 类型:LOOPBACK(本地回环)
    • 状态:UP(已启用),LOWER_UP(链路已启用)
    • MTU(最大传输单元):65536
    • 排队调度器:noqueue
    • 状态:UNKNOWN(未知状态)
    • 地址:127.0.0.1/8(IPv4 地址),::1/128(IPv6 地址)
    • IPv4 地址的范围:scope host
    • IPv6 地址的范围:scope host
  • ens33(物理网络接口):
    • 接口名称:ens33
    • 类型:BROADCAST(广播),MULTICAST(多播)
    • 状态:UP(已启用),LOWER_UP(链路已启用)
    • MTU(最大传输单元):1500
    • 排队调度器:pfifo_fast
    • 状态:UP(已启用)
    • MAC 地址(链路层地址):00:50:56:3e:26:4c
    • IPv4 地址:192.168.253.166/24
    • 广播地址:192.168.253.255
    • IPv6 地址:fe80::6263:60fe:5bad:b36c/64
    • 链路本地 IPv6 地址

此项检查的目的是,验证网络配置参数信息是否能正常查询到。

使用ifconfig

使用ifconfig命令可以查看当前网络接口的配置:

bash 复制代码
ifconfig

解读上述内容:

  • ens33和lo:这是两个不同的网络接口,ens33是以太网接口,而lo是本地环回接口。
  • flags=4163:这些是标志位(flags),表示网络接口的状态和属性。在这里,"UP"表示接口已经启用,"BROADCAST"表示支持广播,"RUNNING"表示接口正在运行,"MULTICAST"表示支持多播。
  • mtu 1500:这是接口的最大传输单元(Maximum Transmission Unit),指定了可以在单个数据包中传输的最大字节数。
  • inet 192.168.253.166和inet 127.0.0.1:这是接口的IPv4地址,分别是ens33和lo接口的IPv4地址。
  • netmask 255.255.255.0和netmask 255.0.0.0:这是IPv4地址的子网掩码,用于指示网络地址和主机地址的分隔情况。
  • broadcast 192.168.253.255:这是广播地址,用于向特定网络中的所有设备发送消息。
  • inet6 fe80::6263:60fe:5bad:b36c和inet6 ::1:这是接口的IPv6地址,分别是ens33和lo接口的IPv6地址。
  • ether 00:50:56:3e:26:4c:这是以太网接口的物理地址(MAC地址)。
  • RX packets和TX packets:这是接收和发送的数据包数量。
  • RX errors和TX errors:这是接收和发送时发生的错误数量。
  • RX dropped和TX dropped:这是丢弃的接收和发送数据包数量。
  • RX overruns和TX overruns:这是接收和发送时发生的溢出错误数量。
  • RX frame和TX frame:这是接收和发送时发生的帧错误数量。

此项检查的目的是,验证网络配置参数信息是否能正常查询到。

检查DNS 解析

检查resolv.conf

检查 /etc/resolv.conf 文件的 DNS 配置

bash 复制代码
cat /etc/resolv.conf

这里的8.8.8.8是谷歌的公共DNS服务器。

检查DNS 服务器是否可达

可以使用 ping 命令向 DNS 服务器发送 4 个 ICMP 回显请求,会显示每个请求的响应时间和状态,根据响应结果可以确定系统是否能够与 DNS 服务器建立连接:

bash 复制代码
ping -c 4 8.8.8.8

解读上述内容:

  • PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.:表示执行PING命令,向IP地址为8.8.8.8的主机发送数据包,每个数据包大小为56字节(实际大小为84字节,包括头部信息)。
  • 64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=43.4 ms:表示从IP地址为8.8.8.8的主机收到一个大小为64字节的数据包,ICMP序列号为1,生存时间(TTL)为128,往返时间(RTT)为43.4毫秒。
  • --- 8.8.8.8 ping statistics ---:表示PING命令的统计信息开始。
  • 4 packets transmitted, 4 received, 0% packet loss, time 3004ms:表示共发送了4个数据包,全部都成功接收,没有丢失任何数据包,总共花费了3004毫秒。
  • rtt min/avg/max/mdev = 43.384/43.496/43.573/0.072 ms:表示往返时间的统计信息,包括最小往返时间、平均往返时间、最大往返时间和往返时间的标准偏差(mdev)分别为43.384毫秒、43.496毫秒、43.573毫秒和0.072毫秒。

此项检查的目的是,确保默认DNS解析正常,能够正常访问互联网。

检查网络路由

使用 ip route 命令可以查看系统的路由表,确认默认网关是否设置正确。执行以下命令:

bash 复制代码
ip route

第一条默认路由指定了默认网关的地址和出口接口,用于发送到其他网络的数据包;第二条子网路由则用于直接连接到 ens33 接口的本地子网内部通信。

  • default via 192.168.253.2 dev ens33 proto static metric 100:
    • default:这是默认路由条目,用于发送到除本地子网之外的所有目的地的数据包。
    • via 192.168.253.2:指定默认网关的 IP 地址为 192.168.253.2。
    • dev ens33:指定默认路由的出口网络接口为 ens33。
    • proto static:说明这是通过静态路由配置的默认路由。
    • metric 100:指定该路由的优先级为 100。如果有多个默认路由,优先级越低的会被优先使用。
  • 192.168.253.0/24 dev ens33 proto kernel scope link src 192.168.253.166 metric 100:
    • 192.168.253.0/24:这是一个子网路由条目,用于直接连接到 ens33 接口的子网。
    • dev ens33:指定该路由的出口网络接口为 ens33。
    • proto kernel:说明这是由内核自动生成的路由。
    • scope link:指定该路由的范围为链路本地,表示这是一个本地子网路由。
    • src 192.168.253.166:指定源 IP 地址为 192.168.253.166,这是本地子网的 IP 地址。
    • metric 100:指定该路由的优先级为 100。

此项检查的目的是,确保默认网关指向网络中的正确路由器或网关设备。

检查防火墙设置

检查防火墙状态

查看防火墙的当前状态,即是否正在运行。它将显示防火墙是否处于运行状态。

bash 复制代码
sudo firewall-cmd --state

检查允许通过防火墙的端口

  • 列出当前防火墙中允许通过的端口。它将显示防火墙配置中定义的所有端口及其状态。
bash 复制代码
sudo firewall-cmd --list-port

如果将要使用的端口未开放,可以使用下面的命令,开放相关端口:在这个例子中,将永久性地向防火墙规则中添加一个端口,端口号为 8080,并且添加到了 public 区域(即公共区域)。这意味着该端口会在防火墙重启后继续保持开放状态,而不会丢失。

bash 复制代码
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

如果需要开放端口马上生效,需要重新启动 firewalld 服务,即重新加载防火墙配置并重新启动防火墙。

bash 复制代码
sudo systemctl restart firewalld.service

当然如果你嫌麻烦的话,也可以先停止防火墙服务,然后再启动:

  • 停止 firewalld 服务,即关闭防火墙。它会立即停止防火墙,导致系统处于不受防火墙保护的状态。
bash 复制代码
sudo systemctl stop firewalld.service
  • 启动 firewalld 服务,即打开防火墙。它会立即启动防火墙服务,开始保护系统。
bash 复制代码
sudo systemctl start firewalld.service

我的建议是,你最好设置防火墙服务为开机启动,这样系统在下次重启时会自动启动防火墙:

bash 复制代码
sudo systemctl enable firewalld.service

这项检查是确保将要使用的端口对外已经开放,是可以连通的。

检查端口连通性

使用 telnet 命令可以测试指定端口是否能够建立连接。例如,如果要验证端口 8080 是否开放,可以执行以下命令:

bash 复制代码
telnet 192.168.253.166 3306

如果端口开放,将会显示连接成功的消息;如果端口关闭或被防火墙阻止,将会显示连接失败的消息。如图:3307端口是不通的,而3306端口是通的。

如果未安装telnet,可以使用下面命令进行安装与卸载

bash 复制代码
sudo yum install telnet

sudo yum remove telnet

这项检查是确保对外已经开放的端口,是可以连通的。

检查网络服务

systemctl:用于管理系统服务,包括网络服务。可以使用以下命令检查网络服务的状态:

bash 复制代码
systemctl status network

Active: active (exited):表示服务当前处于活动状态,但已经完成了其主要任务,并退出了,由此可见网络状态是正常的。

bash 复制代码
systemctl status NetworkManager

这项检查是确保系统的网络服务是处于正常工作状态。

写在最后

如果你觉得这篇文章对你有所帮助,不妨点击点赞按钮,让更多的人看到这篇优质的技术分享。同时,别忘了将这篇文章收藏起来,以备日后查阅。这样,你就能随时回顾和复习文章中的重要知识点,确保你的技术水平始终保持在最高水平。

相关推荐
深情废杨杨18 分钟前
服务器几核几G几M是什么意思?如何选择?
运维·服务器
康熙38bdc19 分钟前
Linux 进程优先级
linux·运维·服务器
Web极客码20 分钟前
常见的VPS或者独立服务器的控制面板推荐
运维·服务器·控制面板
hhzz22 分钟前
Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)
android·linux·jar
只是有点小怂24 分钟前
parted是 Linux 系统中用于管理磁盘分区的命令行工具
linux·运维·服务器
三枪一个麻辣烫1 小时前
linux基础命令
linux·运维·服务器
cuisidong19971 小时前
如何在 Kali Linux 上安装 Google Chrome 浏览器
linux·运维·chrome
光通信学徒2 小时前
ubuntu图形界面右上角网络图标找回解决办法
linux·服务器·ubuntu·信息与通信·模块测试
wusam2 小时前
螺蛳壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
运维·服务器·网络·docker·容器
南种北李2 小时前
Linux自动化构建工具Make/Makefile
linux·运维·自动化