別の名前空間でSSHデーモンを実行してクライアントに接続する

別の名前空間でSSHデーモンを実行してクライアントに接続する

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

ip netns exec physical sshd

このインターフェイスに接続されているクライアントが異なるデフォルトのネームスペース(私の場合はinitネームスペース)を持つシェルをインポートできますか?

実際、クライアントコマンドは実行と同じです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

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

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

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


注:ルート(!)に移動するのではなく、接続ユーザーを維持し、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そして、クライアント()によって提供されたコマンドをコマンドの前半で取得して保持します。

関連情報