0

0

网络 namespace 泄漏导致 ip netns list 爆满的批量清理脚本

舞夢輝影

舞夢輝影

发布时间:2026-01-19 13:25:03

|

371人浏览过

|

来源于php中文网

原创

安全批量清理泄漏网络命名空间需先预览再执行:脚本通过检查/var/run/netns/下符号链接、进程引用、白名单及创建时间识别泄漏项,支持dry-run模式、自动跳过活跃namespace,并提供unlink回退机制。

网络 namespace 泄漏导致 ip netns list 爆满的批量清理脚本

当系统中存在大量残留的网络 namespace(如容器、测试环境或异常退出进程遗留),ip netns list 会显示成百上千个命名空间,不仅影响排查效率,还可能拖慢网络操作。根本原因常是未正确销毁 namespace(如未执行 ip netns delete 或挂载点残留),导致内核中 namespace 对象未释放。

确认哪些 namespace 是“泄漏”的

真正泄漏的 namespace 通常满足以下特征:

  • 对应目录 /var/run/netns/xxx 存在,但无任何进程正在使用它(ls -l /proc/*/ns/net 2>/dev/null | grep xxx 无匹配)
  • namespace 名称含明显临时标识(如 test-*tmp_*ns_2024*、UUID 片段等)
  • 创建时间久远(可通过 stat /var/run/netns/xxx | grep Modify 判断)且无关联容器运行(docker ps --filter "network=xxx" -q 为空)

安全批量清理脚本(带预览与白名单)

以下 Bash 脚本支持预览模式、白名单保护、自动跳过正在使用的 namespace:

千问APP
千问APP

阿里最强大模型官方AI助手

下载
#!/bin/bash
# safe-netns-cleanup.sh
NETNS_DIR="/var/run/netns"
WHITELIST=("default" "host" "myns-prod")  # 修改为你需要保留的名称

list_leaked() { find "$NETNS_DIR" -maxdepth 1 -type l -printf "%f\n" 2>/dev/null | while read ns; do

跳过白名单

    [[ " ${WHITELIST[@]} " =~ " $ns " ]] && continue
    # 检查是否被进程引用
    if ! ls -l /proc/*/ns/net 2>/dev/null | grep -q "$(readlink -f "$NETNS_DIR/$ns")"; then
        echo "$ns"
    fi
done | sort -u

}

if [[ "${1:-}" == "--dry-run" ]]; then echo "[DRY RUN] Would delete these leaked namespaces:" list_leaked | tee /tmp/netns-to-delete.log echo "Total: $(wc -l

echo "Cleaning up leaked namespaces..." list_leaked | while read ns; do echo -n "Deleting $ns... " if ip netns delete "$ns" 2>/dev/null; then echo "OK" else

回退:手动 unlink(仅当 ip netns delete 失败时)

    if [[ -e "$NETNS_DIR/$ns" ]]; then
        rm -f "$NETNS_DIR/$ns"
        echo "unlinked (ip netns delete failed)"
    else
        echo "already gone"
    fi
fi

done

执行前必做三件事

  • 先运行 ./safe-netns-cleanup.sh --dry-run 查看将要删除的列表,人工核对前 10 行是否合理
  • 确保没有正在运行的容器或 systemd service 依赖这些 namespace(尤其是以 netns= 方式启动的服务)
  • 备份关键 namespace(如生产用):ip netns exec myprod ip a 记录配置,或 cp /var/run/netns/myprod /tmp/ns-myprod.bak

防止再次泄漏的建议

  • 所有创建 namespace 的脚本/CI 步骤,必须配对 trap 'ip netns delete xxx' EXIT
  • 避免直接 ln -s 创建 netns,统一用 ip netns add(它会自动处理挂载和权限)
  • 定期巡检:systemd-run --on-calendar="daily" --timer-property=Persistent=true /path/to/safe-netns-cleanup.sh

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

751

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

90

2023.09.25

java中calendar类的用法
java中calendar类的用法

Java Video类是JavaFX库中的一个类,用于创建和操作视频对象。它提供了方法来加载、播放、暂停、停止和控制视频的音量、速度和循环等属性。想了解更多Java中类的相关内容,可以阅读本专题下面的文章。

308

2024.02.29

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.29

k8s和docker区别
k8s和docker区别

k8s和docker区别有抽象层次不同、管理范围不同、功能不同、应用程序生命周期管理不同、缩放能力不同、高可用性等等区别。本专题为大家提供k8s和docker区别相关的各种文章、以及下载和课程。

252

2023.07.24

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号