Você pode atribuir uma configuração de rede diferente a um processo usando namespaces da rede linux . Em teoria, deve ser possível configurar PAM * para definir cada usuário em seu próprio namespace de rede separado, mas é provável que seja mais simples iniciar o aplicativo em questão em seu próprio namespace.
Uma configuração comum pode descrever a criação de uma interface de ponte do Linux para conectar os namespaces à rede. Uma configuração mais simples pode ser arquivada usando ipvlan (incluído nas versões do kernel 3.19 e acima) ou macvlan dispositivo (para wireless você não pode usar macvlan ). A documentação do kernel Linux tem um exemplo detalhado para configurar ipvlan na rede namespace.
Seguindo o exemplo na documentação:
-
Crie um namespace de rede ns0
ip netns add ns0
-
Crie escravo ipvlan em eth0 (dispositivo mestre)
ip link add link eth0 ipvl0 type ipvlan mode l2
-
Atribua escravos ao namespace da rede ns0
ip link set dev ipvl0 netns ns0
-
Configure o dispositivo escravo no namespace da rede ns0
ip netns exec ns0 ip link set dev ipvl0 up ip netns exec ns0 ip link set dev lo up ip netns exec ns0 ip -4 addr add 127.0.0.1 dev lo ip netns exec ns0 ip -4 addr add $IPADDR dev ipvl0 ip netns exec ns0 ip -4 route add default via $ROUTER dev ipvl0
Forneça endereços de host e roteador em
$IPADDR
e$ROUTER
. -
Execute seu aplicativo no namespace da rede usando
ip exec
ip netns exec ns0 <command>
Para executar o comando como usuário diferente, use o usual
su <user> -c -- <command>
.
* EDIT: Da teoria à prática: Eu escrevi um módulo PAM simples para demonstrar como alterar o namespace da rede por usuário. Você precisa configurar um nome de rede com ip netns
, como acima, e mapear usuários específicos para namespaces específicos. Depois, todos os processos do usuário estarão em seu namespace configurado, em vez do padrão. O código está hospedado no github . Use a seu próprio risco.