본문 바로가기
IT 기타

[SSH] TUNNELING

by dan.de.lion 2017. 12. 5.

[SSH] TUNNELING


SSH TUNNELING(also called SSH port forwarding)

테스트 환경

OS : RHEL Server release 7.4 (Maipo)
SSH Server: OpenSSH_7.4p1
SSH Client: OpenSSH_7.4p1 / Windows 10 - Xmanager Enterprise 4

SSH


  • SSH(Secure SHell)는 암호화 및 인증 기술을 이용하여 안전하게 원격 컴퓨터와 통신 하기위한 프로토콜이다.
    비밀번호 등의 인증 부분을 포함한 모든 네트워크에서의 통신이 암호화된다.

SSH TUNNELING


  • 일명 SSH TUNNELINGSSH port forwarding으로 Port Forwarding의 한 종류이다.
  • Port Forwarding이란, PortForward 해주는 기능이다. (?)
  • 다시 말해, 서버 간의 통신에서 한 서버(서버 A)의 특정 Port로 전송되는 메시지를 다른 서버(서버 B)의 특정 PortForwarding(전달) 해주는 기능이다.
  • 예를 들어, 서버 A의 8080 포트를 서버 B의 80 포트로 Forwarding 하면, A:8080으로의 접속은 실제 B:80으로 이루어지게 된다.
  • 이러한 Port Forwarding을 SSH를 이용하여 구현한 것이 SSH port forwarding(a.k.a SSH TUNNELING)이다.
  • 즉, SSH TUNNELINGSSH로 암호화된 Port Forwarding을 의미한다.
  • SSH TUNNELING 이라 부르는 이유는 아래의 설정으로 미리 맺어진 서버간의 SSH 연결TUNNEL처럼 이용하여 메시지를 주고받기 때문이다.

테스트


  • UNIX 계열의 경우, OpenSSH를 이용한 CLI 기반의 공통된 명령어로 사용할 수 있다.
  • Windows의 경우, 각 SSH 클라이언트 프로그램에 따라 설정이 다를 수 있다.
    (본 테스트는 Xmanager Enterprise 4를 이용했다.)

Port Forwarding 방식


  • SSH TUNNELING은 크게 다음과 같은 두 가지 방식의 Port Forwarding을 제공한다.
  1. Local Port Forwarding : Local(Client) 호스트의 지정된 TCP 포트 대한 연결을 Remote(Server) 호스트의 포트로 전달하는 방식이다.
  2. Remote Port Forwarding : Remote(Server) 호스트의 지정된 TCP 포트 대한 연결을 Local(Client) 호스트의 포트로 전달하는 방식이다.

UNIX 계열


  • CLI를 이용하는 경우, Local Port Forwarding-L 옵션, Remote Port Forwarding-R 옵션을 이용하여 사용할 수 있다.
#Local Port Forwarding
ssh -L [bind_address:]port:host:hostport [user@]hostname|IP
#Remote Port Forwarding
ssh -R [bind_address:]port:host:hostport [user@]hostname|IP
Local Port Forwarding

  • Local Port Forwarding에서의 [bind_address:]port는 SSH Client 기준으로 작성한다.

  • 또한, host:hostport는 SSH Server 기준으로 작성한다.

  • 다음은 Local Port Forwarding을 통한 원격지 Tibero 접속 테스트다.

  • SSH Client 서버의 10.xxx.xxx.187:58629 포트를 SSH Server(10.xxx.xxx.186)가 172.xxx.xxx.3 서버의 8629 포트로 전달한다.

  1. SSH Client 서버에서 Local Port Forwarding을 설정한다.
    (해당 연결은 테스트를 완료할 때까지 유지한다.)
$ ssh -L 10.xxx.xxx.187:58629:172.xxx.xxx.3:8629 tibero@10.xxx.xxx.186
tibero@10.xxx.xxx.186's password:
Last login: Tue Nov 28 09:38:24 2017
$
  1. SSH Client에 접속하여 포트 상태를 확인한다.
$ netstat -nap | grep 58629
tcp        0      0 10.xxx.xxx.187:58629      0.0.0.0:*               LISTEN      4739/ssh
$
  1. Tibero 접속정보(10.xxx.xxx.187:58629) 설정 후 접속한다.
    (Tibero 접속정보 설정은 생략한다.)
$ tbsql sys/tibero@ssh_tunnel

tbSQL 6

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Connected to Tibero using ssh_tunnel.

