首页/系统/Linux 内核与性能调优速查/网络命名空间排查方法
网络栈调优98 条

网络命名空间排查方法

容器网络问题先在对应 netns 内查看: 监听、地址、路由与宿主看到的可能完全不同。

命名空间内排查

网络命名空间是一套独立的网络栈视图:接口、地址、路由表、连接跟踪表与监听端口都各自一份。容器正是靠它做隔离。这意味着在宿主机上看到的结果与容器内部可能完全不同,网络问题必须先在目标命名空间内确认事实,再与宿主对照,否则容易得出相反结论。

基本信息

适用平台Linux(容器与手工创建的命名空间)
常用命令列出、切换到指定命名空间执行命令
权限要求root 或具备相应能力
排查顺序先确认在哪个命名空间,再看监听与路由
对照对象宿主侧接口与容器侧接口的配对关系

典型使用场景

  • 容器内服务访问不通,先确认服务在容器内是否真的在监听。
  • 宿主端口映射看起来正常,容器内监听地址却只绑了回环。
  • 对比两侧接口统计,判断丢包发生在容器内部还是宿主侧。
  • 排查连接跟踪表在哪个命名空间被占满。
  • 手工搭建隔离环境验证路由与转发规则。

进入与对比

进入与对比
ip netns list                        # 列出已创建的命名空间
ip netns exec ns1 ip addr show       # 在指定命名空间内看地址
ip netns exec ns1 ip route show      # 看命名空间内的路由表
nsenter -t $(pidof nginx) -n ss -lntp | head   # 进入某进程所在的网络命名空间查看监听
nsenter -t $(pidof nginx) -n ip -br addr       # 对照该命名空间内的接口与地址
ip -s link show veth1234             # 宿主侧接口统计,与容器内一侧对照

两侧对比检查项

检查项宿主视角命名空间视角
监听端口看到的是宿主进程容器内服务才可见
接口地址veth 宿主端地址容器侧地址与回环
路由宿主主路由表容器内独立路由与默认网关
连接跟踪宿主表容量容器内独立表
进入命名空间前先确认进程与容器的对应关系:命名空间编号与容器名不是一回事,进错地方得到的结论会误导整个排查方向。
在宿主命名空间里查容器监听是常见误区:宿主上「没有监听」不代表容器内没起服务,反之也一样,先确认视角再下结论。

易错点

  • 在宿主命名空间查容器内的监听与路由,得到误导性结论,白花时间在错误的方向上。
  • 未确认进程对应关系就进入命名空间:可能进到别的容器或宿主视图,数据与问题现象对不上。
  • 只看单侧统计:丢包与错误计数需要两侧对照,才能判断发生在哪一段。
  • 忽略连接跟踪表按命名空间独立计数:宿主机表很空不代表容器内没有占满。
  • 在生产容器里手工改路由或规则且不留记录:容器重建后改动消失,问题复现时找不到原因。

数据来源与参考

  • man ip-netns
  • man nsenter
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