LINUX环境下网络故障自救指南:从“无法上网”到“网络卡顿”排查

引言

在 Linux 服务器的运维或开发中,网络问题往往是最让人头疼的。你可能遇到过这些情况:SSH 突然连不上了、服务接口响应极慢、或者想安装一个软件却提示“无法解析域名”。

对于 Linux 环境,我们将问题分为两种极端情况来处理:

  1. 完全断网:无法使用 aptyum 安装任何新工具,只能靠系统自带命令“徒手”修。

  2. 网络质量差:网是通的,但丢包或卡顿,需要用高级工具找出是哪个进程或哪个路由节点出了问题。

🚑 第一阶段:急救篇(完全断网/无法装包怎么办?)

当你面对一台连不上外网的 Linux 机器,或者身处内网隔离环境,你唯一的武器就是 Shell 脚本。

我们整理了一个零依赖全自动诊断脚本。它只使用 Linux 最基础的 ip, ping, grep 命令,不需要安装任何东西。你可以把它保存在 U 盘里插到服务器上,或者对着屏幕手敲进去。

🛠️ 自制工具:Auto-Net-Diag (自动网络诊断脚本)

脚本逻辑:

它会像医生查体一样,按顺序检查:网卡物理状态 -> IP 地址分配 -> 网关连通性 -> DNS 解析 -> 外网连接。只要有一步失败,它就会报错并给出建议。

使用方法

  1. 在终端创建一个文件:vi net_check.sh

  2. 粘贴下面的代码,保存并退出。

  3. 赋予执行权限:chmod +x net_check.sh

  4. 运行:./net_check.sh

Bash

#!/bin/bash

# 定义输出颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 检查 Root 权限
if [ "$EUID" -ne 0 ]; then
    echo -e "${RED}[错误] 请使用 sudo 运行此脚本。${NC}"
    exit 1
fi

echo -e ">>> 开始网络智能诊断与修复系统 (国内优化版)..."
echo "------------------------------------------------"

# ==========================================
# 1. 修复网卡名称解析与物理状态
# ==========================================
echo -n "1. 检查网卡物理状态... "

# 使用 -o 参数将每个网卡信息显示为一行,避免 MAC 地址干扰解析
# 获取除了 lo (回环) 以外的所有网卡名称
ALL_INTERFACES=$(ip -o link show | awk -F': ' '{print $2}' | grep -v "lo")
ACTIVE_INTERFACES=""

# 检测 UP 状态
for iface in $ALL_INTERFACES; do
    # 检查该网卡是否处于 UP 状态
    IS_UP=$(ip link show "$iface" | grep "state UP")
    if [ -n "$IS_UP" ]; then
        ACTIVE_INTERFACES="$ACTIVE_INTERFACES $iface"
    fi
done

# 如果没有活跃网卡,尝试启动
if [ -z "$ACTIVE_INTERFACES" ]; then
    echo -e "${YELLOW}[警告] 未发现活跃网卡,尝试全部启动...${NC}"
    for iface in $ALL_INTERFACES; do
        ip link set "$iface" up
    done
    sleep 2
    ACTIVE_INTERFACES=$(ip -o link show | awk -F': ' '{print $2}' | grep -v "lo" | xargs -I {} ip link show {} | grep "state UP" | awk -F: '{print $2}')
fi

if [ -z "$ACTIVE_INTERFACES" ]; then
    echo -e "${RED}[失败] 无法启动物理网卡,请检查硬件或驱动。${NC}"
    exit 1
else
    echo -e "${GREEN}[正常] 活跃网卡: $ACTIVE_INTERFACES${NC}"
fi

# ==========================================
# 2. 检查 IP 地址
# ==========================================
echo -n "2. 检查 IP 地址分配... "

HAS_IP=0
TARGET_IFACE=""

