如何为每个用户分配一个IP?


11

我正在构建一个无头Steam游戏服务器,该服务器利用Steam内部流媒体功能让两个人同时玩。设置的多座部分已经完成并且可以正常工作,但是要使其无线工作非常麻烦。

一次只有一个Steam客户端可以启用家庭流媒体。这很可能是由于使用了相同的端口和IP地址。如何为每个用户分配自己的IP地址?

流只会在家庭网络内完成。机器本身在单个接口上已经具有3个IP。

Answers:


21

您可以使用linux网络名称空间为进程分配不同的网络配置。从理论上讲,应该可以配置PAM *来将每个用户设置在其自己的独立网络名称空间中,但是在该应用程序中以其自己的名称空间启动该应用程序可能更简单。

常见的设置可能描述创建Linux桥接口以将名称空间连接到网络。可以使用ipvlan(包含在3.19版及更高版本的内核中)或macvlan设备(对于无线,您不能使用macvlan)来存档更简单的设置。Linux内核文档提供在网络名称空间中设置ipvlan 的详细示例

遵循文档中的示例:

  1. 创建一个网络名称空间ns0

    ip netns add ns0
    
  2. 在eth0(主设备)上创建ipvlan从设备

    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"
Sim

1
我已经用内核版本更新了答案,Ubuntu 14.04似乎没有包含足够多的内核版本。我想不出一种解决方法,允许您在使用无线网络时配置单独的IP地址。如果使用以太网,则可以在命令3 中将ipvlan替换为macvlan,然后按照其余示例进行操作。
sebasth

你是说在命令2中?变量$IPADDR$ROUTER必须由我提供,还是已经设置?
Sim

1
确实命令2。您必须提供自己的网络配置。
sebasth

2
@Sim好收成,不是。更正了答案,像示例中的其他部分一样,需要在exec关键字之后指定名称空间。
sebasth
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.