一、网络不稳定的常见表现和原因

很多朋友在 Linux 下都遇到过网络时好时坏的问题:网页打开一会儿快一会儿慢,SSH 连接经常断掉,下载文件到一半卡住,或者远程访问服务器经常超时。这些问题背后的原因往往不复杂,但排查起来却让人头疼。常见的表现包括丢包率忽高忽低、延迟突然飙升、某些端口无法连接、甚至完全断网几分钟又自动恢复。造成这些现象的原因可能有很多,比如网卡驱动不兼容、DHCP 分配的 IP 地址冲突、DNS 解析超时、路由表错误、防火墙规则误拦截、MTU 设置过大导致分片丢包,以及网络管理工具(NetworkManager)与配置文件打架等等。别慌,接下来我们用最接地气的方式,一步步把这些坑填平。

二、诊断工具和排查步骤

在动手解决之前,先要搞清楚问题出在哪个环节。Linux 自带的命令行工具就像医生的听诊器,能帮我们快速定位病根。

2.1 使用 ping 测试基本连通性

最简单的测试就是向一个稳定可靠的 IP 地址发送包,看看丢包率和延迟。比如测试一下百度的 IP(114.114.114.114 是公共 DNS,或者直接用 8.8.8.8)。这里我们用 bash 示例:

# 持续 ping 8.8.8.8 30次,每次间隔0.2秒,观察结果
ping -c 30 -i 0.2 8.8.8.8
# 参数说明:-c 表示发送次数,-i 表示间隔秒数
# 如果看到类似 "0% packet loss" 说明网络连通没问题
# 如果丢包率很高,比如 30% 以上,说明网络链路本身有问题
# 延迟一般在 10-30ms 正常,如果超过 200ms 或剧烈波动,说明线路拥塞或路由不对

如果不确定目标 IP 是否可达,可以先 ping 本机网关(用 ip route 查看默认网关)。比如网关是 192.168.1.1,那就:

# 查看默认路由,得到网关地址
ip route | grep default
# 示例输出:default via 192.168.1.1 dev eth0
# 然后测试到网关的连通性
ping -c 10 192.168.1.1

如果 ping 网关丢包,那问题基本出在局域网内部,比如网线松动、交换机端口故障、无线信号干扰等。如果 ping 网关正常但 ping 外网丢包,那问题可能出在路由、防火墙或运营商的带宽限制上。

2.2 使用 traceroute 查看路由路径

有时候网络不稳定不是本地问题,而是某个中间路由节点出现了故障。traceroute 可以显示数据包从本机到目标经过的每一跳,并显示每一跳的延迟。

# 安装 traceroute(如果没装的话,Debian/Ubuntu用 apt install traceroute,CentOS用 yum install traceroute)
# 追踪到 www.baidu.com 的路由
traceroute -n www.baidu.com
# -n 参数表示不解析主机名,直接显示IP,加快速度
# 如果发现某一跳出现星号(* * *)或者延迟突然暴增到几百毫秒,那很可能是那个路由器出了问题
# 注意:有些路由器设备会屏蔽 ICMP 包,出现星号也可能是正常现象

2.3 使用 ip a 检查网卡状态

网卡本身的状态也经常被忽略。用 ip addrip a 可以查看所有网络接口的详细配置。

# 显示所有网卡信息
ip a
# 示例输出部分:
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
# 关键看 state 是否为 UP,如果显示 DOWN 说明网卡被禁用了
# 还要看是否有 inet 地址(IPv4地址),如果没有可能就是没拿到IP
# mtu 1500 是标准值,如果发现 mtu 数值异常(比如 9000),可能需要调整

另外,用 ethtool eth0 可以查看网卡的具体参数,比如速率、双工模式等。

# 查看 eth0 的协商速率和双工模式
ethtool eth0
# 如果 Speed 显示 1000Mb/s 并且 Duplex 显示 Full,说明正常
# 如果显示 10Mb/s 或者 Half,可能是网线质量差或网卡故障

2.4 查看系统日志抓取错误信息

很多网络问题会在系统日志里留下线索。比如网卡驱动报错、DHCP 获取失败等。

# 查看内核日志(滚动显示,适合实时观察)
dmesg -w | grep -i eth0
# 或者使用 journalctl(systemd 系统)
journalctl -xe | grep -i network
# 例如,如果看到 "r8169: link down" 这样的信息,说明网线被拔出或驱动有问题
# 如果看到 "dhcp4: no lease" 说明 DHCP 请求超时,可能需要手动设置静态IP

三、具体解决方案

找到问题根源后,就可以对症下药了。下面列出几个最常碰到的案例以及对应的解决方法。

3.1 修改 DNS 配置——解决解析慢或解析失败

如果你发现 ping IP 地址正常,但用域名访问网页却经常打不开,那八成是 DNS 服务器不靠谱。Linux 的 DNS 配置文件是 /etc/resolv.conf,但很多发行版现在由 NetworkManager 或 systemd-resolved 管理,直接修改可能会被覆盖。稳妥的做法是配置系统的 DNS 为公共 DNS。

