¿Cómo se puede asignar una IP por usuario?


11

Estoy construyendo un servidor de juegos Steam sin cabeza que utiliza la transmisión en casa de Steam para permitir que dos personas jueguen al mismo tiempo. La parte de configuración múltiple de la configuración está lista y es funcional, pero hacer que funcione de forma inalámbrica es bastante problemático.

Solo un cliente de Steam puede habilitar la transmisión en el hogar a la vez. Esto probablemente se deba al uso de los mismos puertos y dirección IP. ¿Cómo puedo asignar a cada usuario su propia dirección IP?

La transmisión solo se realizará desde la red doméstica. La máquina en sí ya tiene 3 IP en una sola interfaz.

Respuestas:


21

Puede asignar diferentes configuraciones de red a un proceso utilizando espacios de nombres de red de Linux . En teoría, debería ser posible configurar PAM * para configurar a cada usuario en su propio espacio de nombre de red separado, pero es más fácil iniciar la aplicación en cuestión en su propio espacio de nombre.

Una configuración común podría describir la creación de una interfaz de puente de Linux para conectar los espacios de nombres a la red. Se puede archivar una configuración un poco más simple usando ipvlan (incluido en las versiones de kernel 3.19 y superiores) o un dispositivo macvlan (para conexión inalámbrica no puede usar macvlan ). La documentación del kernel de Linux tiene un ejemplo detallado para configurar ipvlan en el espacio de nombres de red.

Siguiendo el ejemplo en la documentación:

  1. Crear un espacio de nombres de red ns0

    ip netns add ns0
    
  2. Crear esclavo ipvlan en eth0 (dispositivo maestro)

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
  3. Asignar esclavos al espacio de nombres de red ns0

    ip link set dev ipvl0 netns ns0
    
  4. Configure el dispositivo esclavo en el espacio de nombres de red 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
    

    Proporcione las direcciones de host y enrutador en $IPADDRy $ROUTER.

  5. Ejecute su aplicación en el espacio de nombres de red usando ip exec

    ip netns exec ns0 <command>
    

    Para ejecutar el comando como un usuario diferente, use el habitual su <user> -c -- <command>.


* EDITAR: de la teoría a la práctica: he escrito un módulo PAM simple para demostrar cómo cambiar el espacio de nombres de la red por usuario. Debe configurar un espacio de nombres de red con el ip netnsmismo nombre anterior y asignar usuarios específicos a espacios de nombres específicos. Luego, todos los procesos de los usuarios estarán en su espacio de nombres configurado en lugar del predeterminado. El código está alojado en github . Úselo bajo su propio riesgo.


el segundo comando no funciona para mí en ubuntu 14.04sólo consigo: Garbage instead of arguments "mode ...". Try "ip link help".
Sim

1
He actualizado la respuesta con la versión del kernel, Ubuntu 14.04 no parece incluir una versión del kernel suficientemente reciente. No puedo pensar en una solución alternativa que le permita configurar direcciones IP separadas cuando esté utilizando la conexión inalámbrica. Si está utilizando Ethernet, puede reemplazar ipvlan con macvlan en el comando 3 y seguir el resto del ejemplo.
sebasth

quieres decir en el comando 2? ¿Las variables $IPADDRy $ROUTERtengo que ser proporcionadas por mí o ya están establecidas?
Sim

1
De hecho comando 2 . Debe proporcionar su propia configuración de red.
sebasth

2
@Sim buena captura, no lo hizo. Se corrigió la respuesta, el espacio de nombres debe especificarse después de la palabra clave exec como en otras partes del ejemplo.
sebasth
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.