如何在 chroot 环境中使用 ping 命令?
$ ping 8.8.8.8
ping: icmp open socket: Operation not permitted
目前我正在使用 CentOs,但理想情况下必须有一个适用于所有 chrooted 环境的解决方案。
答案1
在 Linux 下,ping
需要以 root 身份运行(因为它需要绑定原始 IP 套接字;普通用户只能使用 UDP 和 TCP)。它被设计为 setuid root。看起来您在 chroot 中的副本不是 setuid root。修复权限:
chown root:root /bin/ping; chmod u+srwx,go=rx /bin/ping
注意,chroot 中可能有其他命令需要 setuid (或 setgid),特别是su
和sudo
。
请注意,这个答案假设了一个 chroot,而不是像 jail 那样具有更多限制的东西。
答案2
正如所指出的,ping
需要绑定原始 IP 套接字的权限。传统上setuid
用于允许普通用户使用它。但是,使用功能(POSIX 1003.1e,capabilities(7)),可以有选择地启用一组最小功能,从而限制潜在漏洞的安全后果。
ping
需要功能CAP_NET_RAW
。假设二进制文件的路径为/usr/bin/ping
,则可以使用以下工具设置功能setcap
:
setcap cap_net_raw+ep /usr/bin/ping
用于getcap
检查结果:
getcap /usr/bin/ping
输出应该是这样的
/usr/bin/ping = cap_net_raw+ep
现在就ping
可以工作了。
答案3
只要这些二进制文件存在于您的路径中,在 chroot 中使用 ping 或 gnu 工具链的任何其他部分都不会有问题。如果无法访问这些命令,也许您应该检查您的环境变量。