티스토리 뷰
이번엔 SSH에 대해서 알아보도록 하겠습니다.
저희가 개발을 할 때, 서버 배포를위해 클라우드에 접속을 할때 흔히 SSH로 원격접속을 하고, SCP로 파일전송을 했던 경험이 있을 겁니다. 그때는 "아 그냥 이런거구나~" 하고 넘어갔는데, 이번 기회에 SSH란 무엇이고 어떤원리로 진행이 되는지를 알아보도록 하겠습니다.ㅕㅣ
우선 SSH란 뭘까요?
SSH(Secure Shell)이란?
암호화를 통해 클라이언트와 서버 간에 연결하기 위해 개발된 보안 프로토콜로, 서로간의 통신을 암호화하여 전송하여, 원격접속, 파일전송 등의 명령을 안전하게 진행할 수 있는 장점을 가지고 있습니다.
즉, 굉장히 안전한 클라이언트 서버 연결 방식이라고 생각하시면 됩니다.
SSH 특징
- 안전한 통신
-SSH는 비밀번호나 공개키를 이용하여 데이터를 암호화 하기에 중간에 다른사람이 가로채기 어렵습니다. - 22 PORT
-기본적으로 SSH 프로토콜은 시스템에서 22번 PORT로 처리하게끔 설정되어있습니다. - 세션사용
-SSL/TLS와 같은 이유로, 공개키로 직접 데이터를 암호화하는게 아닌, 키교환 방식으로 세션키를 만들어서 통신을 합니다.
따라서 저희는 SSH를 사용해 다른 시스템에 원격접속을 하거나, 꼭 안전하게 전송해야할 데이터가있을 때 SSH를 사용하여 안전하게 전송을 할 수 있습니다.
그러면, 이 SSH은 어떤원리로 통신이 이루어지며, 안전하게 데이터 전송을 할 수 있는 것 일까요??
SSH 동작 원리

- 클라이언트의 연결 요청
- 클라이언트가 서버의 22번 포트로 SSH 접속 요청을 보내 서버에게 연결요청을 합니다. - 서버 공개키 전송
-서버가 접속 요청한 클라이언트에게 서버의 공개키 인증서를 보냅니다. - 클라이언트-서버 상호 인증 절차
이 과정에서 클라이언트와 서버 서로가 인증을 하는데 클라이언트 인증, 서버 인증 크게 2가지의 과정이 있습니다
먼저, 서버인증의 과정은 다음과 같습니다.
- 서버 공개키 전달
- 클라이언트 known_host 파일에 공개키 저장
- 클라이언트에서 난수 생성 및 서버 공개키로 암호화 후 서버에 전달
- 서버에서 올바른 값인지 비교
이 과정을 통해 클라이언트에서 서버를 인증하고 믿을만한 개체인지 확인합니다.
저희가 클라우드에서 ssh 접속을 처음할때 어떤 메세지가 나오고 'yes'를 누르는 과정이 있는데 이 과정이 known_host 파일에 서버의 공개키를 저장하고, 인증을 할거냐?? 라고 묻는것 입니다.
다음 과정은 클라이언트 인증과정입니다.- 클라이언트가 서버에게 본인의 비밀번호 or SSH 키 전달 (초기에 설정한 키 인증방법에 따라 달라짐)
- 서버가 .ssh/authorized_keys에 있는 비밀번호, 공개키의 정보와 매칭되는지 확인
- 일치할 경우, 서버에서 난수 생성 및 공개키 암호화하여 클라이언트에게 전달
- 클라이언트에서 올바른 값인지 비교
이 과정을 통해 서로 교환된 난수를 조합하여 세션키를 생성하고, 해당 세션키로 서로의 통신을 암호화하여 안전하게 데이터 전송을 할 수 있습니다
- 통신 시작
생성된 세션키를 통해 서로의 통신을 암호화하여 안전하게 전송을 합니다.
SSH 터널링이란?
이렇게 SSH가 어떻게 동작하는 것인지 과정을 알게되었습니다.
이러한 SSH 특징으로 앞에서 말했던 원격접속, 파일전송 외에도 터널링이라는 기술로 활용할 수 있는데요.
이 터널링은 시스템을 포트포워딩하여 다른 사이트에 접근할때 로컬호스트의 정보가 아닌, 원격시스템의 정보로 접근할 수 있는 기술입니다.
즉, 프록시와 유사하게 동작하는 기능을 SSH로 구현할 수 있습니다.

