【博客706】容器内ping如何以非root执行

容器内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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值