Você deve considerar a possibilidade de usar opções de virtualização que exigem menos recursos. O que eu tenho em mente para o seu problema é o "namespace da rede", para o qual você encontra uma introdução simples, mas suficiente aqui .
Com este esquema de virtualização minimalista, você dota cada shell com exatamente uma NIC (virtual!), nem mais nem menos. A sobrecarga é a criação de um novo shell por usuário e você mantém a disponibilidade de todos os seus programas. Você pode então iniciar diferentes instâncias do mesmo programa escutando na mesma porta, de diferentes interfaces.