본문 바로가기

Linux

SSH Port Forwarding(SSH Tunneling)

출처 : http://ubuntu.or.kr/viewtopic.php?p=27863


SSH를 사용하여 다른 사이트의 Port를 SSH를 거쳐서 지나갈 수 있게 포워딩할 수 있다.
아래 설명은 리눅스 기준으로 설명한 것이다.
윈도우에서 사용할려면 Cygwin의 ssh를 이용하거나 Putty, XShell, SecureCRT 같은 프로그램을 이용하여야 한다.

사용하여야 하는 이유로 예를 들자면 로컬 네트워크에서 외부로 접속 하고자 하는데 그 사이의 방화벽에서 22번 포트만 허용해놓고 23번(telnet) 포트나 21번(ftp)의 외부 접근을 막아놨다고 하자. 그런데 업무로 인하여 telnet 서비스나 ftp를 이용하여야만 한다면?

1. 방화벽 관리자에게 연락하여 포트를 사용할 수있도록 허용해달라고 한다.
2. ssh를 사용하여 방화벽을 우회한다.

특정 웹사이트에 접속하고 싶은데 회사에서는 그 사이트의 접속을 라우터 단에서 막아놨다.

특정 메신져를 사용하고 싶은데 회사에서는 그 메신져가 사용하는 포트에 대한 접근을 막아놨다.

커 뮤니티에 글을 남기고 싶은데, 그 커뮤니티에는 IP가 노출된다. 최소한 내 IP가 아닌 다른 IP로 기록이 되게끔 하고 싶다.(그러나 완전한 방법은 아니다. 법적인 수사가 들어 올 경우 내가 이용한 SSH 서버의 로그에는 내가 접속했던 시간의 기록이 남아있을 가능성이 높다.그렇다 하더라도 법적인 경우가 아닐 경우에는 확실히 내 IP의 노출을 막을 수 있으므로 유용하다.)

RapidShare 같은 사이트에서 자료를 받아야 하는데, 일정 시간에는 몇개의 파일만 받을 수 있도록 제한이 되어 있다. 그러므로 많은 자료를 받기 위해서는 몇개의 파일을 받고 몇분을 기다려야 하므로 시간이 낭비된다. 이럴때 SSH Tunneling을 이용하면 2개의 IP를 이용하여 받으므로 기다리는 시간을 절반으로 단축시킬 수 있다.(SSH 계정이 n개라면 n배수만큼 단축시킬 수 있음)

이러한 상황에 터널링을 이용하면 방화벽을 우회할 수도 있지만, 데이터를 암호화(Encryption) 하여 sniffing을 통한 데이터 또는 정보 노출을 막을 수 도 있다.

1. Local SSH Tunneling
Image

Local SSH Tunneling 방법을 이용하는 경우 로컬 네트워크에서 내가 사용하는 컴퓨터에서 외부망의 SSH 서버에 접속한다. 그리고 내가 사용하는 컴퓨터의 "특정포트"를 Open(Listen)하여 localhost:특정포트를 이용하여 SSH 포트를 타고 데이터가 외부망의 서버로 전달이 되며 외부망의 서버에서 복호화(Decryption)되어 원래의 목적지(telnet, 또는 ftp)에 접속이 가능해진다.
로컬 네트워크의 내가 사용하는 컴퓨터에서는 "특정포트"에 접속을 하지만 데이터가 SSH 터널을 타고 외부망서버를 거쳐 가기 때문에 방화벽에서는 22번 포트의 데이터만 인식하게 된다.

Code:
    SSH -L 1080:rain9.com:21 ssh-server.com
    접속이 되면 놔두고 새로운 콘솔창을 띄워서
    ftp localhost 1080


내 컴퓨터에 1080 포트를 Open(Listen)하고 ssh-server.com의 22번 포트로 접속을 한다.(따로 포트를 지정안했기 때문에 default ssh port인 22번으로 접속)
ssh-server.com 서버쪽에서는 1080 포트를 통하여 ssh 터널을 지나 데이터가 온 경우 rain9.com의 21번 포트로 연결시켜주게 된다.


2. Remote SSH Tunneling

리모트 SSH 터널링 방법의 경우 로컬 내트워크의 내가 사용하는 컴퓨터의 특정포트를 Open(Listen)하는 것이 아니라 외부망의 SSH 서버에 "특정포트"를 Open(Listen)하게 된다.
SSH나 원격과 같은 방법으로 외부망에 접속한 후 외부망 서버에서 Open(Listen)한 "특정포트"를 사용하면 원래의 목적지(telnet, 또는 ftp)에 접속이 가능해진다.

Code:
    SSH -R 1090:rain9.com:21 ssh-server.com
    접속이 되면 그 상태로
    ftp localhost 1090


ssh- server.com의 22번 포트로 접속하여 ssh-server.com 서버에서 1090 포트를 Open(Listen)하고(그러나 Dafault로 127.0.0.1인 looopback 주소로만 열린다.) 서버에 접속한 상태로 ftp 127.0.0.1 1090 로 접속하면 rain9.com의 21번 포트로 접속이되어진다.

Code:
    GatewayPorts yes


만일 ssh-server.com의 sshd_config 설정에 위 내용이 추가 되어 있다면, 127.0.0.1이 아닌 0.0.0.0 주소로 Listen하기 때문에 외부에서도 사용이 가능해진다.
예를 들면 내 컴퓨터나, 또다른 컴퓨터에서

