Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我
所有文章 外链

Linking

Capturing Life & Tech

  • 主页
  • 随笔
  • 关于我

Ubuntu 22.04 服务器网络问题定位与解决

阅读数:次 2025-04-12
字数统计: 2.3k字   |   阅读时长≈ 10分

Ubuntu 22.04 服务器网络问题定位与解决:从底层到上层的全面排查

在配置 Ubuntu 22.04 服务器的网络时,我遇到了无线网卡(wlp3s0)和有线网卡(enp4s0)无法自动连接的问题:运行 netplan apply 会导致无线网络被屏蔽,未运行时无线网卡无法分配 IP,有线网卡也无法自动获取 IP。经过一系列排查,我从硬件层到用户空间逐步定位问题,最终解决了网络配置的难题。本文将详细介绍 Ubuntu 22.04 的网络管理逻辑,并提供一个从底层到上层的排查方法与自动化脚本,下次应对类似问题就有了思路和参照。

Ubuntu 22.04 网络管理逻辑

Ubuntu 22.04 的网络管理涉及多个层次,以下是从底层到上层的启动流程:

  1. 硬件层

    • 网卡硬件(如无线和有线设备)通过固件支持运行。
    • 检查 MOQ 检查:lspci、lsusb。
  2. 内核层

    • 内核加载驱动模块(如 iwlwifi、r8169),创建网络接口(如 wlp3s0、enp4s0)。
    • RFKill 管理射频开关,可能屏蔽无线设备。
    • MOQ 检查:ip link、rfkill list、lsmod。
  3. 系统服务层

    • udev 动态管理设备,systemd 启动网络服务。
    • MOQ 检查:journalctl -u systemd-udev。
  4. 网络配置层(Netplan)

    • 通过 /etc/netplan/*.yaml 定义网络配置,渲染器可选 systemd-networkd(服务器)或 NetworkManager(桌面)。
    • MOQ 检查:cat /etc/netplan/*.yaml、netplan apply。
  5. 网络管理层

    • NetworkManager 或 systemd-networkd 执行配置。
    • MOQ 检查:nmcli dev status、systemctl status NetworkManager。
  6. 用户空间

    • 工具(如 nmcli)或桌面环境管理网络。
    • MOQ 检查:nmcli dev wifi list、ip addr。

问题背景

在我的 Ubuntu 22.04 服务器上:

  • 无线网卡(wlp3s0)无法自动连接,运行 sudo ip link set wlp3s0 up 报错 RTNETLINK answers: Operation not possible due to rfkill。
  • 运行 netplan apply 后无线网络被屏蔽。
  • 有线网卡(enp4s0)插上网线后未自动获取 IP,显示 NO-CARRIER。

这些问题让我困惑:为什么网络无法正常工作?原因出在哪里?

排查思路:从底层到上层

为了定位问题,我采用了从硬件到用户空间的逐层排查方法:

1. 硬件层

  • 检查:lspci | grep -i network 和 sudo lshw -C network 确认网卡是否存在并有驱动。
  • 发现:wlp3s0 有驱动(iwlwifi),但 enp4s0 显示 NO-CARRIER。
  • 解决:更换网线后 cat /sys/class/net/enp4s0/carrier 从 0 变为 1,确认物理连接正常。

2. 内核层

  • 检查:ip link 显示 wlp3s0 为 DOWN,rfkill list 显示 Soft blocked: yes。
  • 解决:sudo rfkill unblock wifi 解除屏蔽,sudo ip link set wlp3s0 up 成功启用。

3. 系统服务层

  • 检查:systemctl status NetworkManager 和 systemd-networkd 均运行。
  • 发现:服务冲突。
  • 解决:禁用 systemd-networkd(sudo systemctl disable systemd-networkd)。

4. Netplan 配置层

  • 检查:cat /etc/netplan/01-netcfg.yaml 未指定 renderer,权限过宽。
  • 解决:
    • 设置 renderer: NetworkManager:
      1
      2
      3
      network:
      version: 2
      renderer: NetworkManager
    • 修复权限:sudo chmod 600 /etc/netplan/01-netcfg.yaml。
    • 应用:sudo netplan apply,不再屏蔽无线网。

5. NetworkManager 层

  • 检查:nmcli dev status 显示 wlp3s0 为 disconnected,enp4s0 为 unmanaged。
  • 解决:
    • 启用管理:sudo nmcli dev set enp4s0 managed yes。
    • 配置固定 IP 并连接无线:
      1
      2
      3
      sudo nmcli con add type wifi ifname wlp3s0 con-name "CENI-HF" ssid "CENI-HF" ipv4.method manual ipv4.addresses "192.168.1.100/24" ipv4.gateway "192.168.1.1" ipv4.dns "8.8.8.8"
      sudo nmcli con mod "CENI-HF" wifi-sec.key-mgmt wpa-psk wifi-sec.psk "YOUR_PASSWORD"
      sudo nmcli con up "CENI-HF"
    • 配置有线自动连接:
      1
      2
      sudo nmcli con add type ethernet ifname enp4s0 con-name "Wired connection 1" autoconnect yes
      sudo nmcli con up "Wired connection 1"

6. 用户空间验证

  • 检查:ip addr 显示 wlp3s0 和 enp4s0 均分配 IP,ping 8.8.8.8 成功。
  • 结果:网络恢复正常。

自动化检测脚本

为了方便排查,我编写了一个 Bash 脚本,从底层到上层逐层检查并输出结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/bin/bash

# 检测脚本:从底层到上层检查网络问题
# 使用方法:保存为 check_network.sh,chmod +x check_network.sh,sudo ./check_network.sh

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

# 检查是否以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo -e "${RED}请以 root 权限运行此脚本(使用 sudo)${NC}"
exit 1
fi

echo -e "${GREEN}=== 开始检测网络问题(Ubuntu 22.04) ===${NC}\n"

# --- 1. 硬件层 ---
echo -e "${YELLOW}1. 检查硬件层${NC}"
echo "检查无线网卡硬件:"
lspci | grep -i network || echo "未找到 PCI 无线网卡,可能为 USB 设备"
lsusb | grep -i wireless || echo "未找到 USB 无线设备"
echo "检查有线网卡硬件:"
lspci | grep -i ethernet || echo "未找到有线网卡"
echo -e "\n检查网卡详细信息:"
lshw -C network | grep -E "description|product|vendor|logical name|driver|firmware|configuration"
echo -e "${GREEN}建议:若无 driver 或 firmware,安装对应固件(如 firmware-iwlwifi 或 firmware-linux)。${NC}\n"

# --- 2. 内核层 ---
echo -e "${YELLOW}2. 检查内核层${NC}"
echo "检查接口状态:"
ip link show wlp3s0 || echo "无线接口 wlp3s0 不存在"
ip link show enp4s0 || echo "有线接口 enp4s0 不存在"
echo "检查 RFKill 状态:"
rfkill list
if rfkill list | grep -q "Soft blocked: yes\|Hard blocked: yes"; then
echo -e "${RED}发现 RFKill 屏蔽,尝试解除...${NC}"
rfkill unblock wifi
rfkill unblock all
echo "解除屏蔽后的状态:"
rfkill list
fi
echo "检查加载的模块:"
lsmod | grep -E "wifi|iwlwifi|ath9k|brcm|r8169" || echo "未找到相关网络模块"
echo -e "${GREEN}建议:若接口不存在或 RFKill 屏蔽,检查驱动(modprobe iwlwifi)或硬件开关。${NC}\n"

# --- 3. 系统服务层 ---
echo -e "${YELLOW}3. 检查系统服务层${NC}"
echo "检查 udev 日志(最近 50 行):"
journalctl -u systemd-udev | grep -i "wlp3s0\|enp4s0" | tail -n 50
echo "检查网络服务状态:"
systemctl status systemd-networkd --no-pager | grep "Active:"
systemctl status NetworkManager --no-pager | grep "Active:"
echo -e "${GREEN}建议:若 systemd-networkd 和 NetworkManager 同时运行,可能冲突,推荐禁用 systemd-networkd。${NC}\n"

# --- 4. Netplan 配置层 ---
echo -e "${YELLOW}4. 检查 Netplan 配置层${NC}"
echo "当前 Netplan 配置:"
cat /etc/netplan/*.yaml 2>/dev/null || echo "未找到 Netplan 配置文件"
echo "检查文件权限:"
ls -l /etc/netplan/*.yaml
if ls -l /etc/netplan/*.yaml | grep -qv "rw-------"; then
echo -e "${RED}权限过宽,修复中...${NC}"
chmod 600 /etc/netplan/*.yaml
chown root:root /etc/netplan/*.yaml
echo "修复后权限:"
ls -l /etc/netplan/*.yaml
fi
echo "测试 Netplan 配置:"
netplan generate 2>&1
echo -e "${GREEN}建议:确保 renderer 为 NetworkManager(桌面版推荐)。${NC}\n"

# --- 5. NetworkManager 层 ---
echo -e "${YELLOW}5. 检查 NetworkManager 层${NC}"
echo "检查设备状态:"
nmcli dev status
echo "检查连接状态:"
nmcli con show
echo "检查无线开关:"
nmcli radio wifi
if nmcli radio wifi | grep -q "disabled"; then
echo -e "${RED}无线开关已禁用,启用中...${NC}"
nmcli radio wifi on
echo "启用后状态:"
nmcli radio wifi
fi
echo "扫描 Wi-Fi 网络:"
nmcli dev wifi list | head -n 10 || echo "无法扫描 Wi-Fi"
echo "检查 NetworkManager 日志(最近 50 行):"
journalctl -u NetworkManager --since "10 minutes ago" | tail -n 50
echo -e "${GREEN}建议:若 wlp3s0 unavailable,尝试 nmcli dev set wlp3s0 managed yes。${NC}\n"

# --- 6. 用户空间验证 ---
echo -e "${YELLOW}6. 用户空间验证${NC}"
echo "检查 IP 分配:"
ip addr show wlp3s0 || echo "wlp3s0 未分配 IP"
ip addr show enp4s0 || echo "enp4s0 未分配 IP"
echo "检查物理连接:"
cat /sys/class/net/wlp3s0/carrier 2>/dev/null || echo "wlp3s0 无 carrier 文件"
cat /sys/class/net/enp4s0/carrier 2>/dev/null || echo "enp4s0 无 carrier 文件"
echo "测试网络连通性:"
ping -c 4 8.8.8.8 && echo "网络正常" || echo "无法 ping 通 8.8.8.8"
echo -e "${GREEN}建议:若无 IP,手动连接 nmcli con up 'CENI-HF' 或 dhclient wlp3s0。${NC}\n"

# --- 总结 ---
echo -e "${GREEN}=== 检测完成 ===${NC}"
echo "请检查以上输出,重点关注红色标记的错误。"
echo "常见问题修复建议:"
echo "1. RFKill 屏蔽:sudo rfkill unblock all"
echo "2. 驱动缺失:sudo apt install firmware-iwlwifi firmware-linux"
echo "3. 配置冲突:将 /etc/netplan/*.yaml 设置为 renderer: NetworkManager"
echo "4. IP 未分配:sudo nmcli con up 'CENI-HF' 或 sudo dhclient wlp3s0"
echo "如需进一步帮助,请提供脚本完整输出!"

经验教训

  1. 逐层排查是关键
    从硬件到用户空间,避免盲目猜测。【正确的思路很重要】
  2. 避免服务冲突
    明确使用 NetworkManager【桌面】 或 systemd-networkd【服务器】,不要同时运行。
  3. 检查 RFKill
    无线问题常与射频屏蔽有关。
  4. 权限与配置
    Netplan 文件需正确权限(600)和语法。

结语

通过这次排查,我不仅解决了网络问题,还深入理解了 Ubuntu 22.04 的网络管理机制。无论是服务器还是桌面环境,掌握从底层到上层的逻辑都能让你游刃有余地应对网络挑战。

  • 本文作者: Linking
  • 本文链接: https://linking.fun/2025/04/12/Ubuntu-22-04-服务器网络问题定位与解决/
  • 版权声明: 版权所有,转载请注明出处!
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • cs

扫一扫,分享到微信

(no title)
docker container network connect with host and another local area network host with macvlan
  1. 1. Ubuntu 22.04 服务器网络问题定位与解决:从底层到上层的全面排查
    1. 1.1. Ubuntu 22.04 网络管理逻辑
    2. 1.2. 问题背景
    3. 1.3. 排查思路:从底层到上层
      1. 1.3.1. 1. 硬件层
      2. 1.3.2. 2. 内核层
      3. 1.3.3. 3. 系统服务层
      4. 1.3.4. 4. Netplan 配置层
      5. 1.3.5. 5. NetworkManager 层
      6. 1.3.6. 6. 用户空间验证
    4. 1.4. 自动化检测脚本
    5. 1.5. 经验教训
    6. 1.6. 结语
© 2015-2026 Linking
GitHub:hexo-theme-yilia-plus by Litten
本站总访问量次 | 本站访客数人
  • 所有文章
  • 外链

tag:

  • weather
  • 需求
  • essay
  • basketball
  • olympic
  • nginx
  • APPScan
  • SQl盲注
  • xss
  • Ajax
  • ajax
  • ai
  • agent
  • openclaw
  • ccf
  • Nginx
  • HTML5
  • html5
  • hmtl5
  • sse
  • JavaScriptCore
  • Oracle
  • operation
  • Linux
  • deploy
  • Mac Office
  • markdown
  • ListView
  • GridView
  • MySQL
  • 慢查询
  • mongodb
  • 转置
  • thought
  • network
  • ubuntu
  • NetworkManager
  • RFKill
  • Netplan
  • avatar
  • cocoa
  • blog
  • Gitalk
  • container
  • macvlan
  • docker
  • oracle
  • cookie
  • patch
  • gitea
  • git
  • iOS
  • https
  • 多线程
  • bundle
  • 兼容性
  • HTTP
  • 绘图
  • cs
  • java
  • 效率
  • 快捷键
  • route
  • nodejs
  • pip
  • arcgis
  • arcgis 建模
  • 标识
  • redis
  • read
  • bookList
  • running
  • showdoc
  • disk
  • unit-test
  • D.Wade
  • thoughts
  • duoduo
  • Python
  • python
  • tomcat
  • 读书节
  • session
  • jdk
  • war
  • 加班
  • Android onclick事件监听
  • 正则
  • 手机品牌匹配
  • ntp
  • OpenLayers
  • Geoserver
  • wechat
  • 微信公众号
  • 爬虫
  • WeChat
  • 张靓颖
  • 动漫
  • vpn
  • PPT
  • MarkDown
  • plan
  • 朱赟
  • 极客时间专栏
  • 极客邦
  • 模块化
  • MVC
  • excel
  • NBA
  • kobe
  • team
  • crawler
  • 进度条
  • ssl
  • book
  • anti-stealing-link
  • Agentic Engineering
  • Vibe Coding
  • Software 3.0
  • Andrej Karpathy
  • LLM
  • Programming

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • GitHub Trending
  • OpenAI ChatGPT
  • Gitee码云
  • 简书
  • CSDN