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

Rea*_*old 12 linux networking users ip

我正在构建一个无头 Steam 游戏服务器,它利用 Steam 家庭流媒体让两个人同时玩。设置的多座部分已经完成并且功能正常,但是让它以无线方式工作是相当麻烦的。

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

流媒体只能从家庭网络内完成。机器本身在一个接口上已经有 3 个 IP。

seb*_*sth 22

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

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

按照文档中的示例:

  1. 创建网络命名空间ns0

    ip netns add ns0
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在 eth0(主设备)上创建 ipvlan slave

    ip link add link eth0 ipvl0 type ipvlan mode l2
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将 slaves 分配给网络命名空间ns0

    ip link set dev ipvl0 netns ns0
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    $IPADDR和 中提供主机和路由器地址$ROUTER

  5. 使用在网络命名空间中运行您的应用程序 ip exec

    ip netns exec ns0 <command>
    
    Run Code Online (Sandbox Code Playgroud)

    要以不同的用户身份运行命令,请使用通常的su <user> -c -- <command>.


*编辑:从理论到实践:我编写了一个简单的 PAM 模块来演示如何更改每个用户的网络命名空间。您需要ip netns像上面一样配置网络命名空间,并将特定用户映射到特定命名空间。之后,所有用户进程都将位于其配置的命名空间中,而不是默认命名空间中。代码托管在 github 上。使用后果自负。

  • @Sim 很好,没有。更正了答案,命名空间需要像示例的其他部分一样在 exec 关键字之后指定。 (2认同)