Wie können Sie eine IP pro Benutzer zuweisen?


11

Ich baue einen kopflosen Steam-Spieleserver, der Steam-In-Home-Streaming verwendet, um zwei Personen gleichzeitig spielen zu lassen. Der Multiseat-Teil des Setups ist erledigt und funktionsfähig, aber es ist ziemlich mühsam, es drahtlos zum Laufen zu bringen.

Es kann jeweils nur ein Steam-Client das In-Home-Streaming aktivieren. Dies ist höchstwahrscheinlich auf die Verwendung derselben Ports und IP-Adresse zurückzuführen. Wie kann ich jedem Benutzer eine eigene IP-Adresse zuweisen?

Das Streaming erfolgt nur innerhalb des Heimnetzwerks. Die Maschine selbst hat bereits 3 IPs auf einer einzigen Schnittstelle.

Antworten:


21

Sie können einem Prozess mithilfe von Linux-Netzwerk-Namespaces unterschiedliche Netzwerkkonfigurationen zuweisen . Theoretisch sollte es möglich sein, PAM * so zu konfigurieren , dass jeder Benutzer in einem eigenen Netzwerk-Namespace festgelegt wird. Es ist jedoch wahrscheinlich einfacher, die betreffende Anwendung stattdessen in einem eigenen Namespace zu starten.

In einem allgemeinen Setup wird möglicherweise das Erstellen einer Linux-Bridge-Schnittstelle zum Verbinden der Namespaces mit dem Netzwerk beschrieben. Eine etwas einfachere Einrichtung kann mit ipvlan (in Kernel-Versionen 3.19 und höher enthalten) oder einem Macvlan- Gerät (für drahtlose Verbindungen kann kein Macvlan verwendet werden ) archiviert werden . Die Linux- Kerneldokumentation enthält ein detailliertes Beispiel für die Einrichtung von ipvlan im Netzwerk-Namespace.

Folgen Sie dem Beispiel in der Dokumentation:

  1. Erstellen Sie einen Netzwerk-Namespace ns0

    ip netns add ns0
    
  2. Erstellen Sie einen IPvlan-Slave auf eth0 (Master-Gerät)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Weisen Sie dem Netzwerk-Namespace ns0 Slaves zu

    ip link set dev ipvl0 netns ns0
    
  4. Konfigurieren Sie das Slave-Gerät im Netzwerk-Namespace 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
    

    Geben Sie Host- und Router-Adressen in $IPADDRund an $ROUTER.

  5. Führen Sie Ihre Anwendung im Netzwerk-Namespace mit aus ip exec

    ip netns exec ns0 <command>
    

    Verwenden Sie den üblichen Befehl, um den Befehl als anderer Benutzer auszuführen su <user> -c -- <command>.


* EDIT: Von der Theorie zur Praxis: Ich habe ein einfaches PAM-Modul geschrieben, um zu demonstrieren, wie der Netzwerk-Namespace pro Benutzer geändert wird. Sie müssen einen Netzwerk-Namespace ip netnswie oben konfigurieren und bestimmte Benutzer bestimmten Namespaces zuordnen . Danach befinden sich alle Benutzerprozesse in ihrem konfigurierten Namespace anstelle des Standard-Namespace. Der Code wird auf Github gehostet . Verwenden Sie auf eigene Gefahr.


Ihr zweiter Befehl funktioniert bei mir nicht. ubuntu 14.04Ich bekomme nur : Garbage instead of arguments "mode ...". Try "ip link help".
Sim

1
Ich habe die Antwort mit der Kernel-Version aktualisiert. Ubuntu 14.04 scheint nicht die aktuellste Kernel-Version zu enthalten. Ich kann mir keine Problemumgehung vorstellen, mit der Sie separate IP-Adressen konfigurieren können, wenn Sie WLAN verwenden. Wenn Sie Ethernet verwenden, können Sie einfach ersetzen ipvlan mit macvlan in Befehl 3 und dem Rest des Beispiels folgen.
sebasth

du meinst in befehl 2? Die Variablen $IPADDRund $ROUTERmüssen von mir bereitgestellt werden oder sind diese bereits gesetzt?
Sim

1
In der Tat Befehl 2 . Sie müssen Ihre eigene Netzwerkkonfiguration angeben.
19.

2
@ Sim guter Fang, hat es nicht. Die Antwort wurde korrigiert. Der Namespace muss wie in anderen Teilen des Beispiels nach dem Schlüsselwort exec angegeben werden.
sebasth
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.