据我所知,ping
需要创建一个原始套接字(需要 root 访问权限或cap_net_raw
功能)。
据我了解,近年来的趋势是删除设定值二进制文件并将其替换为能力。
然而,当我查看ping
Fedora 32 上的二进制文件时,它看起来没有任何内容:
$ ls -la $(which ping)
-rwxr-xr-x. 1 root root 82960 May 18 10:26 /usr/bin/ping
$ sudo getcap -v $(which ping)
/usr/bin/ping
$
ping 是否需要在 Fedora 上打开原始套接字?或者有另一种方法可以授予它打开原始套接字的权限吗?
答案1
我认为https://fedoraproject.org/wiki/Changes/EnableSysctlPingGroupRange回答你的问题:
启用Linux内核的net.ipv4.ping_group_range参数以覆盖所有组。这将允许操作系统上的所有用户创建 ICMP Echo 套接字,而无需使用 setuid 二进制文件或具有 CAP_NET_ADMIN 和 CAP_NET_RAW 文件功能。
交叉参考细节
这系统文件写道,
ping_group_range- 2 个整数
将数据报套接字限制
ICMP_PROTO
为组范围内的用户。默认值为“1 0
”,这意味着没有人(甚至 root 也不能)创建 ping 套接字。将其设置为“100 100
”将向单个组授予权限。 “0 4294967295
”将为世界启用它,“100 4294967295
”将为用户启用它,但不为守护进程启用它。
一个年纪较大的代码示例演示了此功能的使用,特别是显示了使用标志创建套接字以IPPROTO_ICMP
标识它将用于原始 ICMP
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_ICMP)
答案2
从软呢帽 31内核参数net.ipv4.ping_group_range
已设置为覆盖所有组。
这将允许操作系统上的所有用户创建ICMP Echo
套接字,而无需使用setuid
二进制文件或具有CAP_NET_ADMIN
文件CAP_NET_RAW
功能。
sysctl net.ipv4.ping_group_range
net.ipv4.ping_group_range = 0 2147483647