根据用户请求安全地执行 TCP 跟踪路由

根据用户请求安全地执行 TCP 跟踪路由

我需要使用 Linux traceroute 或其他包执行 TCP traceroute,但我正在努力寻找一种不需要 sudo 权限就可以从 PHP 发出请求的方法。

因为该 URL 来自用户请求,所以我不想使用 sudo。

以下是一个例子:

 $url = 'ebay.com';
 $exec = 'sudo traceroute -w 1 -q 1 -T ' . $url;
 $escaped_command = escapeshellcmd($exec);
 $result = shell_exec($escaped_command);

 echo $result;
 var_dump($result);

此代码有效,但只有带sudo或不带 时才有效-T。没有sudo,它会返回一个空字符串。没有-Ttraceroute 则无法通过防火墙。

如果有帮助的话,我在使用 Centos 7 操作系统。

注意:我不能使用 UDP 代替 TCP,因为它经常被目标防火墙阻止。

答案1

您无法从 PHP 运行 sudo,因为出于安全原因,Apache 不允许您这样做。您需要在代码中用 PHP 实现 traceroute。

公共领域中可以找到几种这样的实现。

例如:

使用 PHP 创建跟踪路由程序,代码可用在 github 上


另一种避免使用 sudo 进行 traceroute 的方法是基于 traceroute 不需要以 root 身份运行的事实;它只需要能力CAP_NET_ADMIN。要将其设置为所有用户的文件能力,如果您的内核支持文件能力并且没有 Linux 安全模块(SELinux、AppArmor)阻止它:

setcap CAP_NET_ADMIN+ep /usr/sbin/traceroute

(海报表明它与之兼容sudo setcap cap_net_raw+ep /usr/bin/traceroute。)

PHP 代码可以非常简单地使用popen()

$handle = popen("traceroute www.xxx.com 2>&1", "r");
while(!feof($handle)) {
    $buffer = fgets($handle);
    $buffer = "<p>".$buffer."</p>\n";
    echo $buffer;
}
pclose($handle);

相关内容