# 优先选择有 IP 的网卡
for iface in $ACTIVE_INTERFACES; do
    IP=$(ip -4 addr show $iface | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    if [ -n "$IP" ]; then
        HAS_IP=1
        TARGET_IFACE=$iface
        echo -e "${GREEN}[正常] 接口 $iface IP: $IP${NC}"
        break
    fi
done

# 无 IP 则尝试 DHCP 修复
if [ $HAS_IP -eq 0 ]; then
    echo -e "${YELLOW}[修复] 网卡无 IP,正在请求 DHCP...${NC}"
    # 取第一个活跃网卡尝试
    FIX_IFACE=$(echo $ACTIVE_INTERFACES | awk '{print $1}')
    
    # 尝试释放并重新获取
    pkill dhclient > /dev/null 2>&1
    timeout 10 dhclient -v "$FIX_IFACE" > /dev/null 2>&1
    
    # 二次检查
    IP=$(ip -4 addr show $FIX_IFACE | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
    if [ -n "$IP" ]; then
        echo -e "${GREEN}[修复成功] 获取到 IP: $IP${NC}"
        TARGET_IFACE=$FIX_IFACE
    else
        echo -e "${RED}[失败] 无法获取 IP。建议检查 DHCP 服务器或配置静态 IP。${NC}"
        exit 1
    fi
fi

# ==========================================
# 3. 检查网关
# ==========================================
echo -n "3. 检查网关连通性... "
GATEWAY=$(ip route | grep default | awk '{print $3}' | head -n 1)

if [ -z "$GATEWAY" ]; then
    echo -e "${RED}[失败] 无默认路由(网关)。${NC}"
    exit 1
fi

ping -c 2 -W 1 "$GATEWAY" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo -e "${GREEN}[正常] 网关连通 ($GATEWAY)${NC}"
else
    echo -e "${RED}[失败] 无法 Ping 通网关,局域网链路故障。${NC}"
    exit 1
fi

# ==========================================
# 4. 智能 DNS 与外网检查 (国内策略)
# ==========================================
echo -n "4. 检查互联网连接... "

# 策略:先 Ping 百度域名 (验证 DNS + 外网)
ping -c 1 -W 2 www.baidu.com > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo -e "${GREEN}[完美] 网络通畅 (百度可达)。${NC}"
    exit 0
fi

echo -e "${YELLOW}[异常] 无法解析或连接百度,正在诊断 DNS...${NC}"

# 策略:Ping 国内可靠 IP (114.114.114.114)
ping -c 1 -W 2 114.114.114.114 > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo -e "${YELLOW}[诊断] IP 直连成功,确认是 DNS 问题。正在修复...${NC}"
    
    # 备份并修改 DNS
    cp /etc/resolv.conf /etc/resolv.conf.bak
    
    # 写入国内优化的 DNS 配置
    echo -e "nameserver 8.8.8.8\nnameserver 114.114.114.114\nnameserver 223.5.5.5" > /etc/resolv.conf
    
    echo "   -> 已将 DNS 修改为: 114.114.114.114, 223.5.5.5"
    
    # 再次测试
    ping -c 1 -W 2 www.baidu.com > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -e "${GREEN}[修复成功] DNS 已修正,网络现已恢复。${NC}"
    else
        echo -e "${RED}[失败] DNS 已修改但仍无法上网。可能是防火墙拦截或欠费。${NC}"
    fi
else
    echo -e "${RED}[失败] 无法连接外网 IP (114.114.114.114)。${NC}"
    echo "   -> 结论:虽然连通了网关,但路由器无法访问互联网(光猫故障/宽带欠费/公司防火墙)。"
fi

echo "------------------------------------------------"

🔍 第二阶段:在线诊断篇(流量分析与监控)

如果网络是通的,但服务器负载很高,或者访问速度很慢,我们需要用到更现代化的工具来定位“瓶颈”。

📊 主流诊断工具对比表

为了方便大家选择,我们将几款主流的开源工具进行了横向对比:

工具名称核心功能典型应用场景安装方式 (Ubuntu)推荐指数
Bandwhich进程级带宽监控网速突然变慢,想揪出是哪个后台程序在偷跑流量cargo install (Rust)⭐⭐⭐⭐⭐
Trippy (Trip)可视化路由追踪连接某网站卡顿,想看是中间哪个节点丢包了snap install⭐⭐⭐⭐⭐
MTR路由追踪 + Ping向云服务商提交工单时,提供标准的文本诊断报告apt install⭐⭐⭐⭐
Gping波形图 Ping调整无线设备位置,观察信号强度和延迟的抖动趋势snap install⭐⭐⭐
Netdata全系统仪表盘生产环境服务器,需要 7x24 小时回溯历史故障一键脚本⭐⭐⭐

🔍 第二阶段:在线诊断篇(流量分析与监控)

如果网络是通的,但服务器负载很高,或者访问速度很慢,我们需要用到更现代化的工具来定位“瓶颈”。

1. Bandwhich —— 抓出是谁在“偷”网速

Linux 自带的 iftop 只能看到 IP 地址,但 Bandwhich 能直接告诉你是哪个进程 (PID) 占用了带宽。

  • 适用场景:服务器带宽报警,你想知道是 Nginx 在跑流量,还是某个后台偷偷运行的脚本在上传数据。

  • 安装方法 (Ubuntu/Debian):

    • 推荐使用 Cargo (Rust 包管理器) 安装:

      Bash
      cargo install bandwhich
      
    • 或者直接下载编译好的二进制文件放到 /usr/local/bin

  • 使用方法

    Bash
    # 需要 root 权限才能获取进程信息
    sudo bandwhich
    
2. Trippy (Trip) —— 路由追踪终结者

traceroute 更快,比 mtr 界面更直观。它能帮你分析数据包在传输路径中,具体是在哪一个节点丢失的。

  • 适用场景:服务器连接某个外部 API 经常超时,你想确认是对方挂了,还是中间的线路抖动。

  • 安装方法

    Bash
    sudo snap install trippy
    
  • 使用方法

    Bash
    trip google.com
    

    界面操作:按 s 键可以切换显示模式,查看更详细的丢包率和延迟统计。

3. MTR (My Traceroute) —— 运维界的通用标准

虽然 Trippy 界面更好看,但 MTR 是所有 Linux 发行版的标配。当你向云服务商(如 AWS、阿里云)提交工单反馈网络问题时,他们通常只接受 MTR 的文字报告。

  • 适用场景:生成标准化的网络诊断报告,用于技术沟通或留档。

  • 安装方法

    Bash
    sudo apt install mtr      # Ubuntu/Debian
    sudo yum install mtr      # CentOS/RHEL
    
  • 使用方法

    • 实时查看模式

      Bash
      sudo mtr baidu.com
      
    • 生成报告模式 (最常用): 发送 100 个数据包后自动停止,并输出结果,适合复制粘贴。

      Bash
      sudo mtr -r -c 100 baidu.com
      
4. Gping —— 告别枯燥的数字

普通的 ping 命令输出的是瀑布流一样的文字,很难看出趋势。Gping 能在终端里画出实时的延迟波形图

  • 适用场景:在调整机房网线接触、测试无线信号强度,或者观察网络是否存在周期性的“抖动”时使用。

  • 安装方法

    Bash
    sudo snap install gping
    
  • 使用方法

    Bash
    # 基础用法
    gping 8.8.8.8
    
    # 同时对比内网网关和公网 DNS 的稳定性
    gping 192.168.1.1 8.8.8.8
    
5. Netdata —— 上帝视角的监控

如果你需要对服务器进行 7x24 小时的健康体检,Netdata 是目前最强的开源方案之一。它不仅监控网络,还能监控 CPU、磁盘、内存等数千个指标。

  • 适用场景:生产环境服务器,需要回溯“昨天凌晨 3 点网络为什么断了”这种历史问题。

  • 安装方法 (官方一键脚本):

    Bash

    wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh && sh /tmp/netdata-kickstart.sh
    
  • 使用方法: 安装完成后,打开浏览器访问 http://服务器IP:19999,即可看到实时的动态仪表盘。

💡 总结建议

Linux 网络排查的核心思路是**“先通断,后质量,再流量”**。遇到问题时,请按照以下逻辑对号入座:

  1. 完全断网/无外网:不要慌,直接运行自制的 net_check.sh 脚本,快速定位是物理层、网关还是 DNS 的问题。

  2. 查路由/丢包:首选 Trippy 进行可视化排查;如果需要向云服务商提交工单,请使用 MTR 生成标准文本报告。

  3. 查波动/抖动:使用 Gping 观察延迟波形的平稳度,判断网络是否不稳定。

  4. 查异常流量:网速突然变慢时,用 Bandwhich 精准揪出占用带宽的进程。

  5. 长期监控:在生产环境部署 Netdata,以便在故障发生后回溯历史数据。

最后建议:请务必将 net_check.sh 脚本保存到你的服务器初始化配置或常用 U 盘中。在无法联网下载任何工具的紧急时刻,它会是你最可靠的帮手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值