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.

Reanold
quelle

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.

sebasth
quelle
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