在 netns 中 ping 需要 sudo (Fedora)

Fre*_*itz 3 fedora namespace network-namespaces

使用 fedora 32,我在网络命名空间内启动了一个 shell,使用

sudo ip netns add net0
sudo ip netns exec net0 sudo -u fred /usr/bin/bash
Run Code Online (Sandbox Code Playgroud)

我配置了网络链接和防火墙以启用 ping。当我尝试以非 root 身份 ping 时,我得到:

$ ping 8.8.8.8                       
ping: socket: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用 sudo ping,它会起作用。为什么?

Fre*_*itz 5

请参阅相关问题ping 在没有 setuid 和功能的情况下如何在 Fedora 上工作?

和链接

https://lwn.net/Articles/422330/

https://fedoraproject.org/wiki/Changes/EnableSysctlPingGroupRange

出于安全原因,Fedora 不再使用 setuid/capabilities 以允许非 root 用户使用 ping。相反,他们使用最近的内核功能,允许管理员通过 gid 启用 ping 使用。

在普通外壳中:

$ sudo sysctl net.ipv4.ping_group_range      
net.ipv4.ping_group_range = 0   2147483647
Run Code Online (Sandbox Code Playgroud)

但是在网络空间内的新外壳中:

$ sudo sysctl net.ipv4.ping_group_range
net.ipv4.ping_group_range = 1   0
Run Code Online (Sandbox Code Playgroud)

因此,当您创建新的 netns 时,默认情况下禁用允许非 root 用户在 fedora 上使用 ping 的机制。要解决此问题,只需在您的 netns 中设置 sysctl 值:

$ sudo sysctl net.ipv4.ping_group_range="0 2147483647"
net.ipv4.ping_group_range = 0 2147483647
$ ping 8.8.8.8
64 bytes from 8.8.8.8: icmp_seq=1 ttl=40 time=20 ms
Run Code Online (Sandbox Code Playgroud)