[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 TUNNELING은
SSH port forwarding
으로Port Forwarding
의 한 종류이다. Port Forwarding
이란,Port
를Forward
해주는 기능이다. (?)- 다시 말해, 서버 간의 통신에서 한 서버(서버
A
)의 특정Port
로 전송되는 메시지를 다른 서버(서버B
)의 특정Port
로Forwarding
(전달) 해주는 기능이다. - 예를 들어, 서버
A
의 8080 포트를 서버B
의 80 포트로Forwarding
하면,A:8080
으로의 접속은 실제B:80
으로 이루어지게 된다. - 이러한
Port Forwarding
을 SSH를 이용하여 구현한 것이SSH port forwarding
(a.k.aSSH TUNNELING
)이다. - 즉,
SSH TUNNELING
은SSH
로 암호화된Port Forwarding
을 의미한다. SSH TUNNELING
이라 부르는 이유는 아래의 설정으로 미리 맺어진 서버간의SSH 연결
을TUNNEL
처럼 이용하여 메시지를 주고받기 때문이다.
테스트
- UNIX 계열의 경우,
OpenSSH
를 이용한 CLI 기반의 공통된 명령어로 사용할 수 있다. - Windows의 경우, 각 SSH 클라이언트 프로그램에 따라 설정이 다를 수 있다.
(본 테스트는Xmanager Enterprise 4
를 이용했다.)
Port Forwarding 방식
SSH TUNNELING
은 크게 다음과 같은 두 가지 방식의Port Forwarding
을 제공한다.
- Local Port Forwarding : Local(
Client
) 호스트의 지정된 TCP 포트 대한 연결을 Remote(Server
) 호스트의 포트로 전달하는 방식이다. - 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
포트로 전달한다.
- 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
$
- SSH Client에 접속하여 포트 상태를 확인한다.
$ netstat -nap | grep 58629
tcp 0 0 10.xxx.xxx.187:58629 0.0.0.0:* LISTEN 4739/ssh
$
- 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>
- 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
포트로 전달한다.
- 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
$
- 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:
- 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>
- 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 클라이언트 프로그램에 따라 설정 방법이 다르나 대부분Local
과Remote
설정이 같이 있다.- 본 테스트는
Xshell
을 이용한다. SSH TUNNEL
을 이용한 연결 테스트는 생략한다.- SSH 클라이언트 프로그램의 경우, 새로운 연결을 생성하거나 기존 연결을 수정하여
SSH TUNNELING
을 사용할 수 있다.
- 새로운 연결을 생성하는 경우는 다음과 같다.
Xshell
을 실행 후새로 만들기
를 선택한다.
- 연결 정보를 작성하고 왼쪽의
연결
$\rightarrow$SSH
$\rightarrow$터널링
을 선택한다.
- 기존 연결정보를 수정하는 경우는 다음과 같다.
Xshell
을 실행 후열기
를 선택한다.
- 수정할 연결정보를 선택한 후
등록 정보
를 선택한다.
- 왼쪽의
연결
$\rightarrow$SSH
$\rightarrow$터널링
을 선택한다.
- 터널링 관련 설정을 수행한다.
추가
를 선택한다.
Local Port Forwarding
정보를 입력하고확인
을 누른다.
- 등록된 정보를 확인하고
추가
를 선택한다.
Local (로컬에서 리모트로)
를 선택하여Remote (리모트에서 로컬로)
를 선택한다.
Remote Port Forwarding
정보를 입력하고확인
을 누른다.
- 설정된 정보를 확인하고
확인
을 누른다.
- 변경된 정보로 접속한다.
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
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
댓글