Docker 内部 SSH 端口转发的 PID 不可用

Docker 内部 SSH 端口转发的 PID 不可用

我有 2 台机器。一台是我的机器,另一台运行 SSH Docker 容器的机器。我的机器上的指定端口上运行着某项服务,我正在将端口转发到 SSHD 容器。然后我尝试终止转发(以及 SSH 连接本身)。

当直接向第二台机器进行端口转发(连接到普通的、非 dockerized 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

-N由于我请求仅使用 SSH选项进行转发,因此转发和 SSH 连接均已终止。

但是在 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) 跟踪任意进程。

相关内容