sshd
が適切な物理デバイスの(非init)名前空間で実行されている場合:
ip netns exec physical sshd
そのインターフェイスに接続するクライアントに、異なるデフォルトの名前空間(私の場合はinit名前空間)のシェルを取得させることは可能ですか?
現状では、クライアントコマンドはip netns exec physical <cmd>
のように実行されます。これはもちろん理にかなっていますが、この場合は必要ありません。
ああ、私は解決策を見つけました: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
)から提供されたコマンドを保持します。