Jak przypisać jeden adres IP na użytkownika?

11

Buduję bezgłowy serwer gier Steam, który wykorzystuje domowe strumieniowanie Steam, aby pozwolić dwóm osobom grać jednocześnie. Wielostanowiskowa część konfiguracji została wykonana i działa, ale uruchomienie jej w sieci bezprzewodowej jest dość kłopotliwe.

Tylko jeden klient Steam może włączyć strumieniowanie w domu na raz. Jest to najprawdopodobniej spowodowane użyciem tych samych portów i adresu IP. Jak mogę przypisać każdemu użytkownikowi swój własny adres IP?

Streaming będzie odbywał się tylko z sieci domowej. Sama maszyna ma już 3 adresy IP na jednym interfejsie.

Reanold
źródło

Odpowiedzi:

21

Możesz przypisać procesowi inną konfigurację sieci, używając przestrzeni nazw sieci Linux . Teoretycznie powinna istnieć możliwość skonfigurowania PAM * w celu ustawienia każdego użytkownika we własnej osobnej sieciowej przestrzeni nazw, ale prawdopodobnie łatwiej jest uruchomić aplikację, o której mowa, w jej własnej przestrzeni nazw.

Typowa konfiguracja może opisywać tworzenie interfejsu mostu Linux, aby połączyć przestrzenie nazw z siecią. Nieco prostszą konfigurację można zarchiwizować za pomocą ipvlan (zawartego w jądrze w wersji 3.19 i wyższej) lub urządzenia macvlan (w przypadku sieci bezprzewodowej nie można używać macvlan ). Dokumentacja jądra Linux zawiera szczegółowy przykład konfiguracji ipvlan w sieciowej przestrzeni nazw.

Postępując zgodnie z przykładem w dokumentacji:

  1. Utwórz sieciową przestrzeń nazw ns0

    ip netns add ns0
    
  2. Utwórz ipvlan slave na eth0 (urządzenie master)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Przypisz urządzenia podrzędne do sieciowej przestrzeni nazw ns0

    ip link set dev ipvl0 netns ns0
    
  4. Skonfiguruj urządzenie podrzędne w sieciowej przestrzeni nazw 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
    

    Podaj adres hosta i routera w $IPADDRi $ROUTER.

  5. Uruchom aplikację w sieciowej przestrzeni nazw, używając ip exec

    ip netns exec ns0 <command>
    

    Aby uruchomić polecenie jako inny użytkownik, użyj zwykłego su <user> -c -- <command>.


* EDYCJA: Od teorii do praktyki: Napisałem prosty moduł PAM, aby zademonstrować, jak zmienić przestrzeń nazw sieci na użytkownika. Musisz skonfigurować nazewnictwo sieciowe w sposób ip netnspodobny do powyższego i odwzorować konkretnych użytkowników na określone przestrzenie nazw. Następnie wszystkie procesy użytkownika będą w skonfigurowanej przestrzeni nazw zamiast domyślnej. Kod jest hostowany na github . Używaj na własne ryzyko.

sebasth
źródło
Twoja druga komenda nie działa dla mnie na ubuntu 14.04I tylko dostać: Garbage instead of arguments "mode ...". Try "ip link help".
Sim
1
Zaktualizowałem odpowiedź wersją jądra, Ubuntu 14.04 wydaje się nie zawierać wystarczająco nowej wersji jądra. Nie mogę wymyślić obejścia, które pozwala skonfigurować osobne adresy IP podczas korzystania z sieci bezprzewodowej. Jeśli używasz Ethernet, można po prostu zastąpić ipvlan z macvlan dowódcy 3 i wykonaj pozostałe przykładzie.
sebasth
masz na myśli polecenie 2? Zmienne $IPADDRi $ROUTERmuszę je podać, czy te są już ustawione?
Sim
1
Rzeczywiście polecenie 2 . Musisz podać własną konfigurację sieci.
sebasth
2
@Sim dobry połów, nie udało się. Poprawiono odpowiedź, przestrzeń nazw należy podać po słowie kluczowym exec, tak jak w innych częściach przykładu.
sebasth