SSH Connection을 통해 데이터를 전송하는 기법, SSH 포트포워딩으로도 불린다.
프록시의 역할과 유사하다. SSH의 특징으로 인해 전송되는 데이터는 모두 암호화된다는 점이 있다.
위와 같이 SSH 서버로의 연결을 통해 터널을 생성하고, 터널을 통해 다른 서비스로 접근하는 방법을 SSH 터널링이라고 한다.
연결방향에 따라 로컬 / 리모트로 구분될 수 있고, 추가로 다이나믹 SSH 터널링도 존재한다.
로컬 SSH 터널링
로컬 포트를 원격지의 포트로 포워딩
이와 같은 로컬 SSH 터널링은 가장 많이 사용되는 방법으로 주로 방화벽 정책을 우회하기 위한 목적으로 이용되고는 한다.
재택에서 사내 PC를 통해 내부망에 접근하는 경우 등에 사용한다.
로컬 SSH 터널링의 커맨드는 아래와 같다.
ssh -L ([로컬 ip]:)[로컬 포트]:[원격지 ip]:[원격지 포트] [SSH 서버 username]@[SSH 서버 ip]
이 로컬 터널링을 통해 로컬 포트로 전달되는 트래픽은 [원격지 ip]:[원격지 포트]로 포워딩된다.
로컬 ip 구문은 생략 가능하다.
아래 예시는 로컬 SSH 터널링을 통해 서버의 8080 Application에 접근하는 과정을 나타낸다.
SSH Client가 8888 포트로 리스닝하고, SSH Server가 127.0.0.1:8080으로 포워딩하는 것을 볼 수 있다.
아래의 경우, bastion host의 sshd를 통해 내부망에 있는 서버로 터널링을 생성해 접근하는 방법이다.
앞선 예시에서는 포워딩할 대상이 SSH Server(데몬)와 동일한 서버에 위치했지만, 이번 예시에서는 bastion host에서 내부망에 존재하는 다른 서버로 포워딩을 시켜준다.
리모트 SSH 터널링
원격지의 포트를 로컬 시스템의 포트로 포워딩, 리모트 SSH 터널링은 로컬 SSH 터널링의 반대되는 개념이다.
원격지의 포트를 포워딩하기 때문에, public하게 설정된 경유 서버(게이트웨이)가 추가로 필요하다.
리모트 SSH 터널링은 내부 서비스를 외부망으로 노출시키는 상황 등에서 사용된다.
추가로, 리모트 SSH 터널링에 사용되는 경유 SSH 서버의 GatewayPorts 설정이 추가로 필요하다. (GatewayPorts yes)
해당 설정이 없는 경우, 터널링된 서비스에 경유 서버의 localhost로 밖에 접근이 불가하다.
리모트 SSH 터널링의 커맨드는 아래와 같다.
ssh -R [원격지 포트]:[대상서버 ip]:[대상서버 포트] [원격지 서버 username]@[원격지 서버ip]
아래 예시는 리모트 SSH 터널링을 통해 내부망의 서비스를 게이트웨이로 포워딩하는 과정을 나타낸다.
위와 같이 리모트 SSH 터널링을 생성하면 게이트웨이 public ip의 포워딩한 8888 포트로 내부망의 서비스(192.168.2.2:80)으로 접근이 가능하다.
다이나믹 SSH 터널링
위 2개의 터널링은 모두 로컬/리모트의 포트가 일대 일로 연결되는 방식이였다.
반면 다이나믹 터널링은 SOCKS 프록시를 이용해 자유롭게 포워딩이 가능하다. ssh 클라이언트 로컬에 SOCKS 프록시 서버로 동작하는 소켓을 생성해, 해당 포트로의 모든 트래픽을 리모트로 포워딩하는 구조이다.
즉, 로컬에서 지정한 포트를 통해 원격지의 모든 포트들에 접근할 수 있는 방식이다.
접근이 제한된 웹 서비스(인터넷 검열) 우회에 다이나믹 SSH 터널링이 사용된다.
아래 예시는 다이나믹 SSH 터널링을 통해 리모트로 포워딩시켜 인터넷 브라우징을 시도하는 과정이다.
Client는 앞단에 설치된 방화벽에 의해 접근이 차단된 일부 웹사이트 등에 직접 접근할 수 없다. 하지만 외부(public)에 위치한 SSH 서버로 다이나믹 SSH 터널링을 생성해 SOCKS 프록시를 생성한다. Client는 로컬 포트 9000을 통해 모든 트래픽을 SSH 서버로 전달하게 되며, SSH 서버는 이를 목적지로 포워딩한다.