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 的连接状态,可以执行以下命令:

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

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

使用curl命令

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

arduino 复制代码
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 复制代码
cat /etc/sysconfig/network-scripts/ifcfg-ens33

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

ini 复制代码
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,可以这样配置

ini 复制代码
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 地址等:

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命令可以查看当前网络接口的配置:

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 服务器建立连接:

r 复制代码
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 命令可以查看系统的路由表,确认默认网关是否设置正确。执行以下命令:

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。

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

检查防火墙设置

检查防火墙状态

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

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

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

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

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

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

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

sudo systemctl restart firewalld.service

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

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

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

bash 复制代码
sudo systemctl enable firewalld.service

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

检查端口连通性

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

yaml 复制代码
telnet 192.168.253.166 3306

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

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

sudo yum install telnet
arduino 复制代码
sudo yum remove telnet

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

检查网络服务

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

lua 复制代码
systemctl status network

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

lua 复制代码
systemctl status NetworkManager

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

写在最后

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

相关推荐
学Linux的语莫15 分钟前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
monkey_meng18 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
踏雪Vernon25 分钟前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
Estar.Lee33 分钟前
时间操作[计算时间差]免费API接口教程
android·网络·后端·网络协议·tcp/ip
学Linux的语莫38 分钟前
搭建服务器VPN,Linux客户端连接WireGuard,Windows客户端连接WireGuard
linux·运维·服务器
legend_jz43 分钟前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
Komorebi.py44 分钟前
【Linux】-学习笔记04
linux·笔记·学习
黑牛先生1 小时前
【Linux】进程-PCB
linux·运维·服务器
友友马1 小时前
『 Linux 』网络层 - IP协议(一)
linux·网络·tcp/ip
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust