我有一个 php 脚本,比如 file.php,其中包含:
<?php
exec("ip netns exec vpn file2.php");
?>
如果我以 root 身份通过命令行运行 file.php,它可以正常工作。但是,当我通过 apache 运行它时,www-data 没有使用 ip netns exec 的权限,但是 www-data 可以使用 ip netns list。
我该如何 a) 让非 root 用户运行 ip netns exec,或者授予 www-data 运行 ip net exec 的权限?
答案1
尝试类似
# ip netns exec vpn sudo -u www-data apache
以 root 身份运行。
这样,apache 将以非 root 用户身份使用 netns 运行。如果您同时需要两个命名空间,请启动两个实例,每个实例位于一个命名空间中。动态更改命名空间似乎不起作用。
解释:
目录/var/run/netns
存储了所有的网络命名空间,当我们添加一个新的“abc”时,这个目录中会创建空文件“abc”。每次我们在命名空间“abc”中执行程序“xyz”时,ip(1)
都会打开并保存一个文件描述符/var/run/netns/abc
,然后调用unshare(2)
和setns(2)
。
所以这里就出现了两个障碍。一个是文件系统权限/var/run/netns/*
,另一个是特权系统调用的能力。