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

轉送被終止,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 容器與直接連接到主機有何不同?我對在客戶端這樣做不感興趣。

答案1

使用此選項運行容器:docker run [...] --cap-add=SYS_PTRACE

使用 Docker Compose 時,請將其新增至容器的定義:

    cap_add:
        - SYS_PTRACE

它有什麼作用?來自 Docker 文件:

SYS_PTRACE 使用 ptrace(2) 追蹤任意進程。

相關內容