이렇게 ssh 터널링을 설정하면 client의 5000번 포트로 나가는 신호가 ssh server의 22로 들어가서 ssh server가 해당 신호를 처리하게 됩니다.
즉, 저희가 localhost:5000 번으로 명령을 보내면 그게 연결된 ssh server의 22번 포트로 들어가서 해당 명령어가 ssh server에서 실행되는 구조입니다.
이렇게 ssh 터널링의 종류는 크게 3가지가 있습니다.
- 로컬 포트포워딩(Local Port Forwarding)
- 원격 포트포워딩(Remote Port Forwarding)
- 동적 포트포워딩(Dynamic Port Forwarding)
이 중에서 로컬 포트포워딩, 원격 포트포워딩에 대해서 알아보겠습니다. 이 둘의 차이는 ssh 연결을 하는 주체가 누구인지에 따라 달라지는 것입니다. 로컬 포트포워딩은 SSH Client -> SSH Server 처럼 연결되는것이고, 원격 포트포워딩은 SSH Server -> SSH Client처럼 연결되는 것입니다.
- 로컬 포트포워딩
ssh -L [로컬포트]:[원격호스트]:[원격포트] 사용자이름@원격호스트
-로컬 시스템에서 원격 시스템에게 SSH 연결을 하는것으로, 내 로컬포트에 들어간 신호들은 다 원격포트로 넘어가는것입니다.
예를 들어, 8080(로컬) -> 80(원격) 으로 ssh 연결을 했다 가정했을 시, 8080으로 신호를 보내면 해당 신호는 원격호스트의 80포트를거쳐서 나가게됩니다. 이렇게되면 최종적으로 신호가 도착하는곳에서는 제 ip가 보이는게 아닌 원격호스트의 주소가 보이게 되는것입니다.
- 원격 포트포워딩
ssh -R [원격포트]:[로컬호스트]:[로컬포트] 사용자이름@로컬호스트
-원격 시스템에서 로컬시스템에게 SSH 연결을 하는 것으로, 원격 포트에 들어간 신호들은 다 로컬호스트의 로컬포트로 넘어오는 것입니다.
예를들어, 5000(원격) -> 1000(로컬)으로 ssh 연결을 했다 가정했을 시, 외부에서 원격 포트의 5000으로 명령을 보내면 해당 명령은 무조건 로컬호스트의 1000포트로 들어오게됩니다.
이런식으로 ssh를 활용하여 터널링을 구축할 수 있습니다.
'네트워크' 카테고리의 다른 글
무중단 배포를 위한 Nginx 도입기 (0) | 2024.07.02 |
---|---|
공개키 암호화 방식 (2) | 2023.10.03 |
해시함수란? (0) | 2023.09.24 |
대칭키(Symmetric key) (0) | 2023.09.17 |
포트포워딩이란? (0) | 2023.08.21 |
- Total
- Today
- Yesterday
- 보안
- 배포
- 네트워크
- 포트포워딩
- JPA
- 데이터베이스
- 문법
- 쿼리
- DB
- 도커
- 프로토콜
- 메세지큐
- 서버
- 소프트웨어공학
- IP주소
- 컴퓨터구조
- 깃허브
- 웹소켓
- 데이터
- 파인튜닝
- 스프링
- 깃
- 인공지능
- 컨테이너
- 테이블
- 클라우드
- 자동화
- nat
- 자바
- sql
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |