
У меня есть PHP-скрипт, скажем file.php, который содержит:
<?php
exec("ip netns exec vpn file2.php");
?>
Если я запускаю file.php через командную строку, как root, он работает. Однако, когда я запускаю его через apache, у www-data нет прав на использование ip netns exec, однако, www-data может использовать ip netns list.
Как мне а) разрешить запуск ip netns exec пользователям, не являющимся root, или предоставить www-data разрешения на запуск ip net exec?
решение1
Попробуйте что-нибудь вроде
# ip netns exec vpn sudo -u www-data apache
как root.
Таким образом, apache будет работать с netns как не-root пользователь. Если вам нужны оба пространства имен одновременно, запустите два экземпляра, каждый в одном пространстве имен. Изменение пространства имен на лету, похоже, не работает.
Объяснение:
Каталог /var/run/netns
хранит все сетевые пространства имен, когда мы добавляем новое "abc", в этом каталоге создается пустой файл "abc". Каждый раз, когда мы выполняем программу "xyz" в пространстве имен "abc", ip(1)
открывается и хранится дескриптор файла для /var/run/netns/abc
, затем вызывается unshare(2)
и setns(2)
.
Итак, вот два барьера. Один из них — это разрешения файловой системы /var/run/netns/*
, другой — возможности привилегированных системных вызовов.