マシンが 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)を使用して任意のプロセスをトレースします。