S1, S2, S3라는 세 개의 서버가 있습니다. S2는 요새 서버이자 내가 제어하는 유일한 서버이고, S1은 보호되는 네트워크의 서버이고, S3은 공용 인터넷에서 액세스할 수 있는 서버입니다. S1 및 S3의 사용자는 S2에 대한 셸 액세스 권한이 없습니다. S1의 사용자가 S3에 대한 로컬 포트 전달을 수행하도록 허용하고 싶지만 원격 포트 전달은 허용하지 않습니다. 따라서 S1에서는 ssh -J user@S2 -L <lport>:S3:<rport> user@S3
작동해야 하지만 ssh -J user@S2 -R <rport>:localhost:<lport> user@S3
작동해서는 안 됩니다. S2의 sshd_config에는 어떤 구성이 필요합니까?
답변1
ssh -J S2 S3
S1에서는 S1에서 S2로 연결한 다음 S1에서 S3으로 연결하는 것과 같습니다(S2를 통해 전달된 패킷 사용). 명령에 -L
및/또는 명령을 추가 하면 -R
터널은 후자 연결에 속하게 됩니다.
sshd_config
S2 값은 S1에서 S2로의 연결에만 관련됩니다. S2의 SSH 서버 관점에서 -J
S1의 사용법은 S1의 사용법과 매우 유사합니다 -L
. 즉, S2의 서버가 요청 시 어딘가(귀하의 경우 S3)에 대한 TCP 연결을 설정해야 합니다. 일반적으로 모든 데이터는 이러한 터널을 통해 전달될 수 있으며 S2의 SSH 서버는 이를 검사하는 데 관심이 없으며 스트림만 전달합니다. 스트림이 또 다른 SSH 연결(S1이 S3과 통신함)이라는 것을 알고 어떻게든 이를 검열하고 싶어도 별도의 암호화를 사용하는 별도의 SSH 연결이기 때문에 그렇게 할 수 없습니다. 이 연결을 검열하기 위해 S2는 중간자 공격을 수행해야 합니다. SSH(안전한Shell)은 공격에 취약하지 않도록 세심하게 설계되었습니다.
S1에서 S3으로의 연결(S2를 통해 전달된 패킷 사용)의 경우 sshd_config
S3이 중요합니다.
사용자가 (을 사용하는 대신 -J
) S1에서 S2로 연결하기로 선택한 경우그 다음에다음을 실행하여 S2에서 S3으로ssh
S2에서-L
그런 다음 S1에서 S2로, S2에서 S3으로의 두 터널(또는 S3에서 S2로, -R
S2에서 S1로 두 개의 터널)을 연결하여 S1에서 S3으로(또는 S3에서 S1로 ) 경로를 설정하려고 시도할 수 있습니다. ) ) 터널. ). 이렇게 하면 S2가 됩니다.합법적인중간 사람. 이 경우 sshd_config
S2는 S1에서 S2로(또는 S2에서 S1로) 터널을 비활성화하는 올바른 위치입니다.
사용자가 이런 방식으로 연결하도록 강제할 수 있다고 가정해 보겠습니다. -L
S3 이상의 모든 포트로 터널링할 수 있도록 허용 하면 터널을 통해 S1에서 S3으로 SSH 연결을 생성할 수 있습니다. 이러한 방식으로 S3에 도달할 수 있다면 -R
이 터널 연결에서는 S1과 S3 사이에 합의가 있는 것입니다.오직.
관심을 가져야 하는지 스스로에게 물어보세요. S2만 제어할 수 있습니다. S1에서 호출 되면 ssh -J S2 S3
사용자가 제어하는 서버는 자신에 대한 SSH 연결을 수락하고 S3에 대한 연결을 설정합니다(양방향 흐름을 중계하는 경우에만). 작업 하려면 ssh -J S2 S3
두 가지 기능이 모두 필요합니다. 사용자가 및 -L
/또는-R
똑같은 것. 그러나 S3는 연결을 시작하거나( 의 경우 -L
) 청취를 시작합니다( 의 경우 -R
). 왜 그것이 당신에게 관심이 되어야 합니까? S3 관리자가 이를 처리하도록 하세요. 즉, sshd_config
S3에 적절한 도구가 있습니다.