引言
在 Linux 服务器的运维或开发中,网络问题往往是最让人头疼的。你可能遇到过这些情况:SSH 突然连不上了、服务接口响应极慢、或者想安装一个软件却提示“无法解析域名”。
对于 Linux 环境,我们将问题分为两种极端情况来处理:
-
完全断网:无法使用
apt或yum安装任何新工具,只能靠系统自带命令“徒手”修。 -
网络质量差:网是通的,但丢包或卡顿,需要用高级工具找出是哪个进程或哪个路由节点出了问题。
🚑 第一阶段:急救篇(完全断网/无法装包怎么办?)
当你面对一台连不上外网的 Linux 机器,或者身处内网隔离环境,你唯一的武器就是 Shell 脚本。
我们整理了一个零依赖全自动诊断脚本。它只使用 Linux 最基础的 ip, ping, grep 命令,不需要安装任何东西。你可以把它保存在 U 盘里插到服务器上,或者对着屏幕手敲进去。
🛠️ 自制工具:Auto-Net-Diag (自动网络诊断脚本)
脚本逻辑:
它会像医生查体一样,按顺序检查:网卡物理状态 -> IP 地址分配 -> 网关连通性 -> DNS 解析 -> 外网连接。只要有一步失败,它就会报错并给出建议。
使用方法:
-
在终端创建一个文件:
vi net_check.sh -
粘贴下面的代码,保存并退出。
-
赋予执行权限:
chmod +x net_check.sh -
运行:
./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 包管理器) 安装:
Bashcargo install bandwhich -
或者直接下载编译好的二进制文件放到
/usr/local/bin。
-
-
使用方法:
Bash# 需要 root 权限才能获取进程信息 sudo bandwhich
2. Trippy (Trip) —— 路由追踪终结者
比 traceroute 更快,比 mtr 界面更直观。它能帮你分析数据包在传输路径中,具体是在哪一个节点丢失的。
-
适用场景:服务器连接某个外部 API 经常超时,你想确认是对方挂了,还是中间的线路抖动。
-
安装方法:
Bashsudo snap install trippy -
使用方法:
Bashtrip google.com界面操作:按
s键可以切换显示模式,查看更详细的丢包率和延迟统计。
3. MTR (My Traceroute) —— 运维界的通用标准
虽然 Trippy 界面更好看,但 MTR 是所有 Linux 发行版的标配。当你向云服务商(如 AWS、阿里云)提交工单反馈网络问题时,他们通常只接受 MTR 的文字报告。
-
适用场景:生成标准化的网络诊断报告,用于技术沟通或留档。
-
安装方法:
Bashsudo apt install mtr # Ubuntu/Debian sudo yum install mtr # CentOS/RHEL -
使用方法:
-
实时查看模式:
Bashsudo mtr baidu.com -
生成报告模式 (最常用): 发送 100 个数据包后自动停止,并输出结果,适合复制粘贴。
Bashsudo mtr -r -c 100 baidu.com
-
4. Gping —— 告别枯燥的数字
普通的 ping 命令输出的是瀑布流一样的文字,很难看出趋势。Gping 能在终端里画出实时的延迟波形图。
-
适用场景:在调整机房网线接触、测试无线信号强度,或者观察网络是否存在周期性的“抖动”时使用。
-
安装方法:
Bashsudo 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 点网络为什么断了”这种历史问题。
-
安装方法 (官方一键脚本):
Bashwget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh && sh /tmp/netdata-kickstart.sh -
使用方法: 安装完成后,打开浏览器访问
http://服务器IP:19999,即可看到实时的动态仪表盘。
💡 总结建议
Linux 网络排查的核心思路是**“先通断,后质量,再流量”**。遇到问题时,请按照以下逻辑对号入座:
-
完全断网/无外网:不要慌,直接运行自制的
net_check.sh脚本,快速定位是物理层、网关还是 DNS 的问题。 -
查路由/丢包:首选 Trippy 进行可视化排查;如果需要向云服务商提交工单,请使用 MTR 生成标准文本报告。
-
查波动/抖动:使用 Gping 观察延迟波形的平稳度,判断网络是否不稳定。
-
查异常流量:网速突然变慢时,用 Bandwhich 精准揪出占用带宽的进程。
-
长期监控:在生产环境部署 Netdata,以便在故障发生后回溯历史数据。
最后建议:请务必将 net_check.sh 脚本保存到你的服务器初始化配置或常用 U 盘中。在无法联网下载任何工具的紧急时刻,它会是你最可靠的帮手。
641

被折叠的 条评论
为什么被折叠?



