![为不同的用户提供单独的网络命名空间?](https://linux22.com/image/222238/%E4%B8%BA%E4%B8%8D%E5%90%8C%E7%9A%84%E7%94%A8%E6%88%B7%E6%8F%90%E4%BE%9B%E5%8D%95%E7%8B%AC%E7%9A%84%E7%BD%91%E7%BB%9C%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
我在笔记本电脑上运行 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,从而切换到个人用户。如果他们帮助其他人,请参阅以下详细信息:
系统
使用答案这个线程编写一个脚本,例如
/usr/local/sbin/ip-netns.sh
,根据其调用方式来创建或删除命名空间。根据拱门维基页面,创建对所有 tty 执行此操作,或仅对 tty2 执行此操作(例如)。应该说:
/etc/systemd/system/[email protected]/override.conf
/etc/systemd/system/[email protected]/override.conf
override.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
笔记:
- 第一个(空)
ExecStart=
是ExecStart
从./usr/lib/systemd/system/[email protected]
- 如果您想对所有名称空间执行此操作,则可以传递给而不是
2
上面的示例。每次调用时都包含(依次)“tty1”、“tty2”等。但随后您需要将传递的名称转换为.%I
ip-netns.sh
%I
%I
ip-netns.sh
运行
这更简单一些,因为您只是直接编辑 shell 脚本/etc/runit/sv/agetty-tty*/run
:您可以将整个命名空间处理代码放在那里,或者/usr/local/sbin/ip-netns.sh
像上面那样调用该脚本。