socket_create():无法创建套接字[1]:不允许操作

时间:2019-08-13 02:24:17

标签: php laravel centos7

我尝试使用socket_create ICMP来ping Ip读取的数据,在Windows10中可以,但是CentOS7不起作用,错误消息是“ socket_create():无法创建套接字[1]:不允许操作”,并且我还检查CentOS7中的phpinfo()enable sockets,这是关于root权限的问题吗?如何解决它...

我尝试使用chmod -R 4777 / var / www / html / MyWeb,但仍无法正常工作

/* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $icmp = getprotobyname("icmp");

    $socket = socket_create(AF_INET, SOCK_RAW, $icmp);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout,  'usec'  =>  0));
    if (@socket_set_option($socket, SOL_SOCKET, SO_BINDTODEVICE, $iface) === false) return false;
    socket_connect($socket,  $host,  100);

    $ts = microtime(true);
    socket_send($socket,  $package,  strLen($package),  0);


    if (@socket_read($socket, 255)) {
        $result = $host;
    } else {
        $result = false;
    }
    socket_close($socket);

错误消息是:

socket_create(): Unable to create socket [1]: Operation not permitted

1 个答案:

答案 0 :(得分:0)

在Linux系统上不起作用的原因是SOCK_RAW需要在Linux上具有root用户访问权限。可以在Linux手册页https://linux.die.net/man/7/raw

中找到技术原因。
  

仅允许有效用户ID为0或CAP_NET_RAW功能的进程打开原始套接字。

我不建议您以root特权运行您的Web服务器。

如果您只是想对其他服务器执行ping操作,则可以改用shell_exec()

https://www.php.net/shell_exec

例如:

$ip = '8.8.8.8';
echo shell_exec("ping $ip -c 1");

这将返回:

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=10.7 ms --- 8.8.8.8 ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 10.775/10.775/10.775/0.000 ms

使用-c 1将ping限制为一次尝试,否则ping命令将很乐意不断为您重新检查。

您需要对返回的字符串进行一些解析,以提取出您实际上要获取的任何信息。

如果您不拥有运行脚本的服务器(例如共享主机),则出于安全原因,可能会禁用exec()shell_exec()命令。

重要:请勿将来自浏览器的原始参数直接传递到shell_exec()中,否则您会遇到麻烦。

或者,如果您只是检查一个网站是否可用,则可以使用cURL。此帖子主题提供了建议的方法。

curl and ping - how to check whether a website is either up or down?


根据评论进行更新:

以root身份运行Web服务器通常是一个非常糟糕的主意,如果攻击者破坏了Web服务器应用程序,他们就可以访问整个服务器。话虽这么说,但如果它位于无法从Internet访问的专用网络上,那么可能就可以了。

在此主题中对Ubuntu选项进行了一些讨论:

Apache as root on ubuntu

我在CentOS上没有太多经验,但是我认为该原理可以发挥同样的作用。但是,我不知道SELinux是否会阻止这些尝试。

我认为我们已经超出了该问题的原始范围,建议您在Server Fault姐妹网站上提出一个新问题。