Безопасное выполнение трассировки TCP по запросу пользователя
Мне нужно выполнить трассировку TCP с использованием трассировки Linux или другого пакета, но я изо всех сил пытаюсь найти способ сделать запрос из PHP без необходимости использования привилегий sudo.
Поскольку 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
, он возвращает пустую строку. Без -T
traceroute не переживает брандмауэры.
Если это поможет, я на ОС Centos 7.
Примечание: я не могу использовать UDP вместо TCP, потому что он часто блокируется целевым межсетевым экраном.
1 ответ
Вы не можете запустить sudo из PHP, так как Apache не позволит вам сделать это по соображениям безопасности. Вам нужно реализовать traceroute в PHP внутри вашего кода.
Есть несколько таких реализаций, которые можно найти в открытом доступе.
Смотрите, например:
Создание программы traceroute на PHP, код доступен на github.
Другой подход, позволяющий избежать sudo для traceroute, основан на том факте, что traceroute не должен запускаться с правами root; это просто нуждается в способности CAP_NET_ADMIN
, Чтобы установить это как файловую возможность для всех пользователей, если ваше ядро поддерживает файловые возможности, а модуль безопасности Linux (SELinux, AppArmor) не блокирует его:
setcap CAP_NET_ADMIN+ep /usr/sbin/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);