前言
作为一名热爱折腾 Linux 的技术达人,我深知网络故障会让人抓狂!在这篇文章里,我和你分享了我的心得体会,从如何分析问题、识别瓶颈,到利用各种神器解决网络难题。不管你是新手小白还是老鸟大神,这里都有适合你的解决方案。赶紧看一看吧,让网络故障成为你的过去式!
我平时使用CentOS系统比较多,所以我在写这篇文章的时候所使用的操作系统是CentOS7,如果你使用的是Ubuntu,也没有关系,排除网络故障的过程是一样的,不同的是可能使用命令工具、配置文件会有所不同,希望我的分享给能你带来一些帮助。
网络故障的常见原因
导致网络发生故障的原因有很多,但是一般常见的原因多。如果你的系统发生网络故障,可以先从下面这些方面开始检查,下面这些是一此常见的原因:
- 网络接口配置错误:
- IP 地址、子网掩码、网关配置错误。
- DNS 配置错误或 DNS 服务器不可达。
- 网络硬件故障:
- 网络线缆连接不良或损坏。
- 网络接口卡硬件故障。
- 网络交换机或路由器故障。
- 防火墙配置错误:
- 防火墙规则设置错误,导致阻止了必要的网络流量。
- 防火墙服务未启动或异常。
- 服务未启动或配置错误:
- 网络服务(如网络管理器、网络接口服务等)未启动。
- 服务配置文件错误导致服务无法正常工作。
- 路由配置错误:
- 路由表配置错误。
- 网关配置错误或不可达。
- DNS 解析问题:
- DNS 解析配置错误。
- DNS 服务器不可达或不可用。
- 网络流量拥塞:
- 网络带宽使用过大导致网络拥堵。
- 网络设备过载导致网络性能下降。
- 安全策略限制:
- SELinux 或其他安全策略阻止了必要的网络访问。
- 安全软件或防病毒软件过滤了网络流量。
排除网络故障的基本流程
有问题一点不可怕,可怕是手忙脚乱地瞎搞,没有解决问题反而产生更大的问题,所以遇到问题不要慌!先想想处理这个问题的基本流程是什么。在CentOS中,排除网络故障可以遵循以下的基本流程:
- 检查网络连接:首先,检查网络连接是否正常。可以使用ping命令测试与远程主机之间的连通性,如果无法ping通目标主机,则可能存在网络故障。
- 检查IP地址和网关设置:确认本地主机的IP地址和网关设置是否正确。可以使用ifconfig或ip命令检查当前网络接口的配置,并确认其IP地址和网关是否正确。
- 检查DNS解析:如果网络故障是由于DNS解析问题导致的,则需要使用nslookup或dig命令查询域名的IP地址,以确认DNS解析是否正常。
- 检查防火墙设置:如果网络故障是由于防火墙设置导致的,则需要使用iptables命令查看防火墙规则是否正确配置。如果需要更新规则,则需要使用iptables命令进行添加或删除规则。
- 检查网络服务:确认网络服务是否正常运行。可以使用systemctl命令检查网络服务的状态,如果网络服务未启动,则需要使用systemctl命令启动它。
- 检查网络设备:如果所有上述步骤都无法解决问题,那么可能是网络设备(如路由器、交换机等)或网络线路出现了问题。可以考虑更换网络线路或联系网络设备供应商进行进一步检查。
基本流程是清楚的,但是具体要怎么做呢?那就先从一些常见的检查项开始,一步一步来,不要急。当然,如果你已经明确知道问题出在了哪里,那另当别论。下面是一些排除网络故障时的常见检查项:
常见检查项
验证网络物理连接
这个就相对简单一些,检查一下网线是否插好、插入的接口是否正确以及相关的网络设备,如交换机、路由器的指示灯状态是否正常。
检查网络连接状态
检查网络连接状态有很多方法,这里分享比较常用的几种:
- 使用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
使用 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
这项检查是确保系统的网络服务是处于正常工作状态。
写在最后
如果你觉得这篇文章对你有所帮助,不妨点击点赞按钮,让更多的人看到这篇优质的技术分享。同时,别忘了将这篇文章收藏起来,以备日后查阅。这样,你就能随时回顾和复习文章中的重要知识点,确保你的技术水平始终保持在最高水平。