SSH를 사용한 터널링, Socks5 프락시 서버 만드는 방법

Apr 23, 2017

윈도에서는 SecureCRT, Putty를 사용해서 터널링 기능을 사용했고, OSX, 리눅스에서는 기본적으로 ssh가 있어서 ssh로 터널링 기능을 가끔 사용했다.

작업하는 플랫폼에 따라서 통일되지 않아서 윈도에서 Cygwin을 설치해서 ssh를 사용하기로 했다. 즉, 터널링 기능은 ssh를 통해서만 하기로 했다.

이제 ssh를 사용한 터널링에 대해서 알아보겠다.

SOCKS5 프락시 만들기

한 서버에 접속하고, SOCKS5로 1080 포트를 여는 예제이다. 웹브라우저에서도 이 포트를 통해 웹브라우징이 가능하다.

ssh -D 1080 -f -C -q -N user_id@server_address

프락시 서버를 통해 제3의 서버 접속

위에서 만든 프락시를 사용해서 또 다른 서버로 접속하는 방법이다.

ssh -o "ProxyCommand nc -X 5 -x localhost:1080 %h %p"  user_id@server_address

PC, A 서버, B 서버가 있다고 가정한다. PC에서 B 서버로 직접 접속이 막혀있을 때, A 서버를 프락시로 만들어 위의 커맨드로 PC에서 B 서버로 접속이 가능한 것이다.

포트 포워딩

Local 포트 포워딩

외부로 공개되지 않은 포트에 접속하는 방법이다.

다음은 GUI 도구에서 서버의 MySQL에 접속할 때 사용하는 예제다.

ssh -L localhost:3306:localhost:3306 user_id@server_address

중계 서버를 통해 다른 서버의 포트를 포워딩할 수도 있다.

ssh -L localhost:3306:another_server_address:3306 user_id@server_address

Remote 포트 포워딩

PC에 있는 포트를 원격 포트에서 사용할 때 사용하는 방법이다.

다음은 원격 서버에서 PC에 있는 MySQL에 접근하기 위한 명령이다.

# 리모트 포워딩
ssh -R 127.0.0.1:3306:127.0.0.1:3306 user_id@server_address

SSH 설정 파일 사용하기

위에서 설명한 명령을 매번 입력하기 어렵기 때문에 자주 사용하는 경우는 설정 파일을 사용하는 것이 좋다.

설정 파일 도움말:

man ssh_config

다음과 같이 설정할 수 있다.

Host Socks5Example
    HostName server_address
    Port 22
    user user_id
    DynamicForward 1080

Host ProxyExample
    HostName server_address
    Port 22
    User user_id
    ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p

Host LocalForwardExample
    HostName server_address
    Port 22
    User user_id
    LocalForward 127.0.0.1:3306 127.0.0.1:3306

Host RemoteForwardExample
    HostName server_address
    Port 22
    User user_id
    RemoteForward 127.0.0.1:3306 127.0.0.1:3306