方法一:临时修改(重启后失效)

# 直接编辑 resolv.conf(注意:有些系统这个文件是软链接或者被保护,最好先备份)
sudo vim /etc/resolv.conf
# 写入以下内容:
nameserver 114.114.114.114
nameserver 8.8.8.8
# 然后立即生效

方法二:永久修改(推荐使用 NetworkManager 的图形或命令行)

如果系统使用 NetworkManager,可以通过 nmcli 修改当前连接的 DNS 服务器。

# 查看当前网络连接名称,比如 "Wired connection 1"
nmcli connection show
# 修改该连接的 IPv4 DNS(多个 DNS 用空格分隔)
sudo nmcli con mod "Wired connection 1" ipv4.dns "114.114.114.114 8.8.8.8"
# 重启网络连接使其生效
sudo nmcli con down "Wired connection 1" && sudo nmcli con up "Wired connection 1"
# 验证 DNS 是否生效
cat /etc/resolv.conf
# 如果看到 nameserver 114.114.114.114 就对了

如果系统使用了 systemd-resolved,可以这样配置:

# 编辑 /etc/systemd/resolved.conf
sudo vim /etc/systemd/resolved.conf
# 取消注释 DNS 行,并设置:
[Resolve]
DNS=114.114.114.114 8.8.8.8
# 保存后重启服务
sudo systemctl restart systemd-resolved

3.2 设置静态 IP——避免 DHCP 冲突造成的断流

在局域网内,DHCP 服务器如果地址池较小,或者有多个设备抢同一个 IP,就会导致冲突,表现为突然掉线。尤其是公司网络或宿舍网络,很多人用路由器,容易产生冲突。设置静态 IP 可以有效规避。

# 首先查看当前网卡名称和网关
ip route | grep default
# 假设网关是 192.168.1.1,我们想设置静态 IP 为 192.168.1.100
# 使用 nmcli 配置静态 IP(NetworkManager 方式)
sudo nmcli con mod "Wired connection 1" ipv4.method manual \
    ipv4.addresses 192.168.1.100/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "114.114.114.114 8.8.8.8"
# 重启连接
sudo nmcli con down "Wired connection 1" && sudo nmcli con up "Wired connection 1"

如果你不喜欢 NetworkManager,可以直接修改 /etc/network/interfaces(Debian/Ubuntu)或者使用 netplan(Ubuntu 18.04+)。这里以 netplan 为例:

# 查看 netplan 配置文件,通常在 /etc/netplan/ 下
ls /etc/netplan/
# 假设文件是 01-network-manager-all.yaml,备份并修改
sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak
sudo vim /etc/netplan/01-network-manager-all.yaml
# 写入以下内容:
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses: [114.114.114.114, 8.8.8.8]
# 应用配置
sudo netplan apply

3.3 调整 MTU 值——解决大包丢包问题

MTU(最大传输单元)是网络接口能处理的最大数据包大小。常用以太网 MTU 是 1500,但有些 VPN 或 PPPoE 环境(比如拨号上网)MTU 可能只有 1492 或更小。如果 MTU 设置过大,数据包就会被分片,分片过程中容易丢包,导致网络不稳定。如何判断 MTU 问题?用 ping 带 -M do 参数探测:

# 探测到百度,逐步增大包大小,看什么时候出现“Frag needed”
ping -M do -s 1472 -c 3 baidu.com
# -M do 表示禁止分片,-s 设置数据包大小(不包括 IP 头 28 字节)
# 1472 + 28 = 1500,如果通过说明 MTU 1500 没问题
# 如果出现“Message too long”或丢包,说明 MTU 小于 1500,需要减小
# 可以尝试 -s 1452(即 1480)再试

找到合适的 MTU 值后,在网卡上设置。比如发现最高支持 1480,那就设置:

# 临时修改(重启后失效)
sudo ip link set dev eth0 mtu 1480
# 永久修改(netplan 方式)
sudo vim /etc/netplan/01-network-manager-all.yaml
# 在 eth0 下加上 mtu: 1480
# 例如:
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      mtu: 1480
      dhcp4: yes
# 应用
sudo netplan apply

3.4 禁用 IPv6 或调整网络管理器

有时候 IPv6 的配置冲突也会导致网络卡顿,特别是当路由器 IPv6 支持不好时。可以尝试临时或永久禁用 IPv6。

# 临时禁用(重启后恢复)
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
# 永久禁用,编辑 /etc/sysctl.conf
sudo vim /etc/sysctl.conf
# 在末尾添加:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# 立即生效
sudo sysctl -p

另外,NetworkManager 有时会接管网络配置,导致手动修改 /etc/network/interfaces/etc/resolv.conf 失效。如果你习惯手动配置,可以禁用 NetworkManager 对某个接口的管理:

# 停止 NetworkManager 对 eth0 的管理
sudo nmcli device set eth0 managed no
# 或者完全禁用 NetworkManager(不建议,除非你很确定)
# sudo systemctl stop NetworkManager
# sudo systemctl disable NetworkManager

