Linux namespace 怎样查看进程所在网络空间
排查容器或隔离服务的网络问题时,先别急着看宿主机的网卡。一个进程真正使用哪套路由、端口和网络设备,取决于它所在的 network namespace。最稳妥的入口是读取 /proc/PID/ns/net:它会给出类似 net:[4026531993] 的命名空间标识;再根据需要用 lsns 展开清单,或用 nsenter 临时切换到目标进程的网络视角。
这套检查应当分成两层:先做无副作用的身份判断,再做只读的网卡和路由观察。只有确实需要时才进入目标命名空间,避免把排障权限扩大成网络配置权限。
先界定要保护的网络资产
Linux 的 network namespace 会隔离网络设备、IPv4/IPv6 协议栈、路由表、防火墙规则、端口以及 /proc/net 等网络视图。也就是说,同一台机器上的两个进程,即使 PID 都能在宿主机看到,它们看到的 ip addr 和 ip route 也可能完全不同。
这也是排障时最容易出现的误判:在宿主机执行 ip route 只能回答“当前 shell 所在空间有什么路由”,不能直接回答“目标进程使用什么路由”。先确认 namespace,再决定从哪个视角取证。

用 /proc/PID/ns/net 判断进程属于哪个空间
每个进程都有自己的 namespace 链接目录。读取其中的 net 项,可以得到内核为该网络空间展示的标识。两个进程的 readlink 结果相同,通常说明它们位于同一个 network namespace;结果不同,则说明它们的网络视角已经隔离。
#!/usr/bin/env bash
# 只读取 namespace 链接,不修改目标进程或网络配置
pid="${1:?请传入要检查的 PID}"
ns_path="/proc/${pid}/ns/net"
# 进程退出或权限不足时,先给出明确错误
if [[ ! -r "$ns_path" ]]; then
printf '无法读取 %s,请确认 PID 存在且当前用户可见\n' "$ns_path" >&2
exit 1
fi
# 输出形如 net:[4026531993] 的网络空间标识
readlink "$ns_path"
# 比较两个进程时,比较它们各自的 readlink 结果
# readlink "/proc/${pid_a}/ns/net"
# readlink "/proc/${pid_b}/ns/net"
这里的数字不是容器名,也不是网卡名,而是 namespace 链接显示的标识。它适合做第一层判断:例如先记录服务 PID 的标识,再与宿主机 shell 的 /proc/$$/ns/net 比较。不要把固定数字写进监控规则;进程和命名空间生命周期变化后,下一次创建的标识可能不同。
用 lsns 和 ip netns 解释清单与名称
readlink 解决“是不是同一个空间”,但不一定告诉你这个空间是否由 ip netns 注册了名称。安装了 util-linux 时,lsns 可以从 namespace 清单角度查看目标 PID;而 ip netns identify 只适合查找 iproute2 管理的命名空间名称,两者用途不要混为一谈。
# 只列出与目标 PID 相关的 network namespace 记录 lsns -t net -p "$pid" # 只查询 iproute2 已注册的命名空间名称;没有名称不等于没有 namespace ip netns identify "$pid" # 查看当前主机上可见的命名空间和关联进程摘要 lsns -t net
| 命令 | 回答的问题 | 边界 |
|---|---|---|
readlink /proc/PID/ns/net | 目标进程的网络空间标识是什么 | 信息简洁,依赖 /proc 可见性 |
lsns -t net -p PID | 该 PID 对应哪条 network namespace 记录 | 依赖 util-linux,展示的是系统清单 |
ip netns identify PID | 是否存在 iproute2 注册的名称 | 未命名空间可能返回空 |
对于安全审计,建议把 PID、采集时间、readlink 结果和命令执行身份一起记录。PID 可能被复用,单独保存一个旧 PID 不能证明它仍然指向原来的进程。
用 nsenter 读取进程实际看到的网络状态
确认标识后,如果问题是“进程为什么连不上”,才需要从目标空间读取地址和路由。nsenter -t PID -n 会让后续命令使用目标进程的 network namespace;下面的例子只调用 ip -br addr 和 ip route 做只读观察。
# 目标 PID 只作为 namespace 入口,不在目标空间写入网络配置
target_pid="${1:?请传入要观察的 PID}"
# 从目标进程的网络视角查看接口和地址
sudo nsenter -t "$target_pid" -n -- ip -br addr
# 从同一个网络视角查看 IPv4 路由
sudo nsenter -t "$target_pid" -n -- ip route
# 需要 IPv6 时单独查看,避免把两类路由混在判断里
sudo nsenter -t "$target_pid" -n -- ip -6 route
这一步通常需要足够的权限;如果目标进程不可见、已经退出,或者当前账号没有进入该 namespace 的能力,nsenter 会失败。此时先回到 readlink 和 lsns 的只读检查,不要为了“看一眼路由”直接修改目标空间的权限或网络配置。

