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

11

Estou construindo um servidor de jogos Steam decapitado que utiliza o streaming em casa do Steam para permitir que duas pessoas joguem ao mesmo tempo. A parte de vários lugares da configuração está pronta e funcional, mas fazê-lo funcionar sem fio é bastante problemático.

Somente um cliente Steam pode ativar o streaming em casa por vez. Isso provavelmente ocorre 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 será feita apenas a partir da rede doméstica. A própria máquina já possui 3 IPs em uma única interface.

Reanold
fonte

Respostas:

21

Você pode atribuir diferentes configurações de rede a um processo usando namespaces de rede linux . Em teoria, deve ser possível configurar o PAM * para definir cada usuário em seu próprio espaço para nome de rede separado, mas provavelmente é mais simples iniciar o aplicativo em questão em seu próprio espaço para nome.

Uma configuração comum pode descrever a criação de uma interface de ponte do Linux para conectar os namespaces à rede. Uma configuração um pouco mais simples pode ser arquivada usando o ipvlan (incluído nas versões do kernel 3.19 e acima) ou o dispositivo macvlan (para conexão sem fio, você não pode usar o macvlan ). A documentação do kernel do Linux tem um exemplo detalhado para configurar o ipvlan no namespace da rede.

Seguindo o exemplo na documentação:

  1. Criar um namespace de rede ns0

    ip netns add ns0
    
  2. Criar escravo ipvlan no eth0 (dispositivo mestre)

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

    ip link set dev ipvl0 netns ns0
    
  4. Configurar 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 $IPADDRe $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 habitual su <user> -c -- <command>.


* EDIT: Da teoria à prática: escrevi um módulo PAM simples para demonstrar como alterar o namespace da rede por usuário. Você precisa configurar um namespace de rede com o exemplo ip netnsacima e mapear usuários específicos para namespaces específicos. Posteriormente, todos os processos do usuário estarão em seu espaço para nome configurado, em vez do padrão. O código está hospedado no github . Use por sua própria conta e risco.

sebasth
fonte
o segundo comando não funciona para mim no ubuntu 14.04que eu só obter: Garbage instead of arguments "mode ...". Try "ip link help".
Sim
1
Atualizei a resposta com a versão do kernel, o Ubuntu 14.04 parece não incluir a versão suficientemente recente do kernel. Não consigo pensar em uma solução alternativa que permita configurar endereços IP separados quando você estiver usando a conexão sem fio. Se você estiver usando Ethernet, basta substituir ipvlan por macvlan no comando 3 e seguir o restante do exemplo.
sebasth
você quer dizer no comando 2? As variáveis $IPADDRe $ROUTERdevem ser fornecidas por mim ou já estão definidas?
Sim
1
De fato comando 2 . Você precisa fornecer sua própria configuração de rede.
sebasth
2
@ Sim captura boa, não. Corrigida a resposta, o espaço para nome precisa ser especificado após a palavra-chave exec, como em outras partes do exemplo.
sebasth