SQL>
  1. Tibero에 접속하여 서버 정보 및 세션 정보를 확인한다.
SQL> COL DB_NAME FOR A10
SQL> COL HOST_NAME FOR A15
SQL> SELECT DB_NAME, HOST_NAME FROM V$INSTANCE ;

DB_NAME    HOST_NAME
---------- ---------------
tibero     docker

1 row selected.

SQL> COL IPADDR FOR A13
SQL> COL OSUSER FOR A10
SQL> COL MACHINE FOR A10
SQL> SELECT IPADDR, OSUSER, MACHINE
       FROM V$SESSION
      WHERE SID = (SELECT TID FROM VT_MYTID) ;

IPADDR        OSUSER     MACHINE
------------- ---------- ----------
172.xxx.xxx.1 tibero     ssh_client

1 row selected.

SQL>
Remote Port Forwarding

  • Remote Port Forwarding에서의 [bind_address:]port는 SSH Server 기준으로 작성한다.

  • 또한, host:hostport는 SSH Client 기준으로 작성한다.

  • 다음은 Remote Port Forwarding을 통한 원격지 Tibero 접속 테스트다.

  • SSH Server 서버의 58629 포트를 SSH Client 서버의 localhost:9268 포트로 전달한다.

  1. SSH Client 서버에서 Remote Port Forwarding을 설정한다.
    (해당 연결은 테스트를 완료할 때까지 유지한다.)
$ ssh -R 58629:localhost:9268 tibero@10.xxx.xxx.186
tibero@10.xxx.xxx.186's password:
Last login: Tue Nov 28 09:38:24 2017
$
  1. SSH Server에 접속하여 포트 상태를 확인한다.
$ netstat -nap | grep 58629
tcp        0      0 127.0.0.1:58629         0.0.0.0:*               LISTEN      19509/sshd:
tcp6       0      0 ::1:58629               :::*                    LISTEN      19509/sshd:
  1. Tibero 접속정보(127.0.0.1:58629) 설정 후 접속한다.
    (Tibero 접속정보 설정은 생략한다.)
$ tbsql sys/tibero@ssh_tunnel

tbSQL 6

TmaxData Corporation Copyright (c) 2008-. All rights reserved.

Connected to Tibero using ssh_tunnel.

SQL>
  1. Tibero에 접속하여 서버 정보 및 세션 정보를 확인한다.
SQL> COL DB_NAME FOR A10
SQL> COL HOST_NAME FOR A15
SQL> SELECT DB_NAME, HOST_NAME FROM V$INSTANCE ;

DB_NAME    HOST_NAME
---------- ---------------
tibero     ssh_client

1 row selected.

SQL> COL IPADDR FOR A10
SQL> COL OSUSER FOR A10
SQL> COL MACHINE FOR A10
SQL> SELECT IPADDR, OSUSER, MACHINE
       FROM V$SESSION
      WHERE SID = (SELECT TID FROM VT_MYTID) ;

IPADDR     OSUSER     MACHINE
---------- ---------- ----------
127.0.0.1  tibero     ssh_server

1 row selected.

SQL>
추가1

  • Remote Port Forwarding을 할 때, Remote Server의 특정 IP를 지정하는 경우 아래와 같은 작업이 추가로 필요하다.
    (root 계정에서 진행한다.)
  • /etc/ssh/sshd_config에서 SSH 데몬(sshd)의 설정을 변경한다.
$ vi /etc/ssh/sshd_config
  • GatewayPorts clientspecified 설정을 추가한다.
(전략)
#AllowTcpForwarding yes
#GatewayPorts no
GatewayPorts clientspecified #ADD
X11Forwarding yes
#X11DisplayOffset 10
(후략)
  • 설정 정보를 반영한다.
$ systemctl reload sshd
  • Remote Server의 특정 IP(172.xxx.xxx.1)를 지정하여 Remote Port Forwarding을 수행한다.
$ ssh -R 172.xxx.xxx.1:9268:localhost:9268 tibero@10.xxx.xxx.186
tibero@10.xxx.xxx.186's password:
Last login: Tue Nov 28 14:59:02 2017 from 10.xxx.xxx.187

$ netstat -nap | grep 9268
tcp        0      0 172.xxx.xxx.1:9268         0.0.0.0:*               LISTEN      -
추가2

  • 추가로 한번에 여러개의 Port Forwarding을 수행할 수도 있다.
