Como você pode atribuir um IP por usuário?

10

Estou construindo um servidor de jogos Steam sem cabeça que utiliza o streaming em casa do Steam para permitir que duas pessoas joguem ao mesmo tempo. A parte multiterminal da configuração é feita e funcional, mas fazer com que ela funcione sem fio é bastante problemático.

Apenas um cliente Steam pode ativar o streaming em casa por vez. Isso é mais provável devido ao uso das mesmas portas e endereço IP. Como posso atribuir a cada usuário seu próprio endereço IP?

A transmissão só será feita a partir da rede doméstica. A própria máquina já possui 3 IPs em uma única interface.

    
por Kevin Willemse 09.09.2017 / 14:22

1 resposta

20

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:

  1. Crie um namespace de rede ns0

    ip netns add ns0
    
  2. Crie escravo ipvlan em eth0 (dispositivo mestre)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Atribua escravos ao namespace da rede ns0

    ip link set dev ipvl0 netns ns0
    
  4. 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 .

  5. 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.

    
por 09.09.2017 / 14:37