Eu sei que você pode fazer isso usando namespaces de rede, porque é assim que eu fiz isso. Mas é bem complicado.
O processo seria este.
- Crie um namespace de rede usando
unshare
- Crie um dispositivo veth usando
ip link add type veth ....
- Mova uma extremidade do veth para este dispositivo usando
ip link set vethX netns ${PIDOFUNSHARE}
- Abra o loopback (se já não estiver) no novo namespace.
- Abra um endereço IP (se já não estiver) no novo namespace e no
vethX
device. - Defina uma rota padrão no novo namespace de rede para um IP no namespace pai.
- Defina uma rota estática para o ip que você adicionou no namespace filho para descer o
vethX
no namespace pai.
Agora, o usuário não confiável, é claro, tem total propriedade desse IP, mas você pode usar IPtables no namespace pai para fazer o DNATing na porta específica à qual ele tem permissão de vincular e restringir a comunicação apenas a essa porta. É impossível para o usuário negar efetivamente o serviço em outra porta para outro usuário, pois ele tem um IP específico que funciona somente dentro desse namespace de usuários.
Observe que as coisas são mais complicadas se você usar nslcd
ou nscd
para o serviço de resolução de nomes, pois o soquete unix usado para a comunicação entre processos é inválido no namespace filho. A única maneira que eu fui capaz de consertar isso foi para corrigir esses programas para fornecer um transporte TCP e fazer serviços de resolução de nomes no namespace pai sobre TCP.
Eu também escrevi um programa em C que usa chamadas de netlink para definir todas as opções acima. O programa é de código fechado, então infelizmente não posso compartilhá-lo com você.
Para o registro, fazer isso no Fedora é um pouco mais fácil, porque você pode criar namespaces de rede nomeados nele. Mas o EL6 não fornece a funcionalidade /proc/<pid>/ns
para fazer isso.