Comment pouvez-vous attribuer une adresse IP par utilisateur?

11

Je construis un serveur de jeux Steam sans tête qui utilise le streaming Steam à domicile pour permettre à deux personnes de jouer en même temps. La partie multisiège de la configuration est terminée et fonctionnelle, mais le faire fonctionner sans fil est assez gênant.

Un seul client Steam peut activer le streaming à domicile à la fois. Cela est probablement dû à l'utilisation des mêmes ports et adresse IP. Comment attribuer à chaque utilisateur sa propre adresse IP?

Le streaming ne se fera qu'à partir du réseau domestique. La machine elle-même possède déjà 3 adresses IP sur une seule interface.

Reanold
la source

Réponses:

21

Vous pouvez affecter une configuration réseau différente à un processus à l'aide d' espaces de noms réseau Linux . En théorie, il devrait être possible de configurer PAM * pour définir chaque utilisateur dans son propre espace de noms de réseau séparé, mais il est probablement plus simple de lancer l'application en question dans son propre espace de noms.

Une configuration courante peut décrire la création d'une interface de pont Linux pour connecter les espaces de noms au réseau. Une configuration un peu plus simple peut être archivée à l'aide d' ipvlan (inclus dans les versions du noyau 3.19 et supérieures) ou d' un périphérique macvlan (pour le sans fil, vous ne pouvez pas utiliser macvlan ). La documentation du noyau Linux contient un exemple détaillé de configuration d' ipvlan dans l'espace de noms réseau.

En suivant l'exemple de la documentation:

  1. Créer un espace de noms réseau ns0

    ip netns add ns0
    
  2. Créer un esclave ipvlan sur eth0 (périphérique maître)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Attribuer des esclaves à l'espace de noms réseau ns0

    ip link set dev ipvl0 netns ns0
    
  4. Configurer le périphérique esclave dans l'espace de noms réseau 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
    

    Fournissez les adresses d'hôte et de routeur dans $IPADDRet $ROUTER.

  5. Exécutez votre application dans l'espace de noms réseau à l'aide de ip exec

    ip netns exec ns0 <command>
    

    Pour exécuter la commande en tant qu'utilisateur différent, utilisez l'habituel su <user> -c -- <command>.


* EDIT: de la théorie à la pratique: j'ai écrit un module PAM simple pour montrer comment changer l'espace de noms du réseau par utilisateur. Vous devez configurer un espace de noms réseau avec ip netnscomme ci-dessus et mapper des utilisateurs spécifiques à des espaces de noms spécifiques. Ensuite, tous les processus utilisateur seront dans leur espace de noms configuré au lieu de celui par défaut. Le code est hébergé sur github . Utilisez à vos risques et périls.

sebasth
la source
votre deuxième commande ne fonctionne pas pour moi , ubuntu 14.04je ne reçois que: Garbage instead of arguments "mode ...". Try "ip link help".
Sim
1
J'ai mis à jour la réponse avec la version du noyau, Ubuntu 14.04 ne semble pas inclure une version du noyau assez récente. Je ne peux pas penser à une solution de contournement qui vous permet de configurer des adresses IP distinctes lorsque vous utilisez le sans fil. Si vous utilisez Ethernet, vous pouvez simplement remplacer ipvlan par macvlan dans la commande 3 et suivre le reste de l'exemple.
sebasth
tu veux dire au commandement 2? Les variables $IPADDRet $ROUTERdoivent être fournis par moi ou sont celles déjà définies?
Sim
1
Effectivement commande 2 . Vous devez fournir votre propre configuration réseau.
sebasth
2
@Sim bonne capture, ce n'est pas le cas. Correction de la réponse, l'espace de noms doit être spécifié après le mot clé exec comme dans les autres parties de l'exemple.
sebasth