SSH 동적 포트 전달을 통해 애플리케이션 클라이언트와 애플리케이션 서버 간의 연결을 생성할 때
ssh -D
SOCKS 프로토콜은 어떻게 사용됩니까 ? SOCKS를 통신 프로토콜로 사용하는지 여부- 애플리케이션 클라이언트와 SSH 클라이언트 사이에서
- 또는 SSH 클라이언트와 SSH 서버 사이,
- 아니면 SSH 서버와 애플리케이션 서버 사이에 있습니까?
애플리케이션 클라이언트가 SSH 동적 포트 전달을 통해 애플리케이션 서버에 연결되면 SSH 클라이언트와 서버는 일반적으로 "방해가 됩니다." 이는 SSH 프로토콜이 더 이상 사용되지 않는다는 의미입니까? SOCKS 및/또는 SSH와 같이 어떤 프로토콜이 아직 사용되고 있습니까? 애플리케이션 클라이언트와 애플리케이션 서버 간의 통신이 여전히 SSH 프로토콜 내에 캡슐화되어 보호됩니까?
감사해요.
답변1
SSH 프로토콜단일 TCP 연결을 통해 여러 개의 독립적인 데이터 스트림을 다중화할 수 있습니다. 각 데이터 스트림은 다음과 같이 호출됩니다.채널. TCP 연결을 통해 전송되는 모든 데이터는 암호화됩니다. 발신자는 다양한 채널의 데이터를 단일 데이터 스트림으로 집계한 다음 암호화합니다. 수신자는 데이터를 해독하고 집계된 데이터 스트림을 다시 해당 채널로 분리합니다.
포트 전달의 경우 SSH 클라이언트는 TCP 연결을 사용하여 TCP를 통해 원격 SSH 서버에 연결합니다.SSH 프로토콜. 일반적인 클라이언트->서버 전달 시나리오에서 SSH 클라이언트는 TCP 연결을 위해 포트에서도 수신 대기합니다. 이 포트에 대한 연결은 서버에 의해 대상으로 전달됩니다.
"초기자"(일명 "애플리케이션 클라이언트")가 SSH 클라이언트의 수신 대기 포트에 연결되면 SSH 클라이언트는 서버에 채널 열기 요청을 보냅니다."direct-tcpip" 채널 요청. 이 요청의 매개변수에는 채널이 연결되어야 하는 호스트 이름/IP 주소와 포트가 포함됩니다. SSH 서버는 지정된 호스트 및 포트에 대한 또 다른 TCP 연결을 설정하며 이를 "대상"이라고 부릅니다. 이제 세 가지 TCP 연결이 있습니다.
- 개시자와 SSH 클라이언트 사이
- SSH 클라이언트와 SSH 서버 사이
- SSH 서버와 전달 대상 사이
SSH 클라이언트와 서버는 SSH 연결을 통해 개시자와 대상 사이의 양방향으로 데이터를 중계합니다.
따라서 개시자로부터 연결을 전달할 때 SSH 클라이언트는 SSH 서버에 연결이 전달되어야 하는 위치를 알려야 합니다. ssh
포트를 전달하기 위해 명령줄 옵션을 사용하여 실행하는 경우 , 예를 들면 다음과 같습니다.
ssh -L 1234:example.com:2345 ...
연결을 전달할 위치에 대한 정보는 명령줄 매개변수에서 가져옵니다. ssh
포트 1234에 대한 연결은 example.com 포트 2345로 전달됩니다.
ssh
예를 들어 SOCKS 서버 실행을 위한 옵션과 함께 호출되는 경우 :
ssh -D 1234
그런 다음 SOCKS 포트에 연결하는 각 초기자는 먼저 연결하려는 호스트와 포트를 지정하는 SOCKS 프로토콜 메시지를 보내야 합니다. ssh
direct-tcpip 채널 열기 요청은 SOCKS 메시지의 정보를 사용하여 구성됩니다.
답변2
SSH 클라이언트와 서버의 "방해"는 동적 포트 전달을 설명하는 매우 나쁜 방법이며 아마도 일부 작성자가 특정 환경에서 배웠을 수 있는 서투른 설명이나 지나치게 단순한 설명을 반복한 결과일 것입니다. 작은.
다른 사람들이 설명했듯이 SOCKS는 호환되는 TCP 프록시에 연결이 어디로 가야 하는지 알려주는 표준화된 방법으로 사용됩니다. 본질적으로 SOCKS 프로토콜은 구식 수동 전화를 사용하는 것과 같습니다. "교환원님, 시내 전화번호 Y에 연결해 주세요. 상대방과 어떤 언어로든 통화하고 싶습니다.
SSH 동적 전달에서 애플리케이션 클라이언트는 동적으로 전달된 포트(SOCKS 서버 포트)에 대한 TCP 연결을 열고 특정 IP 주소 및 포트에 연결하기 위해 표준 SOCKS 요청을 보낸 다음 로컬에서 사용했던 프로토콜을 사용하여 다시 시작할 수 있습니다. 해당 TCP 연결을 통해. 초기 SOCKS 요청을 할 수 있어야 하지만 더 이상 정보를 알 필요는 없습니다. (연결 끝에 약간의 SOCKS 관련 사항이 있을 수 있지만 그렇지 않은 경우 전달된 연결은 엔드포인트에 대해 완전히 투명하고 프로토콜 중립적입니다.)
다른 쪽 끝에 있는 애플리케이션 서버는 SSH 서버의 기존 TCP 연결만 볼 수 있습니다. 연결이 전달되고 있다는 사실을 알 필요도 없고 클라이언트가 SOCKS 프로토콜과 관련되어 있다는 것도 알 필요가 없습니다.
(전화벨이 울리고 응답하면, 전화가 유선 네트워크로 나가는 회선과 완전한 기능을 갖춘 수동 전화 교환 기능을 갖춘 기술 박물관에서 걸려오는 경우에도 특별한 조치를 취할 필요가 없습니다.)
따라서 엄격한 클라이언트/서버 측면에서 동적 전달 기능이 활성화되면SSH 클라이언트역할도 할 것입니다.양말 서버SOCKS 서버를 사용하는 모든 연결이 암호화된 SSH 터널 내에서 원격으로 전달된다는 특정 추가 속성이 있습니다.SSH 서버거기에서 일반 TCP 연결로 되돌아갑니다.
즉, 즉, 동적 전달이 활성화된 SSH 클라이언트 + SSH 연결 + SSH 서버의 조합은 SOCKS 프록시의 인바운드 측이 위치하도록 SSH 연결이 커버하는 거리까지 확장된 SOCKS 프록시 역할을 하게 됩니다. SSH 클라이언트와 동일한 거리 내 동일한 위치에서 아웃바운드 끝은 SSH 서버에 있으며, 그 사이에서 발생하는 일은 외부 관찰자에게는 설명이 없는 암호화된 SSH 트래픽처럼 보입니다.
알아채다SSH 클라이언트와 SSH 서버 사이의 홉만 SSH로 보호됩니다.그러나 애플리케이션 클라이언트와 SSH 클라이언트/SOCKS 서버 간의 홉은 일반적으로 단일 호스트 내에서 이루어집니다. 암호화할 수 없는 유일한 나머지 부분은(애플리케이션 프로토콜에 자체 암호화가 포함되어 있지 않은 경우) SSH 서버와 애플리케이션 서버 간의 홉입니다.
답변3
SOCKS 프로토콜이 사용됩니까?
클라이언트(웹 브라우저)는 SSH 서버와 통신합니다(Ssh 클라이언트를 통해).
애플리케이션 클라이언트와 애플리케이션 서버 간의 통신이 여전히 SSH 프로토콜 내에 캡슐화되어 보호됩니까?
예.