공개 서버의 SSH 포트 포워드 기능을 사용하여 백엔드 PC와 통신(TCP, UDP)한다.

개요



자신이 공개하고 있는 서버에서 SSH 서비스가 움직이고 있을 때, SSH의 포트 포워드 기능을 사용하면 그 서버의 뒤에 있는 PC와 통신할 수 있다.
가능한 한 추가로 설치하지 않아도 된다.

가정 네트워크



DMZ상의 공개 서버에서 SSH 서비스가 움직이고 있고, 그 백엔드의 네트워크에 PC나 서버가 존재하고 있다고 상정한다.

개념도
     [clientA(Linux)]   [clientB(Windows)]
     (192.168.22.5)    (192.168.22.100)
            |                    |
            +--------------------+
            |
            |
     (192.168.22.200)
    [SSH server(Linux)]
            |
            +----------------+
            |                |
          [PC]            [server]
    (192.168.111.100)  (192.168.111.200)

TCP 통신


clientA(Linux)에서 SSH server(Linux)로 SSH 포트 포워드를 설정합니다.

동적 포트 포워드 (SOCKS5 프록시) 사용



SSH의 동적 포트 포워드 설정



clientA(Linux)
# ssh -D 192.168.22.5:9150 -f -N [email protected]
[email protected]'s password:
#

proxychains 설정



/etc/proxychains.conf를 아래와 같이 편집한다.

clientA(Linux)
# vi /etc/proxychains.conf

------------------------
(/etc/proxychains.confを下記の内容で編集)
# Quiet mode (no output from library)
quiet_mode

(snip)

[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks5  192.168.22.5 9150

백엔드 PC(192.168.111.100)에 RDP 연결해 보기



clientA(Linux)
# proxychains xfreerdp /v:192.168.111.100 /u:**** /p:****
ProxyChains-3.1 (http://proxychains.sf.net)
[10:47:00:753] [6624:6625] [INFO][com.freerdp.client.common.cmdline] - loading channelEx cliprdr
[10:47:00:907] [6624:6625] [INFO][com.freerdp.gdi] - Local framebuffer format  PIXEL_FORMAT_BGRX32
[10:47:00:907] [6624:6625] [INFO][com.freerdp.gdi] - Remote framebuffer format PIXEL_FORMAT_RGB16
[10:47:00:987] [6624:6625] [INFO][com.winpr.clipboard] - initialized POSIX local file subsystem



로컬 포트 ​​포워드 사용



clientB(Windows)의 「원격 데스크탑 접속」을 사용해 백엔드의 PC(192.168.111.100)에 RDP 접속할 때에 사용할 수 있다.

SSH의 로컬 포트 ​​포워드 설정



clientA(Linux)
# ssh -L 192.168.22.5:3389:192.168.111.100:3389 [email protected]

clientB(Windows)에서 clientA(Linux)를 통해 백엔드 PC(192.168.111.100)에 RDP 연결해 봅니다.







UDP 통신



로컬 포트 ​​포워드 설정과 netcat relay를 결합합니다.clientA(Linux)SSH server(Linux) 모두에서 조작해야합니다.
이번은 백엔드에 있는 server(192.168.111.200)와 UDP/161(snmp) 통신을 실시한다.
덧붙여서 UDP는 통신이 끊기기 쉽고, 매번 포워드를 재설정할 필요가 있었다.

SSH 서버 (Linux) 측 설정



조작 사용자에게 루트 권한이 필요하지 않습니다.

netcat relay에 대한 FIFO를 만듭니다.



SSHserver(Linux)
$ mkfifo /tmp/pipe

netcat relay를 설정합니다.



UDP 통신을 포워드하고 싶은 IP와 포트(이번에는 192.168.111.200:161)를 지정한다.
  • SSH 서버에서는 TCP/31337에서 통신을 기다린다. 대기 포트가 TCP이므로주의.
  • UDP 통신의 포워드처(192.168.111.200)로부터의 출력을/tmp/pipe에 흘려 넣어 그것을 자신의 TCP/31337에 돌려주는 이미지.

  • SSHserver(Linux)
    $ nc -l -p 31337 < /tmp/pipe | nc -u 192.168.111.200 161 > /tmp/pipe
    

    clientA (Linux) 측 설정



    SSH의 로컬 포트 ​​포워드 설정



    clientA(Linux)
    # ssh -L 1337:localhost:31337 [email protected]
    

    netcat relay에 대한 FIFO를 만듭니다.



    clientA(Linux)
    # mkfifo /tmp/pipe
    

    netcat relay를 설정합니다.


  • clientA(Linux)에서는 UDP/161(snmp)로 통신을 기다린다.
  • 자신의 TCP/1337의 출력을/tmp/pipe에 흘려 보내고 그것을 자신의 UDP/161에 돌려주는 이미지.

  • clientA(Linux)
    # nc -l -u -p 161 < /tmp/pipe | nc localhost 1337 > /tmp/pipe
    

    snmpwalk 해보자.



    백엔드의 server(192.168.111.200)에 대해서 UDP/161로 통신해, 정보를 취득할 수 있었다.

    clientA(Linux)
    # snmpwalk localhost -c public -v2c
    
    iso.3.6.1.2.1.1.1.0 = STRING: "Linux fileserver 4.8.0-36-generic #36~16.04.1-Ubuntu SMP Sun Feb 5 09:39:57 UTC 2017 x86_64"
    iso.3.6.1.2.1.1.2.0 = OID: iso.3.6.1.4.1.8072.3.2.10
    iso.3.6.1.2.1.1.3.0 = Timeticks: (238794) 0:39:47.94
    iso.3.6.1.2.1.1.4.0 = STRING: "Me <[email protected]>"
    iso.3.6.1.2.1.1.5.0 = STRING: "fileserver"
    iso.3.6.1.2.1.1.6.0 = STRING: "Sitting on the Dock of the Bay"
    iso.3.6.1.2.1.1.7.0 = INTEGER: 72
    (snip)
    

    좋은 웹페이지 즐겨찾기