3.5 检查网卡驱动和固件——处理硬件兼容性问题

老旧网卡或者国产网卡在 Linux 下经常出现驱动不完善的情况,症状就是间歇性断网,但系统日志里没有明显错误。可以先用 lspci 查看网卡型号,然后搜索对应驱动。

# 查看 PCI 设备,找到以太网控制器
lspci | grep -i ethernet
# 例如:02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 06)
# 然后检查当前使用的驱动
lsmod | grep r8169
# 如果使用的是 r8169 这个老驱动,可以试试安装 r8168 驱动(Realtek 官方提供)
# 或者更新内核,可能自带更稳定的驱动

如果是无线网卡,可以查看是否使用了 iwlwifi 等驱动,有时需要更新固件:

# 查看无线网卡固件版本
dmesg | grep iwlwifi
# 如果看到 "firmware file failed to load",说明需要安装固件包
# Debian/Ubuntu: sudo apt install firmware-iwlwifi
# CentOS: sudo yum install iwl7260-firmware
# 然后重启网络服务

四、应用场景分析

上述问题在以下几个场景中最为常见:

  • 家庭宽带连接:很多用户使用路由器自动获取 IP,但路由器 DHCP 地址租期短或者与其他设备冲突,导致在晚上高峰期特别容易掉线。这时候设置静态 IP 或更换靠谱的 DNS 就能缓解。
  • 公司办公网络:公司内部可能有多台 DHCP 服务器或 VLAN 划分复杂,导致 IP 分配混乱。同时,公司防火墙策略也可能误拦截某些协议的包,造成 SSH 连接中断。建议用 traceroute 和 ping 测试,必要时申请 IT 调整防火墙规则。
  • 云服务器(VPS):云服务器通常由服务商管理网络,但用户可以在系统内部调整 MTU 或禁用 IPv6。例如,某些 VPS 的默认 MTU 是 1500,但底层隧道可能只支持 1450,导致大包传输不稳定。通过调整 MTU 到 1450 可以解决问题。
  • 树莓派或嵌入式设备:这类设备网卡驱动通常比较弱,容易受电压波动影响,导致网卡掉线。可以用 ethtool 检查链路状态,或者通过降低网卡速率(比如固定为 100Mb/s)来提升稳定性。

五、技术优缺点

  • 静态 IP 配置:优点是稳定可靠,不受 DHCP 服务器影响;缺点是 IP 地址可能与其他设备冲突(如果不用心的网管),并且移动网络环境(比如笔记本在不同场所切换)需要手动修改。
  • DHCP 动态获取:优点是即插即用,适合便携设备;缺点是可能因为租期较短或地址池耗尽导致掉线,且在复杂网络下容易冲突。
  • 调整 MTU:优点是能解决 VPN、PPPoE 等特殊环境的大包丢包问题;缺点是需要精确测试,设置过小会降低传输效率(因为每包有效载荷减少)。
  • 禁用 IPv6:优点是快速解决由 IPv6 引起的问题(比如 DNS 同时查询 IPv4 和 IPv6 超时);缺点是放弃未来兼容性,某些网站只有 IPv6 访问会受限。
  • 修改 DNS:优点是免费且效果立竿见影;缺点是公共 DNS 可能导致隐私泄露,且某些地区到公共 DNS 延迟较大。

六、注意事项

  1. 备份配置文件:在修改 /etc/resolv.conf/etc/network/interfaces 或 netplan 文件之前,一定先备份。万一改错了,还能用备份恢复。
  2. 远程操作要小心:如果你是通过 SSH 连接服务器进行修改,请一定确认配置没有错误后再重启网络服务。否则可能把自己踢出系统,需要去机房或通过 IPMI 才能恢复。建议在修改前新建一个 SSH 会话保持,并测试配置生效后不影响当前连接。
  3. 注意防火墙影响:有些问题可能是防火墙规则引起。用 iptables -L -nufw status 查看是否有默认拒绝规则。可以临时关闭防火墙(sudo ufw disable)测试是否改善,如果是,再细查规则。
  4. 多网卡环境:如果系统有多个网卡(比如 eth0 和 wlan0),确保路由表正确。用 ip route show 查看默认路由是否指向正确的网卡。有时系统会同时连接有线和无线,导致路由冲突。
  5. 系统更新:内核和固件的更新可能修复已知的网络驱动 bug。保持系统及时更新(sudo apt update && sudo apt upgrade)是一个好习惯。

七、文章总结

Linux 网络不稳定就像人时不时打个喷嚏,原因多种多样,但基本都能通过系统化的排查和针对性的调整解决。我们从最基础的 ping 和 traceroute 开始,逐步深入到 DNS、IP 地址、MTU、IPv6 和网卡驱动,每个环节都给出了实际可操作的示例。不怕你基础差,就怕你不动手。照着这些命令敲一遍,大多数网络不稳定的问题都能迎刃而解。最后记住:备份配置、测试先行、远程谨慎,网络世界就会对你温柔以待。