Eu preciso ser capaz de restringir um aplicativo de usuário para sempre executar em um namespace de rede específico. Supondo que eu tenha configurado minha configuração de rede como tal:
ip tuntap add name tap0 mode tap
ip link add veth0 type veth peer name veth1
ip netns add appns
ip link set dev tap0 netns appns
ip link set dev veth0 netns appns
ip netns exec appns ip addr add 10.0.0.254/24 dev tap0
ip netns exec appns ip link set dev tap0 up
ip netns exec appns ip addr add 10.20.30.1/24 dev veth0
ip netns exec appns iptables -t nat -A POSTROUTING -o veth0 -j SNAT --to 10.20.30.1
ip link add name br1 type bridge
# eth1 previously exists, maps to physical interface
ip link set dev eth1 master br1
ip link set dev veth1 master br1
ip link set dev eth1 up
ip link set dev br1 up
Com esta configuração, eu gostaria que qualquer usuário não-sudo¹ pudesse executar myapp
de modo que myapp
estivesse sendo executado dentro do namespace appns
, como se o usuário tivesse executado
> sudo ip netns exec appns sudo -u ${USER} myapp
myapp
lerá / gravará da interface tap0
em 10.0.0.x
, comunicando-se com algo em 10.20.30.x
.
Não consigo criar um wrapper de shell com setuid
set (por esta resposta para permitir que o setuid seja ativado scripts de shell). Como eu iria sempre ter myapp
sempre executado no namespace de rede appns
? Eu poderia tornar o nome do namespace configurável através de algum arquivo .conf?
¹ Esses usuários podem fazer parte de um grupo que é necessário para executar o aplicativo (por exemplo, semelhante a estar no grupo wireshark
para executar o Wireshark).
Tags network-namespaces