web-dev-qa-db-ja.com

接続されたクライアントとは異なる名前空間でsshデーモンを実行します

sshdが適切な物理デバイスの(非init)名前空間で実行されている場合:

ip netns exec physical sshd

そのインターフェイスに接続するクライアントに、異なるデフォルトの名前空間(私の場合はinit名前空間)のシェルを取得させることは可能ですか?

現状では、クライアントコマンドはip netns exec physical <cmd>のように実行されます。これはもちろん理にかなっていますが、この場合は必要ありません。

2
OJFord

ああ、私は解決策を見つけました:netnsは既知の名前空間を/var/run/netns/に保存します。これらは、man namespaces内の名前空間ファイル(/proc/<PID>/ns/)に他なりません。

したがって、通常は存在しない場合でも、そこにinit名前空間を追加できます。

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

次に、sshdのオプションを使用して、クライアントが接続するときにその名前空間でシェルを開くように強制できます。

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

したがって、デーモンは指定された非init名前空間で引き続き実行されますが、クライアントは接続してすぐにinit(PID 1)ネットワーク名前空間に入ります。


N.B. root(!)にジャンプする代わりに、接続しているユーザーを維持し、getent passwdを使用して通常のログインシェルを取得することもできます。

# 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)から提供されたコマンドを保持します。

1
OJFord