Code:
    ftp ssh-server.com 1090


로 접속하게 되면 rain9.com:21으로 Forwarding되어 접속이 가능해진다.


3. Dynamic SSH
다 이나믹 SSH 터널링은 SOCKS 프로코콜을 이용하여 ssh 터널을 생성한다. SSH Tunneling에서 많이 사용되는 방법이다. 리모트나 로컬처럼 특정 대상이 필요한 것이 아니므로 메신져 우회나 차단된 웹사이트 우회 접속 등 범용적인 사용에 유리하므로 특수 목적이 아닌 이상 가장 쓸모가 있다.

Quote:
SOCKS는 SOCKS 서버의 반대쪽에 있는 호스트의 연결 요청을 재지정하여 직접적인 IP 접근 없이 한쪽의 호스트가 다른 쪽의 호스트에 완전하게 액세스할 수 있도록 하는 네트워킹 프록시 프로토콜입니다. SOCKS는 권한 없는 사용자가 인터넷을 통해 내부 호스트에 액세스하는 것은 방지하면서도 SOCKS 서버 뒤의 호스트가 인터넷에 완전하게 액세스할 수 있도록 하는 네트워크 방화벽으로 널리 사용됩니다.

SOCKS 서버는 지점 간 기반으로 방화벽을 통해 액세스를 제어하는 일반적인 방화벽 데몬입니다. SOCKS 서버는 요청을 인증 및 승인하고, 프록시 연결을 수립하고, 데이터를 중계합니다. SOCKS 서버는 응용 프로그램 수준이 아닌 네트워크 수준에서 작동하므로 요청 전송에 사용되는 프로토콜이나 방법에 대해 알지 못합니다. SOCKS 서버가 프로토콜을 알지 못하므로 Proxy Server가 지원하지 않는 Telnet과 같은 프로토콜을 전달하는 데 사용될 수 있습니다.

Sun Java System Web Proxy Server 4 .0.1 관리 설명서 15장http://docs.sun.com/source/819-3161/agsocks.html의 일부 내용임.


어플리케이션 계층이 아닌 네트워크 계층이라 HTTP Proxy Server처럼 제한적이지 않으므로 유용하다. 그러므로 HTTP나 메신져, IRC 등과 같이 어플리케이션 계층의 프로토콜이나 프로그램에서 범용적으로 사용이 가능한 것이다.
사용 방법은 아래와 같다.

Code:
    SSH -D 1080 ssh-server.com


내컴퓨터의 SOCKS 방식의 1080 포트를 오픈하고 ssh-server.com으로 접속한다. 프로그램에서 프록시 설정에서 SOCKS 방식을 선택하고 localhost를 적어주고 포트 1080을 적어주면 ssh-server.com의 ip로 웹서핑이나 메신져 사용이 가능해진다.

윈도우에서 putty를 이용하여 Dynamic SSH Tunnel을 만들어 사용하는 글 을 예전에 포스팅한 적이 있다.(사실은 거의 메모 수준)

아래 플래시 동영상은 리눅스와 리눅스에서 dynamic ssh tunneling을 이용하는 방법이다. 출처는 동영상에도 나와 있듯이 http://www.irongeek.com이다.
다운로드http://www.rain9.com/tc/attachment/2041853015.swf



참조 사이트
Debian Administration : http://www.debian-administration.org/ar ... with_SOCKS
KLDP WiKi - OpenSshTunneling : http://wiki.kldp.org/wiki.php/OpenSshTunneling 
irongeek.com : http://www.irongeek.com/i.php?page=vide ... forwarding 
SSH Tunneling 사용하기 - 「한빛 네트워크 기사 공모전」 가작: 이호재 : http://network.hanb.co.kr/print.php?bi_id=547 


추가적으로
프로그램(어플리케이션)에서 소켓프록시를 설정할 수 있도록 지원하는 경우도 있지만, 그렇지 않은 경우도 존재한다. 이럴 때에는 TSOCKS 나 Virtual Tunnel , Dante 를 이용할 수도 있다.

실제로 테스트 해본 것은 TSOCKS인데 사용법은 매우 간단하다.
우분투의 경우

Code:
    sudo apt-get install tsocks
    sudo vi /etc/tsocks.conf

모든 라인을 다 지우거나 주석처리하고, 아래 두라인만 설정한다.

Code:
        server = 127.0.0.1
        server_port = 1080


그 후

Code:
    ssh -L 1080:rain9.com:21 ssh-server.com
    tsocks 대상프로그램


과 같은 방법으로 적용하면 된다. 제대로 적용이 됐는지 확인할려면 자신의 ip를 확인하여주는 사이트에 접속하여 보면 rain9.com의 ip가 찍히는 것을 확인할 수 있다. 본인은http://www.rain9.com/ip.php 와 같은 것을 만들어 놓고 ip 확인에 사용하고 있다.

관련 URL
http://www.plenz.com/tunnel-everything 
http://www.linux.com/archive/feature/54894

'Linux' 카테고리의 다른 글

리눅스 거버너  (0) 2012.10.09
proxy server 간단 설정 - squid3  (0) 2012.09.13
sync server ssh로 연결 해서 ubuntu update 하기  (0) 2012.09.13
HDD 4 KIB SECTOR ISSUE  (0) 2012.08.29
ubuntu HDD 추가 하기  (0) 2012.08.29