Study

SSH Proxy/Tunneling 개념 및 종류

TTOII 2022. 4. 5. 11:03
728x90

✔︎ SSH proxy/tunneling 

클라이언트와 서버 사이에 연결이 이루어지면 이를 터널링이라고 한다.

SSH tunneling이란 터널링을 SSH 프로토콜을 이용하여 구현하는 것이며 proxy와 비슷한 역할을 한다.

사내 내부망에 있는 서버로 직접 접속을 허용하지 않는 경우 외부에서 내부로 접근하기 위해 터널링 기술을 이용하고

이 때 SSH 프로토콜을 이용해 패킷을 암호화하는 것이다. 

 

✔︎ SSH proxy/tunneling 사용의 이유 

회사 내부 로컬 네트워크에 연결된 VM에 접근하고 싶을 때

https://mono-cake.coffee/2021-08-08-ssh-jumping-host/

서버 내부에 설치된 도커 컨테이너에 SSH로 접근하고 싶을 때

1. 간이 VPN이 필요할 때

2. 여러 안전하지 않은 통신 프로토콜을 안전하게 연결하고 싶을 때

3. 서버가 접근 IP 를 제한하거나 방화벽/공유기 뒤에 있어서 직접 연결이 불가능 할 때

4. 사용하는 데스크탑/노트북이 퍼블릭 아이피를 가지고 있지 않을 때 임시로 서비스를 운용하고 싶을 때

5. 다른 서버를 이용해서 최종 서버에 ssh 연결하고 싶을 때

6. 다른 프록시나 tor 망을 경유해서 접속하고 싶을때 (이건 엄밀히 ssh 프록시는 아니지만, ssh 가 프록시를 이용하는 것)

7. 기타 

 

✔︎ SSH proxy/tunneling 종류

  • Local port forwarding
  • Remote Port forwarding
  • Dynamic Port forwarding

Local port forwarding

https://deep-jin.tistory.com/entry/SSH-로컬-포트-포워딩-SSH-터널링

SSH-Client : 웹 서버로의 접근을 원하는 서버 혹은 Local PC

SSH-Server : 접근할 웹 서버를 담고 있는 서버, 22번 포트가 열려있다고 가정하면 이것을 통해 웹 서버에 접근한다.

Web-Server : SSH-Client가 접근을 원하는 웹 서버, Nginx 서버고 80번 포트에 바인딩 되어 있다고 가정하자

 

그림을 보면 클라이언트가 SSH-Server에 접근할 때, 22번 포트로는 접근이 가능하나 Nginx 웹 서버는 방화벽에 막혀 접근하지 못하는 상황이다. 이런 경우 22번 포트로 우선 Server에 우회해서 접근한 뒤, 80번 포트에 연결하는 방법을 활용하는데 이것이 바로 Port forwarding tunneling이다. 

ssh -L [local port]:[remote server]:[remote port]SSH-Server # 마지막 : 없음 주의
  • local port - local, 즉 SSH-Client가 로컬에서 사용할 포트
  • remote server - 접근할 웹 서버의 주소
  • remote port - 접근할 웹 서버가 바인딩 된 포트
ssh -L 8888:127.0.0.1:80 SSH-Server

우리는 '-L' 로컬 포트 포워딩을 시도할 것이고 SSH-Client에서 8888번 포트로 웹 서비스를 열어 볼 것이다.

즉 크롬 주소창에 localhost:8888 이라고 써서 열어 본다는 것이다. 

우리가 접근을 원하는 Nginx 웹 서버 주소는 127.0.0.1 이고, 80번 포트에 바인딩 되어 있다.

우리는 SSH-Server를 우회해서 해당 웹 서버에 연결할 것이다. SSH-Server 대신 192.168.53.1을 입력해도 상관없다.


Remote port forwarding

원격 포트 포워딩은 로컬 포트 ​​포워딩의 반대이다. 

이를 통해 원격(ssh 서버) 시스템의 포트를 로컬(ssh 클라이언트) 시스템의 포트로 포워딩한 다음 대상 시스템의 포트로 포워딩할 수 있다.

 

Remote port forwarding에서 SSH-Server는 지정된 포트에서 수신을 대기하고 해당 포트에 대한 모든 연결을 Local SSH-Client의 지정된 포트로 터널링한 다음 대상 시스템의 포트에 연결한다. (대상 시스템은 Local 또는 다른 시스템일 수 있다.)

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

사용 옵션은 다음과 같다.

  • [REMOTE:]REMOTE_PORT- 원격 SSH 서버의 IP 및 포트 번호. 비어 있으면 REMOTE원격 SSH 서버가 모든 인터페이스에서 바인딩됨을 의미합니다.
  • DESTINATION:DESTINATION_PORT- 대상 시스템의 IP 또는 호스트 이름 및 포트.
  • [USER@]SERVER_IP- 원격 SSH 사용자 및 서버 IP 주소.

원격 포트 포워딩은 주로 외부에서 누군가에게 내부 서비스에 대한 액세스 권한을 부여하는데 사용된다.

로컬 컴퓨터에서 웹 응용 프로그램을 개발 중이고 동료 개발자에게 미리 보기를 표시하려고 한다고 가정해보자

공인 IP가 없으므로 다른 개발자는 인터넷을 통해 응용 프로그램에 액세스 할 수 없다.

 

원격 SSH 서버에 액세스할 수 있는 경우 다음과 같이 원격 포트 전달을 설정할 수 있다.

ssh -R 8080:127.0.0.1:3000 -N -f user@remote.host

위의 명령은 ssh 서버가 포트 8080에서 수신 대기하도록 만들고 이 포트에서 포트 3000의 로컬 시스템으로 모든 트래픽을 터널링한다.
이제 동료 개발자가 브라우저에 _ssh_server_ip:8080을 입력하고 멋진 애플리케이션을 미리 볼 수 있다.

원격 포트 전달을 설정하는 데 문제가 있는 경우 원격 SSH 서버 구성에서 GatewayPorts가 yes로 설정되어 있는지 확인한다.

 


Dynamic Port forwarding

동적 포트 전달을 사용하면 SOCKS 프록시 서버 역할을 하는 로컬(ssh 클라이언트) 시스템에 소켓을 생성할 수 있다.

클라이언트가 이 포트에 연결하면 연결이 원격(ssh 서버) 시스템으로 전달된 다음 대상 시스템의 동적 포트로 전달된다.

이렇게 하면 SOCKS 프록시를 사용하는 모든 응용 프로그램이 SSH 서버에 연결되고 서버가 모든 트래픽을 실제 대상으로 전달한다.

Linux, macOS 및 기타 Unix 시스템에서 SOCKS(동적 포트 전달)를 생성하려면 -D 옵션을 ssh 클라이언트에 전달한다.

ssh -D [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

사용 옵션은 다음과 같다.

  • [LOCAL_IP:]LOCAL_PORT - 로컬 컴퓨터 IP 주소 및 포트 번호다. LOCAL_IP를 생략하면 ssh 클라이언트가 localhost에 바인딩된다.
  • [USER@]SERVER_IP - 원격 SSH 사용자 및 서버 IP 주소이다.

동적 포트 포워딩의 일반적인 예는 SSH 서버를 통해 웹 브라우저 트래픽을 터널링하는 것이다.
다음 명령은 포트 9090에 SOCKS 터널을 생성한다.

ssh -D 9090 -N -f user@remote.host

 

 

 

참고 

728x90