为不同的用户提供单独的网络命名空间?

为不同的用户提供单独的网络命名空间?

我在笔记本电脑上运行 Arch Linux。我想要实现的目标:

  • 多用户
  • 当每个用户登录到一个 tty 时(可能是另一个用户登录到另一个 tty——他们都是我),他们都在自己的网络命名空间中
  • 他们可能会启动 VPN 连接,但也可能在没有 VPN 的情况下工作(所以我认为 vopono 不适合我)

注释/限制:

  • 没有显示管理器——所有用户都在 tty 上登录,然后启动 x。但我不介意使用一个,如果这能让这件事变得更容易的话。
  • 我使用 linux-hardened 所以CONFIG_USER_NS_UNPRIVILEGED被禁用,我也不想通过 sysctl 启用它。

我所看到的:我想我想要类似的东西pam_netns或者pam_用户网但 pam_netns 似乎是6年前的一件事,并且pam_usernet也已经4年没有更新了。

或者,有没有办法让 vopono 在登录时简单地为用户设置一个单独的网络命名空间,但不连接到 VPN?如果用户必须在登录时运行脚本来手动执行此操作,那就没问题了。

答案1

(有点担心没有预先存在的软件可以做到这一点——也许这意味着我试图在这里解决错误的问题。我要重新问一个更好的问题,但同时这是我自己开发的解决方案。 )

下面是针对 systemd 和 runit 的解决方案,感谢@Marcus Müller 让我开始接触 systemd 部分。摘要:在调用agetty 之前以root 身份创建网络命名空间,然后调用agetty,后者会调用login,从而切换到个人用户。如果他们帮助其他人,请参阅以下详细信息:

系统

  1. 使用答案这个线程编写一个脚本,例如/usr/local/sbin/ip-netns.sh,根据其调用方式来创建或删除命名空间。

  2. 根据拱门维基页面,创建对所有 tty 执行此操作,或仅对 tty2 执行此操作(例如)。应该说:/etc/systemd/system/[email protected]/override.conf/etc/systemd/system/[email protected]/override.confoverride.conf

    [Service]
    ExecStartPre=/usr/local/sbin/ip-netns.sh create 2
    ExecStart=
    ExecStart=-ip netns exec ns2 /sbin/agetty -o '-p -- \\u' --noclear - $TERM
    ExecStartPost=/usr/local/sbin/ip-netns.sh delete 2
    

笔记:

  1. 第一个(空)ExecStart=ExecStart从./usr/lib/systemd/system/[email protected]
  2. 如果您想对所有名称空间执行此操作,则可以传递给而不是2上面的示例。每次调用时都包含(依次)“tty1”、“tty2”等。但随后您需要将传递的名称转换为.%Iip-netns.sh%I%Iip-netns.sh

运行

这更简单一些,因为您只是直接编辑 shell 脚本/etc/runit/sv/agetty-tty*/run:您可以将整个命名空间处理代码放在那里,或者/usr/local/sbin/ip-netns.sh像上面那样调用该脚本。

相关内容