容器内ping如何以非root执行
场景
容器里的程序执行ping时,出现无权限
原因:
ping程序需要使用SOCK_RAW来构建包,这是需要root权限才能运行的程序
man ping
SECURITY
ping requires CAP_NET_RAW capability to be executed 1) if the program is used for non-echo queries (See -N option), or 2) if kernel does not support non-raw ICMP
sockets, or 3) if the user is not allowed to create an ICMP echo socket. The program may be used as set-uid root
解决方法:
三种解决方案:setuid(不推荐)、capabilities、ping_group_range
-
1、ping_group_range
ping_group_range 的取值范围是 linux 用户组 ID 的范围。
sysctl net.ipv4.ping_group_range 查看值默认应该是 1 0,代表禁用。
只允许 Group ID 为 1000 的执行 ping:sudo sysctl -w net.ipv4.ping_group_range=‘1000 1000’
net.ipv4.ping_group_range 是 Linux 系统内核中的一个参数,它可以用来配置ping命令所使用的组 ID 范围。该参数的默认值为 {0, 65535},即组 ID 的最小值为 0,最大值为 65535。
-
2、capabilities
which ping 查看 ping 的路径,可能是 /usr/bin/ping 或者 /bin/ping。
设置 ping 有 cap_net_raw 权限:sudo setcap cap_net_raw+ep /usr/bin/ping
查看权限:getcap /usr/bin/ping
-
3、setuid
使用 setuid 存在着安全隐患,它直接把 root 用户的全部权限给了使用者,但我们运行 ping 其实只需要 cap_net_raw 权限。
CAP_NET_RAW与ping_group_range
-
CAP_NET_RAW是一种允许使用原始套接字和数据包套接字并绑定到任何地址以进行透明代理的功能。
-
ping_group_range定义允许打开 ICMP 回显套接字的sysctl 组范围。
-
关系:这两者都可用于允许ping发送和接收 ICMP 回显数据包,但它们不是彼此的超集或子集。
linux手册
-
linux capabilities:https://man7.org/linux/man-pages/man7/capabilities.7.html
-
ping_group_range:https://www.man7.org/linux/man-pages/man7/icmp.7.html