在不同的命名空间中运行 ssh 守护进程以连接客户端

在不同的命名空间中运行 ssh 守护进程以连接客户端

如果sshd在适当的物理设备的(非 init)命名空间中运行:

ip netns exec physical sshd

是否可以让连接到该接口的客户端获得具有不同默认命名空间(在我的例子中为 init 命名空间)的 shell?

事实上,客户端命令就像运行一样ip netns exec physical <cmd>- 这当然是有道理的,但在这种情况下不是我想要的。

答案1

啊,我找到了一个解决方案:netns将其已知的命名空间存储在/var/run/netns/;这些只不过man namespaces/proc/<PID>/ns/.

因此,我们可以在那里添加 init 命名空间,即使它通常不存在:

ln -s /proc/1/ns/net /var/run/netns/init

然后,我们可以强制客户端在连接时在该命名空间中打开 shell,并可以选择sshd

-o ForceCommand='sudo ip netns exec init sudo /bin/bash --login'

因此,守护进程仍然在指定的非 init 命名空间中运行,但客户端连接并立即进入 init (PID 1) 网络命名空间。


注意:我们还可以保留连接用户而不是跳转到 root(!),并用于getent passwd检索他们常用的登录 shell:

# instead of sudo /bin/bash
# *important*: we give ForceCommand='' in *single* quotes
#     so `whomai` et al. are not evaluated until the ForceCommand is invoked.
sudo --user="$(whoami)" "$(getent passwd "$(whoami)" | cut -d: -f7)"

ssh user@host cmd并通过从$SSH_ORIGINAL_COMMAND命令的前面拉出它来保留客户端 ( ) 提供的任何命令。

相关内容