ssh는 Secure SHell의 축약 형태로 만들어진 이름인데, 기원으로 보자면 원격지 서버에서 명령을 수행하기 위한 r* 명령어 가족 중 rsh(Remote SHell)의 보안 관점의 취약점을 개선하여 통신계층을 암호화한 일종의 “원격 쉘"이다. 그런데, 이 보안 원격 쉘의 기능을 이용하여 ssh 연결을 타 서비스 연결을 위한 터널로 활용할 수 있다.
가정하는 상황은 다음과 같다.
- 내가 접근하려는 서버는 192.168.10.0/24 망에 있고,
- 나에게는 192.168.10.2 서버(A)의 ssh 접근만 허용되어 있다.
- 그런데 나는, 같은 서버의 허용되지 않은 8100 포트(WAS 관리용)와 같은 네트워크 내의 192.168.10.4 서버(B)에 ssh 접속을 하고 싶다.
정리하면, 나는 192.168.10.2:22 로 접근할 수 있고 192.168.10.2:8100과 192.168.10.4:22로 추가 접속을 원한다. 그렇다면, 다음과 같은 옵션을 사용하여 (A)를 통과하여(Tunnel) (B)까지 접속할 수 있다.
$ ssh user2@192.168.10.2 -L48100:192.168.10.2:8100 -L40022:192.168.10.4:22
위의 명령을 보면, -L 옵션을 이용하여 Local Port Forwarding을 지정하고 있으며, 그 자세한 뜻은 아래와 같다.
| 옵션 | Local Port | Remote Addr | Remote Port |
|---|---|---|---|
| -L48100:192.168.10.2:8100 | 48100 | 192.168.10.2 | 8100 |
위의 옵션은, 이 ssh 연결을 터널삼아 ssh 사용자 local의 48100 포트로 들어오는 패킷을 원격지 192.168.10.2의 8100 포트로 전송하라는 뜻이다.
| 옵션 | Local Port | Remote Addr | Remote Port |
|---|---|---|---|
| -L40022:192.168.10.4:22 | 40022 | 192.168.10.4 | 22 |
위의 옵션은 기본적으로 동일한 역할을 하는데, 이 ssh 연결을 터널삼아 ssh 사용자의 local 40022 포트로 향하는 패킷을 ssh로 접속한 원격서버에서 직접 접근이 가능한 192.168.10.4 의 8100 포트로 보내준다는 뜻이다. 즉, 사용자는 192.168.10.4에 직접 접속할 수 없더라도 192.168.10.2에서 192.168.10.4에 접속이 가능하다면, 이 ssh tunnel을 이용하여 만든 터널을 통해 이제는 직접 접속할 수 있다는 뜻.
이렇게 ssh를 써서 Tunnel을 만들고 나면, 다음과 같이 원하는 접속을 할 수 있다.
먼저, 첫번째 옵션에 의해 외부에 열려있지 않은 192.168.10.2:8100에 접속

위의 화면은 사용자가 앞서 예시로 든 옵션을 사용해 192.168.10.2로 ssh 접속을 한 후, 그 연결을 유지한 상태에서 사용자의 웹브라우져를 이용하여 마치 로컬에 접속하듯이 http://localhost:48100/ 으로 접속한 것이다.
또, 동일한 조건에서 아래와 같이 마치 localhost에 접속하는 것처럼 명령을 내려 원격지 192.168.10.2를 경유하여 192.168.10.4:22에 접속할 수 있다.
$ ssh -p 40022 user4@localhost
해보면 쉬운 얘기인데 설명이 더 어렵다. 위의 연결 구조를 그림으로 보면 다음과 같다.

이 때, 당연한 얘기인데, 최종 접속 대상이 되는 서버에서는 각 연결을 192.168.10.2로부터의 연결로 인식하게 된다.
ssh는 위와 같은 Local Port Forwarding 외에도 Remote Port에 대한 Forwarding을 통해서 접근한 서버로부터 이 쪽(Client 쪽)에 위치한 서버로의 접속을 만들어 낼 수도 있고, 별도로 기술한 바 있는 간단한 SOCK Proxy를 구현할 수도 있다.
ssh의 강력하고 편리한 기능이면서, 동시에 신경쓰지 않는다면 서버 또는 전체 망 보안에 큰 구멍이 될 수 있는 기능이다. (물론, 제대로된 회사라면 보안 규칙에 의해 sshd 설정에서 이러한 Tunneling을 원천적으로 막고 있을 것이고 망 내의 모든 서버에 대해 주기적인 구성 감사를 할 대상이기도 하다.)
묶음글, 함께 읽기 잊지 마세요!
잘못된 부분의 제보나 의견/요청 댓글 환영합니다!