프로그래밍/General

SSH 터널링 / 포트 포워딩 예시로 알아보기

Lou Park 2022. 1. 31. 14:36

# SSH란?

원격 호스트에 접속하기 위해 사용되는 보안 프로토콜.

일반적으로는 Public key / Private key를 사용하는 비대칭 암호화(Asymmetric Encryption) 방식을 사용한다.

 

비대칭 암호화

Public Key가 자물쇠, Private Key가 자물쇠를 여는 열쇠라고 비유를 해서 그려본 그림이다. 중간에 누군가 박스를 탈취한다 하더라도 자물쇠는 오직 A/B 두사람만이 열수 있기때문에 보안성이 확보된다.

 

# SSH 터널링이란? (SSH 포트 포워딩)

SSH 클라이언트와 서버사이 연결이 수립되어 만들어진 통로가 "터널"

여기에 포트 포워딩(Port Forwarding)을 이용하면 만들어진 터널을 다른 애플리케이션이 이용할 수 있다.

방화벽을 우회할 수도있으며, 암호화를 지원하지 않는 프로그램을 SSH 터널을 통해 안전하게 사용할 수 있게 할 수 있다.

 

로컬 터널링 - 클라이언트에서 서버로 연결하여 서버의 포트를 이용함

리모트 터널링 - 서버에서 클라이언트로 연결하여 클라이언트의 포트를 이용함

 

SSH 터널링 예시 - MySQL 보안 강화하기

기본 MySQL 포트인 3306을 열어두면 보안에 좋지 않을 수 있으니, 이를 SSH 터널링을 통해 접속하는 방식을 예시로 들 수 있다.

 

1) 방화벽으로 3306포트 막기

MySQL이 설치된 서버에 우분투의 기본 방화벽인 UFW를 이용해 22번 포트를 제외한 나머지 포트를 허용하지 않도록 설정했다.

sudo ufw allow 22/tcp
sudo ufw enable

sudo ufw enable을 통해 방화벽을 활성화 시켜주면 외부 컴퓨터에서 3306으로 직접 접속을 하려고 할때 방화벽에 막혀 접속되지 않는다.

 

2) 포트포워딩 설정

ssh -L 33060:101.101.210.88:3306 root@101.101.210.88

로컬 컴퓨터의 33060 포트를 통해 MySQL서버(101.101.~)의 3306 포트를 접근할 수 있는 터널을 만드는 명령어다. 명령어를 입력하게 되면 SSH 연결이 수립되는데, 연결 수립 상태에서 다른 터미널 창을 열어 33060 포트로 MySQL에 접속해보면 된다.

현재 연결을 허접한 그림판으로 도식화 한모습

 

33060 포트를 Listening

클라이언트에서 netstat 명령어로 확인해보면 33060 포트를 LISTENING 하고있음을 확인할 수 있다.

 

3) 클라이언트에서 MySQL 접속

mysql -P 33060 -u root -p

이제 다음 명령어로 원격 호스트의 MySQL에 접속할 수 있게 된다.

비밀번호를 틀려보니 이렇게 원격 호스트로 접속된다는 것을 한방에 알 수 있다. ㅋ_ㅋ;

MySQL Workbench / DBeaver등 DB 툴에서도 SSH 터널링을 설정할 수 있다.

 


 

참고자료

https://naknaklee.github.io/etc/2020/10/22/linux-ssh-tunneling/

https://www.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS5064906327