Linux下限制普通用户使用ping有四种方法:一是移除/bin/ping的SUID权限(chmod u-s /bin/ping);二是通过PAM模块调用校验脚本拦截;三是启用SELinux策略禁止非特权进程创建rawip_socket;四是重命名ping二进制并用封装脚本+ACL控制访问。

一、修改 ping 命令的 SUID 权限
ping 命令依赖原始套接字发送 ICMP 报文,内核默认仅允许 root 用户执行该操作;普通用户能正常使用 ping 是因 /bin/ping 文件设置了 setuid 位(即权限为 -rwsr-xr-x),运行时自动提升至 root 权限。移除该权限即可限制普通用户调用。
1、以 root 用户身份打开终端。
2、执行命令:chmod u-s /bin/ping。
3、验证权限变更:运行 ls -l /bin/ping,确认输出中不再包含小写 s(应显示为 -rwxr-xr-x)。
4、切换至普通用户账户,执行 ping -c 1 127.0.0.1,将收到 ping: icmp open socket: Operation not permitted 错误提示。
二、通过 PAM 模块限制命令执行
Linux 系统可通过 Pluggable Authentication Modules(PAM)在登录或执行阶段拦截特定命令。在银河麒麟系统中,可配置 pam_exec 或 pam_deny 模块对普通用户调用 ping 进行阻断,不依赖文件权限修改,且具备细粒度控制能力。
1、编辑 PAM 配置文件:sudo pluma /etc/pam.d/common-auth。
2、在文件末尾新增一行:auth [default=bad success=ok] pam_exec.so quiet /usr/local/bin/check_ping_user.sh。
3、创建校验脚本:sudo pluma /usr/local/bin/check_ping_user.sh,内容为:
#!/bin/sh if [ "$PAM_TYPE" = "auth" ] && [ "$PAM_SERVICE" = "ping" ]; then if [ "$PAM_USER" != "root" ]; then exit 1 fi fi exit 0
4、赋予脚本执行权限:sudo chmod +x /usr/local/bin/check_ping_user.sh。
三、使用 SELinux 策略禁止非特权进程发起 ICMP 请求
银河麒麟 V10 SP1 及后续版本部分部署环境启用 SELinux(Enforcing 模式)。可通过自定义策略模块,禁止 unconfined_t 或 user_t 类型域执行 net_admin 功能,从而阻止普通用户进程构造并发送 ICMP 包,该方法作用于内核安全框架层,绕过用户空间权限检查。
1、确认 SELinux 状态:sestatus,确保为 enabled 且 enforcing。
2、生成最小策略模块源码:echo "module deny_ping_user 1.0; require { type unconfined_t; type user_t; class rawip_socket { create write read }; }; deny unconfined_t unconfined_t:rawip_socket { create write read }; deny user_t user_t:rawip_socket { create write read };" > deny_ping.te。
3、编译并加载模块:checkmodule -M -m -o deny_ping.mod deny_ping.te && semodule_package -o deny_ping.pp -m deny_ping.mod && sudo semodule -i deny_ping.pp。
4、重启后,普通用户执行 ping 将触发 SELinux AVC 拒绝日志,并返回 Operation not permitted。
四、重命名或移动 ping 二进制文件并设置访问控制列表
该方法通过文件系统级隔离实现限制,不改变原有权限模型,适用于需保留 ping 功能但仅限授权用户调用的场景。结合 ACL(Access Control List)可实现比传统 Unix 权限更精确的用户/组粒度控制。
1、备份原始 ping:sudo cp /bin/ping /bin/ping.real。
2、重命名原文件:sudo mv /bin/ping /bin/ping.disabled。
3、创建封装脚本:sudo pluma /bin/ping,内容为:
#!/bin/sh if id -u | grep -q "^0$"; then exec /bin/ping.real "$@" else echo "Permission denied: ping is restricted to root only." >&2 exit 1 fi
4、设置脚本权限与 ACL:sudo chmod 755 /bin/ping && sudo setfacl -m u:adminuser:rx /bin/ping.real(其中 adminuser 为授权用户名)。

















