Docker 内の SSH ポート転送の PID が利用できません

Docker 内の SSH ポート転送の PID が利用できません

マシンが 2 台あります。私のマシンと、SSH Docker コンテナを実行しているマシンです。私のマシンでは、指定されたポートで何らかのサービスが実行されており、SSHD コンテナへのポート転送を行っています。次に、転送 (および SSH 接続自体) を終了しようとしています。

2 番目のマシンに直接ポート転送を行うと (Docker 化されていない通常の SSHD に接続)、転送の PID を見つけてそれを強制終了できます。

ssh -N -R 20030:127.0.0.1:20000 [email protected] -p 22 -v

netstatアプローチ

root@host /home/username # netstat -antlp | grep 20030
tcp 0 0 127.0.0.1:20030 0.0.0.0:* LISTEN 5918/sshd: username
tcp6 0 0 ::1:20030 :::* LISTEN 5918/sshd: username
root@host /home/username # kill -9 5918

lsofアプローチ

root@host /home/username # lsof -n | grep 20030
sshd 6866 username 9u IPv6 1070467 0t0 TCP [::1]:20030 (LISTEN)
sshd 6866 username 10u IPv4 1070468 0t0 TCP 127.0.0.1:20030 (LISTEN)
root@host /home/username # kill -9 6866

SSH オプションで転送のみを要求したため、転送が終了し、SSH 接続も切断されました-N

ただし、Docker コンテナ内で SSHD を使用する場合、状況はそれほど単純ではありません。

コンテナの SSHD がポート 2222 で実行されているとします。ポート転送を行っています。

ssh -N -R 20030:127.0.0.1:20000 [email protected] -p 2222 -v

次にコンテナに入り、前と同じアプローチを試みます。

netstatアプローチ

root@f9702d3087f0:/# netstat -antlp | grep 20030
tcp 0 0 0.0.0.0:20030 0.0.0.0:* LISTEN -
tcp6 0 0 :::20030 :::* LISTEN -

lsofアプローチ

root@f9702d3087f0:/# lsof -n | grep 20030
root@f9702d3087f0:/#

現時点では転送の PID を見つけることができないことに注意してください。Docker コンテナーはホストに直接接続する場合とどう違うのでしょうか。また、SSHD 側で転送を停止するにはどうすればよいでしょうか。クライアント側でこれを行うつもりはありません。

答え1

このオプションを使用してコンテナを実行します。docker run [...] --cap-add=SYS_PTRACE

Docker Compose を使用する場合は、コンテナの定義に以下を追加します。

    cap_add:
        - SYS_PTRACE

それは何をするのでしょうか? Docker ドキュメントより:

SYS_PTRACE ptrace(2)を使用して任意のプロセスをトレースします。

関連情報