Как вы можете назначить один IP на пользователя?


11

Я создаю безголовый игровой сервер Steam, который использует потоковую передачу Steam в домашних условиях, чтобы два человека могли играть одновременно. Многоуровневая часть установки выполнена и функционирует, но заставить ее работать по беспроводной сети довольно хлопотно.

Только один клиент Steam может одновременно включать потоковую передачу в домашних условиях. Скорее всего, это связано с использованием тех же портов и IP-адреса. Как я могу назначить каждому пользователю свой IP-адрес?

Потоковая передача будет осуществляться только из домашней сети. Сама машина уже имеет 3 IP на одном интерфейсе.

Ответы:


21

Вы можете назначить различные конфигурации сети процессу, используя сетевые пространства имен linux . Теоретически должна быть возможность настроить PAM * для установки каждого пользователя в отдельном сетевом пространстве имен, но, скорее всего, проще запустить рассматриваемое приложение в его собственном пространстве имен.

Обычная настройка может описывать создание интерфейса моста Linux для подключения пространств имен к сети. Немного более простую настройку можно заархивировать с помощью ipvlan (входит в версию ядра 3.19 и выше) или устройства macvlan (для беспроводной связи вы не можете использовать macvlan ). В документации ядра Linux есть подробный пример настройки ipvlan в пространстве имен сети.

Следуя примеру в документации:

  1. Создайте пространство имен сети ns0

    ip netns add ns0
    
  2. Создать ipvlan slave на eth0 (ведущее устройство)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Назначить подчиненных в пространство имен сети ns0

    ip link set dev ipvl0 netns ns0
    
  4. Настройте подчиненное устройство в пространстве имен сети 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
    

    Укажите адреса хоста и маршрутизатора в $IPADDRи $ROUTER.

  5. Запустите ваше приложение в сетевом пространстве имен, используя ip exec

    ip netns exec ns0 <command>
    

    Чтобы запустить команду от имени другого пользователя, используйте обычный su <user> -c -- <command>.


* РЕДАКТИРОВАТЬ: От теории к практике: я написал простой модуль PAM, чтобы продемонстрировать, как изменить пространство имен сети для каждого пользователя. Вам необходимо настроить ip netnsпространство имен сети, как указано выше, и сопоставить конкретных пользователей с конкретными пространствами имен. После этого все пользовательские процессы будут находиться в своем настроенном пространстве имен, а не в пространстве по умолчанию. Код размещен на github . Используйте на свой страх и риск.


ваша вторая команда не работает для меня на ubuntu 14.04я только получаю: Garbage instead of arguments "mode ...". Try "ip link help".
Сим

1
Я обновил ответ с помощью версии ядра, Ubuntu 14.04, похоже, не содержит достаточно свежей версии ядра. Я не могу придумать обходного пути, который позволяет вам настраивать отдельные IP-адреса, когда вы используете беспроводную связь. Если вы используете Ethernet, вы можете просто заменить ipvlan на macvlan в команде 3 и следовать остальной части примера.
Себастьян

ты имеешь ввиду в команде 2? Переменные $IPADDRи $ROUTERдолжны быть предоставлены мной или они уже установлены?
Сим

1
Действительно команда 2 . Вы должны предоставить свою собственную конфигурацию сети.
Себастьян

2
@ Сим, хороший улов, это не так. Исправленный ответ, пространство имен необходимо указывать после ключевого слова exec, как и в других частях примера.
Себастьян
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.