Docker 내부의 SSH 포트 전달 PID를 사용할 수 없습니다.

Docker 내부의 SSH 포트 전달 PID를 사용할 수 없습니다.

나는 2 대의 기계를 가지고 있습니다. 내 컴퓨터와 SSH Docker 컨테이너를 실행하는 컴퓨터가 있습니다. 일부 서비스가 내 컴퓨터의 지정된 포트에서 실행되고 있으며 SSHD 컨테이너로 포트 전달을 수행하고 있습니다. 그런 다음 전달(및 SSH 연결 자체)을 종료하려고 합니다.

두 번째 컴퓨터로 직접 포트 전달을 수행할 때(도커화된 SSHD가 아닌 일반 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)를 사용하여 임의 프로세스를 추적합니다.

관련 정보