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 PortRemote AddrRemote Port
-L48100:192.168.10.2:810048100192.168.10.28100

위의 옵션은, 이 ssh 연결을 터널삼아 ssh 사용자 local의 48100 포트로 들어오는 패킷을 원격지 192.168.10.2의 8100 포트로 전송하라는 뜻이다.

옵션Local PortRemote AddrRemote Port
-L40022:192.168.10.4:2240022192.168.10.422

위의 옵션은 기본적으로 동일한 역할을 하는데, 이 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에 접속

ssh 터널을 통한 원격 웹접속
ssh 터널을 통한 원격 웹접속

위의 화면은 사용자가 앞서 예시로 든 옵션을 사용해 192.168.10.2로 ssh 접속을 한 후, 그 연결을 유지한 상태에서 사용자의 웹브라우져를 이용하여 마치 로컬에 접속하듯이 http://localhost:48100/ 으로 접속한 것이다.

또, 동일한 조건에서 아래와 같이 마치 localhost에 접속하는 것처럼 명령을 내려 원격지 192.168.10.2를 경유하여 192.168.10.4:22에 접속할 수 있다.

$ ssh -p 40022 user4@localhost

해보면 쉬운 얘기인데 설명이 더 어렵다. 위의 연결 구조를 그림으로 보면 다음과 같다.

ssh tunneling 구조
ssh tunneling 구조

이 때, 당연한 얘기인데, 최종 접속 대상이 되는 서버에서는 각 연결을 192.168.10.2로부터의 연결로 인식하게 된다.

ssh는 위와 같은 Local Port Forwarding 외에도 Remote Port에 대한 Forwarding을 통해서 접근한 서버로부터 이 쪽(Client 쪽)에 위치한 서버로의 접속을 만들어 낼 수도 있고, 별도로 기술한 바 있는 간단한 SOCK Proxy를 구현할 수도 있다.

ssh의 강력하고 편리한 기능이면서, 동시에 신경쓰지 않는다면 서버 또는 전체 망 보안에 큰 구멍이 될 수 있는 기능이다. (물론, 제대로된 회사라면 보안 규칙에 의해 sshd 설정에서 이러한 Tunneling을 원천적으로 막고 있을 것이고 망 내의 모든 서버에 대해 주기적인 구성 감사를 할 대상이기도 하다.)

comments powered by Disqus