按风险分级保留排查证据
可以把检查分成三个等级。第一层是 readlink:只读链接,适合快速确认和比较。第二层是 lsns、ip netns identify:补充系统清单和名称,适合把标识翻译成运维记录。第三层是 nsenter 加只读 ip:得到进程真实网络视角,但权限要求更高,也更接近敏感排障动作。
最终记录至少包含目标 PID、进程启动时间或其他稳定身份线索、namespace 标识、采集命令和权限上下文。若 PID 已经退出,旧的 /proc/PID 路径不能继续当作证据;若两个进程的 namespace 标识相同,也只能说明它们共享网络空间,不能据此推断应用一定能互相连接,端口监听、路由和防火墙仍需在该空间内分别观察。
相关问题
为什么宿主机能看到网卡,进程却看不到?最常见原因是进程位于不同的 network namespace;先比较两个进程的 /proc/PID/ns/net 标识。
ip netns identify 没有输出,是不是没有网络空间?不是。它只查 iproute2 注册的名称;未命名的网络空间仍然可以通过 /proc/PID/ns/net 和 lsns 判断。
nsenter 进入后为什么还看不到预期路由?先确认目标 PID 没有退出或被复用,再确认使用了 -n 网络选项,并分别查看 IPv4、IPv6、接口地址和防火墙规则。
Linux io_uring 怎样理解提交队列和完成队列
- 上一篇
- Linux io_uring 怎样理解提交队列和完成队列
- 下一篇
- Linux /proc/meminfo 怎样区分缓存和可用内存
-
- 文章 · linux | 58分钟前 |
- Linux ulimit 怎样判断文件句柄上限
- 125浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux ss 怎样查看连接的 TCP 状态变化
- 335浏览 收藏
-
- 文章 · linux | 1小时前 | 内存 · linux运维 · 性能排查 · Linux 内存诊断 /proc/meminfo MemAvailable Cached
- Linux /proc/meminfo 怎样区分缓存和可用内存
- 157浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux io_uring 怎样理解提交队列和完成队列
- 387浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux journalctl 怎样按时间和服务过滤日志
- 179浏览 收藏
-
- 文章 · linux | 1小时前 |
- Linux systemd ExecStartPre 怎样在启动前检查配置文件
- 284浏览 收藏
-
- 文章 · linux | 2小时前 |
- Linux cgroup v2 怎样读取进程 CPU 使用量
- 250浏览 收藏
-
- 文章 · linux | 2小时前 |
- Linux cgroup v2 memory.swap.max 怎样限制交换空间
- 336浏览 收藏
-
- 文章 · linux | 1天前 |
- systemd-analyze calendar 校验 OnCalendar 表达式的实用方法
- 384浏览 收藏
-
- 文章 · linux | 1天前 |
- Linux find 大小时间 怎样处理
- 490浏览 收藏
-
- 文章 · linux | 1天前 | Linux · Linux memory.max memory.high cgroups v2
- Linux cgroups v2 内存 怎样处理
- 126浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 615次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 654次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 687次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 647次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 477次使用
-
- Linux vmstat 如何分辨内存抖动与磁盘等待:si、so、wa 与复测顺序
- 2026-08-30 501浏览
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览

