我正在运行一个包含多台虚拟机的 vserver 环境。单台虚拟机存在以下问题:
$ ping 8.8.8.8
ping: icmp open socket: Operation not permitted
$ ls -l $(which ping)
-rwsr-xr-x 1 root root 30736 2007-01-31 00:10 /bin/ping
$ whoami
root
$ mount
/dev/hdv1 on / type ufs (defaults)
none on /proc type proc (0)
none on /tmp type tmpfs (size=16m,mode=1777)
none on /dev/pts type devpts (gid=5,mode=620)
$ uname -a
Linux v-web1 2.6.27.55-vs2.3.0.36.9 #1 SMP Tue Apr 28 11:35:00 CEST 2015 i686 GNU/Linux
请注意,在主机以及所有其他 VM 主机上,Ping 工作正常。
有人有什么想法可以帮助我吗?
答案1
TL;DR 版本:重新安装iputils-ping
我在网上看到有人建议使用
chmod u+s $( which ping );
但是这将允许用户更改预加载和泛洪。这可能导致用户能够拒绝服务您的本地计算机或其他计算机或您的网络。
我试过@nabil-bourenane 建议什么,重新安装iputils-ping
解决了我的问题并且没有设置 SUID 位。
username@server:~$ ls -l $( which ping );
-rwxr-xr-x 1 root root 44104 Nov 8 2014 /bin/ping
如果设置了 SUID 位,它将看起来像
username@server:~$ ls -l $( which ping );
-rwsr-xr-x 1 root root 44104 Nov 8 2014 /bin/ping
答案2
解决方案是设置 Linux 系统功能以允许主机上使用原始套接字。
由于这是一个特定于 v-server 的问题,解决方案是创建一个名为的单行文件/etc/vservers/VMNAME/bcapabilities
:
NET_RAW
并重新启动虚拟机。
答案3
抱歉,我无法评论。我在最小安装上提取工作系统的存档后遇到了这个问题。
以上所有答案都有效。但出于安全考虑,@Nabil Bourenane 和 @Linx 提出的答案更受青睐。为了回答@rexkogitans 的评论,我在此引用 iputils-ping.postinst (/var/lib/dpkg/info/...)
if command -v setcap > /dev/null; then
if setcap cap_net_raw+ep /bin/ping; then
chmod u-s /bin/ping
else
echo "Setcap failed on /bin/ping, falling back to setuid" >&2
chmod u+s /bin/ping
fi
else
echo "Setcap is not installed, falling back to setuid" >&2
chmod u+s /bin/ping
fi
基本上就是说,在配置 iputils-ping 时,首先尝试 setcap,如果失败,则使用 chmod u+s。这就是重新安装 iputils-ping 有效的原因。