$ ssh -L 50001:172.xxx.xxx.3:8629 -L 50002:172.xxx.xxx.3:8630 -R 172.xxx.xxx.1:9268:localhost:9268 -R 172.xxx.xxx.1:9269:localhost:9269 tibero@10.xxx.xxx.186
tibero@10.xxx.xxx.186's password:
Last login: Tue Nov 28 14:59:02 2017 from 10.xxx.xxx.187

$ netstat -nap | egrep "9268|9269"
tcp        0      0 172.xxx.xxx.1:9268         0.0.0.0:*               LISTEN      -
tcp        0      0 172.xxx.xxx.1:9269         0.0.0.0:*               LISTEN      -
  • SSH Client에서도 포트 상태를 확인한다.
$ netstat -nap | egrep "50001|50002"
tcp        0      0 127.0.0.1:50001         0.0.0.0:*               LISTEN      17652/ssh
tcp        0      0 127.0.0.1:50002         0.0.0.0:*               LISTEN      17652/ssh
tcp6       0      0 ::1:50001               :::*                    LISTEN      17652/ssh
tcp6       0      0 ::1:50002               :::*                    LISTEN      17652/ssh

Windows


  • Windows는 각 SSH 클라이언트 프로그램에 따라 설정 방법이 다르나 대부분 LocalRemote 설정이 같이 있다.
  • 본 테스트는 Xshell을 이용한다.
  • SSH TUNNEL을 이용한 연결 테스트는 생략한다.
  • SSH 클라이언트 프로그램의 경우, 새로운 연결을 생성하거나 기존 연결을 수정하여 SSH TUNNELING을 사용할 수 있다.
  1. 새로운 연결을 생성하는 경우는 다음과 같다.

    1. Xshell을 실행 후 새로 만들기를 선택한다.
    2. 연결 정보를 작성하고 왼쪽의 연결 $\rightarrow$ SSH $\rightarrow$ 터널링을 선택한다.
  2. 기존 연결정보를 수정하는 경우는 다음과 같다.

    1. Xshell을 실행 후 열기를 선택한다.
    2. 수정할 연결정보를 선택한 후 등록 정보를 선택한다.
    3. 왼쪽의 연결 $\rightarrow$ SSH $\rightarrow$ 터널링을 선택한다.
  3. 터널링 관련 설정을 수행한다.

    1. 추가를 선택한다.
    2. Local Port Forwarding 정보를 입력하고 확인을 누른다.
    3. 등록된 정보를 확인하고 추가를 선택한다.
    4. Local (로컬에서 리모트로)를 선택하여 Remote (리모트에서 로컬로)를 선택한다.

    5. Remote Port Forwarding 정보를 입력하고 확인을 누른다.
    6. 설정된 정보를 확인하고 확인을 누른다.
    7. 변경된 정보로 접속한다.
  4. SSH Client 서버(Windows)에서 포트 상태를 확인한다.

CMD> tasklist | findstr "Xshell"
Xshell.exe                   24560 Console                    6     37,252 K

CMD> netstat -nao | findstr "24560"
  TCP    0.0.0.0:50001          0.0.0.0:0              LISTENING       24560
  TCP    192.xxx.xxx.49:14712   192.xxx.xxx.186:22     ESTABLISHED     24560
  1. SSH Server 서버에서 포트 상태를 확인한다.

    실제 Remote 설정은 특정 IP(172.xxx.xxx.1)를 지정하였으나 아래 내용을 보면 0.0.0.0:50001 포트로 설정되었다.
    아마도 Xshell의 문제로 보인다.

$ netstat -nap | grep ssh
tcp        0      0 0.0.0.0:50001           0.0.0.0:*               LISTEN      39205/sshd:
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6028/sshd
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      39205/sshd:
tcp        0    404 192.xxx.xxx.186:22      192.xxx.xxx.49:14712    ESTABLISHED 39205/sshd:
tcp6       0      0 :::22                   :::*                    LISTEN      6028/sshd
tcp6       0      0 ::1:6010                :::*                    LISTEN      39205/sshd:
unix  3      [ ]         STREAM     CONNECTED     54124    6028/sshd
unix  2      [ ]         DGRAM                    317587864 39205/sshd:

여담


우연한 계기로 SSH TUNNELING을 접하여 정리하게 되었다.
내용은 간단한데 생각보다 시간이 좀 걸렸다.
기회가 된다면 다른 방식의 Port Forwarding도 소개할 예정이다.

참조


SSH TUNNEL
SSH PORT FORWARDING EXAMPLE
SSH Tunnel - Local and Remote Port Forwarding Explained With Examples

댓글