
Tengo un script php, digamos file.php que contiene:
<?php
exec("ip netns exec vpn file2.php");
?>
Si ejecuto file.php a través de la línea de comando, como root, funciona. Sin embargo, cuando lo ejecuto a través de Apache, www-data no tiene permisos para usar ip netns exec; sin embargo, www-data puede usar ip netns list.
¿Cómo puedo a) permitir que ip netns exec sea ejecutado por usuarios no root o darle a www-data los permisos para ejecutar ip net exec?
Respuesta1
Prueba algo como
# ip netns exec vpn sudo -u www-data apache
como raíz.
De esta manera, Apache se ejecutará con netns como usuario no root. Si necesita ambos espacios de nombres al mismo tiempo, inicie dos instancias, cada una en un espacio de nombres. Cambiar el espacio de nombres sobre la marcha no parece funcionar.
Explicación:
El directorio /var/run/netns
almacena todos los espacios de nombres de la red; cuando agregamos uno nuevo "abc", se crea el archivo vacío "abc" en este directorio. Cada vez que ejecutamos el programa "xyz" en el espacio de nombres "abc", ip(1)
abre y mantiene un descriptor de archivo para /var/run/netns/abc
, luego llama unshare(2)
y setns(2)
.
Entonces aquí vienen las dos barreras. Uno son los permisos del sistema de archivos /var/run/netns/*
y el otro son las capacidades para llamadas al sistema privilegiadas.