AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1044516
Accepted
milosgajdos
milosgajdos
Asked: 2020-12-02 03:00:20 +0800 CST2020-12-02 03:00:20 +0800 CST 2020-12-02 03:00:20 +0800 CST

如何在特定的网络命名空间中使用 ss

  • 772

在调查容器中的一些 TCP 网络问题时,我试图用来ss窥探容器网络 TCP 堆栈。

我们在 AWS 中运行 Amazon Linux:

# uname -a
Linux 4.14.173-137.229.amzn2.x86_64 #1 SMP Wed Apr 1 18:06:08 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

ss有以下 cli 开关:

       -N NSNAME, --net=NSNAME
              Switch to the specified network namespace name.

lsns给我以下输出:

# lsns | grep net
4026531993 net       225     1 root      /usr/lib/systemd/systemd --switched-root --system --deserialize 21
4026532284 net         2 26244 root      /pause

这是pause为每个Kubernetespod 创建的容器——它是创建网络命名空间的容器。

尝试通过运行以下命令查看 pod 网络命名空间ss:

# ss -tp -N 4026532284
Cannot open network namespace "4026532284": No such file or directory

有趣的是 ip netns list不返回任何网络命名空间:

# ip netns list
#

有什么方法可以从根网络命名空间(即 netns 1)查看 K8s pod 网络命名空间?

# ss --version
ss utility, iproute2-ss180129

# lsns --version
lsns from util-linux 2.30.2

# rpm -qi iproute
Name        : iproute
Version     : 4.15.0
Release     : 1.amzn2.0.4
Architecture: x86_64
Install Date: Sat 07 Mar 2020 03:42:24 AM UTC
Group       : Applications/System
Size        : 1321292
License     : GPLv2+ and Public Domain
Signature   : RSA/SHA256, Fri 21 Feb 2020 09:00:29 PM UTC, Key ID 11cf1f95c87f5b1a
Source RPM  : iproute-4.15.0-1.amzn2.0.4.src.rpm
Build Date  : Fri 21 Feb 2020 07:56:50 PM UTC
Build Host  : build.amazon.com
Relocations : (not relocatable)
Packager    : Amazon Linux
Vendor      : Amazon Linux
URL         : http://kernel.org/pub/linux/utils/net/iproute2/
Summary     : Advanced IP routing and network device configuration tools

更新:2020 年 12 月 1 日星期二 11:35:39 UTC

经过一番挣扎,我终于下定了决心strace。

事实证明这ss是一个很棒的工具,但是当它与容器一起使用时,它还有一点不足之处,但我觉得涉及的“罪魁祸首”不止一个。

ss无需查找创建网络名称空间的进程的实际 PID,而是直接检查/var/run/netns:

openat(AT_FDCWD, "/var/run/netns/4026532284", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "Cannot open network namespace \"4"..., 70Cannot open network namespace "4026532284": No such file or directory
) = 70

现在,我怀疑这是由于包是如何iproute创建network namespaces的,即考虑到包ss是随iproute包一起提供的,关于网络命名空间的假设ip是:“嘿,所有网络 ns 都应该在/var/run/netns目录中找到,因为,为什么不,这也会使生活iproute开发容易,或者其他什么。

事实证明,这是在ss/iproute方面做出的错误假设,或者在现代容器工具和互操作性上缺乏“协议” iproute,但这在某种程度上解释了来自

ip netns list

因此,创建网络命名空间的方式(ip因此它们可以被.ssiproute

networking linux-networking containers network-namespace
  • 3 3 个回答
  • 992 Views

3 个回答

  • Voted
  1. Best Answer
    Panagiotis Moustafellos
    2020-12-02T04:54:31+08:002020-12-02T04:54:31+08:00

    更通用的方法是使用nsenter(1).

    nsenter -t ${PID_FOO} -muni ss -tpi
    

    一种方法是使用类似以下的东西,当需要运行临时的东西时,不一定支持unshare(2)/setns(2)内置。

    docker run -it --rm --security-opt=seccomp:unconfined \
                        --security-opt=apparmor:unconfined \
                        --privileged --pid=host --userns=host \
    debian:jessie@sha256:51cd80bb935b76fbbf49640750736abc63ab7084d5331e198326b20063e7f13c \
    nsenter -t ${PID_FOO} -m -u -n -i -F ss -tpi
    
    • 2
  2. milosgajdos
    2020-12-02T04:00:57+08:002020-12-02T04:00:57+08:00

    如果您想使用ss以下方法查看特定的容器命名空间:

    1. 找出容器进程的PID ps aux或者ps -ef应该给你答案

    2. 创建以下符号链接

    ln -s /proc/PID/ns/net /var/run/netns/mycontainer
    
    1. 利润
    ss -tpi -N mycontainer
    
    • 1
  3. Morty
    2021-06-04T14:40:32+08:002021-06-04T14:40:32+08:00

    如果您有最新版本的lsns,则可以使用选项-n -o NSFS将命名空间 inode 转换为网络子系统使用的 ID。

    例如,假设您有 net NS 4026536974。您可以运行:

    sh-4.4# lsns --version
    lsns from util-linux 2.32.1
    sh-4.4# lsns -n -o NSFS 4026536974 | sort -u                                                                                                                                                                                                 
    /run/netns/d0912eba-0fae-425c-94ba-cf270aa23c93
    sh-4.4# basename /run/netns/d0912eba-0fae-425c-94ba-cf270aa23c93                                                                                                                                                                             
    d0912eba-0fae-425c-94ba-cf270aa23c93
    sh-4.4# ss -nltp -N d0912eba-0fae-425c-94ba-cf270aa23c93 | head -2                                                                                                                                                                           
    State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port                                                                                    
    LISTEN    0         128                0.0.0.0:5000             0.0.0.0:*        users:(("nginx",pid=874035,fd=5),("nginx",pid=874028,fd=5))                    
    sh-4.4# 
    

    或多合一:

    sh-4.4# lsns -n -o NSFS 4026536974 | sort -u | xargs -rn1 basename | xargs -rn1 ss -nltp -N | head -2                                                                                                                                        
    State     Recv-Q    Send-Q       Local Address:Port        Peer Address:Port                                                                                    
    LISTEN    0         128                0.0.0.0:5000             0.0.0.0:*        users:(("nginx",pid=874035,fd=5),("nginx",pid=874028,fd=5))                    
    sh-4.4# 
    
    • 0

相关问题

  • 谁能指出我的 802.11n 范围扩展器?

  • 我怎样才能得到一个网站的IP地址?

  • 在一个 LAN 中使用两台 DHCP 服务器

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve