VNC Reverse Connection을 이용하여 원격으로 PC를 사용하자.

aero의 이미지

VNC Reverse Connection을 이용하여 원격으로 PC를 사용하자.

작성자:aero
작성일:2003/11/28

근래 자신의 PC를 어디서든지 사용할 수 있는 서비스들이 개발되고 있다.
GotoMyPC가 대표적인 서비스로 자신의 PC에 프로그램을 설치해놓고
어디서든지 GotoMyPC사이트에 접속을 하면 JAVA기반의 클라이언트로
자신의 PC에 접속하여 쓸 수 있는것이다. 이 서비스의 대략적인 구조는

자신의 PC ------- GotoMyPC 서버 --- 웹페이지 JAVA클라이언트

와 같으며 PC에 설치된 프로그램이 일정시간 간격으로 GotoMyPC서버에
http ping을 보낸다 이때 사용자가 GotoMyPC 서버에 로그인한 상태면
GotoMyPC서버는 Proxy역할을 하면서 양쪽간에 중계를 해서 리모트로
PC를 사용할 수 있게 되는것이다.
하지만 이러한 서비스는 유료로 운영되므로 공짜를 좋아하는 사람들에게
는 맞지않다. :)

그래서 공짜라면 양잿물도 마신다는 정신으로 기존의 VNC같은 프로그램으로
비슷한 기능을 구현 할 수 없을까 고민하다가 꽁수를 써서 이와 비슷하게
하는 방법을 구현해봤다.

여기서는 TightVNC라는 VNC의 라이트버젼을 사용한다.
오리지날 VNC는 모르겠는데 TightVNC 최근 버젼은 Reverse Connection이란걸
지원한다. 이것이 무엇이냐면 기존의 VNC의 작동 방식은 VNC서버가 있고
vncviewer라는 client로 서버에 접속하는 방식인데 반해 Reverse Connection은
서버가 클라이언트로 접속하는 방식이다.

이게 어떤때 유용하냐면 서버PC가 사설ip를 쓰거나 방화벽 내부에 있다면
client는 서버에 접속할 수 없다. 이럴때 역으로 server가 client쪽으로 접속
하게 하면 된다는것이다. 단 이때 client는 real ip를 가지고 있어야 한다.

양쪽다 방화벽내부나 사설ip를 가진다면 GotoMyPC 서비스같이 real ip를 가진
중계 Proxy서버가 없으면 불가능하다.

여기에서 말하고자 하는 방법도 위와 같은 제약이 적용되어 client는 real ip
를 가진 상태이어야 된다. 그리고 windows 운영체제를 대상으로 한다.

우선 http://www.tightvnc.com/ 싸이트에가서 tightvnc를 다운 받아서 설치한다.
설치된 디렉토리에 가면 winvnc.exe, vncviewer.exe ,VNCHooks.dll 같은 파일이
보일것이다 실제로 필요한 파일은 이 3개이다. vncviewer는 독립적으로 돌아가나
winvnc는 VNCHooks.dll이 필요하다.

서버측 vnc가 설치된 디렉토리에 다음과 같은 VBscript파일을 작성한다.

dispatcher.vbs 라는 파일의 내용을 다음과 같이 작성한다.

'접속할 ip가 있는 페이지의 URL
url="http://www.somewhere.net/vnc.txt"
'채크할 초 간격
delay=10

Set http = CreateObject("WinHttp.WinHttprequest.5")
Set sh = CreateObject("WScript.Shell")

Do While True
    target = getURL(url)
    If IsValidIPAddress(target) Then
	Set cmd = sh.exec ("%COMSPEC% /C winvnc -connect " & target )
	Do While cmd.Status=0
	    WScript.Sleep 50
	Loop 
	Set cmd = Nothing
	
	Set cmd = sh.exec("%COMSPEC% /C netstat -an | findstr "&target&":5500 | findstr ESTABLISHED")
	Do While cmd.Status=0
	    WScript.Sleep 50
	Loop
	If Not cmd.StdOut.AtEndOfStream Then
	    WScript.Echo "접속 되어있습니다. 나중에 다시접속하려면 작업을 마치고 끊기직전에 확인을 눌러 이 창을 닫으세요. 종료하면 30초 후 부터 다시 접속시도를 합니다."
	    WScript.Sleep 30*1000
	End If
	Set cmd = Nothing
    End If
    WScript.Sleep delay*1000
Loop

Function getURL(url)

    Dim re, matches
    
    http.Open "GET", url, False
    http.Send
    getURL = http.ResponseText
    Set re = New RegExp
    re.Pattern = "([\w\.]+)"
    Set matches = re.Execute(getURL)
    getURL = matches.Item(0)

End Function 

Function IsValidIPAddress(IPAddress)
    Dim IPArray
    Dim Count
    IsValidIPAddress = False
    IPArray = Split(IPAddress,".")
    If UBound(IPArray) <> 3 Then Exit Function
    For Count = 0 To Ubound(IPArray)
	If Not IsNumeric(IpArray(Count)) Then Exit Function
	If (IpArray(Count)) > 255 Then Exit Function
    Next 'Count
    IsValidIPAddress = True
End Function

우선 서버가 될 자신의 PC에서 winvnc.exe(서버)를 실행한다. 그러면 tray에
V모양의 아이콘이 생기면서 vnc server가 뜬 상태가 된다. 마우스로 그 아이콘
을 클릭하면 접속 password등등을 설정할 수 있다.
여기서 하고자하는 server -> client reverse connection에서는 password입력
필요없이 접속이 가능하다.

이제 위에서 작성한 dispatcher.vbs 스크립트를 실행시킨다.
(주의: winvnc.exe 서버가 스크립트를 실행시키기전에 먼저 실행되어있는지를 확인)
만약에 Set http = CreateObject("WinHttp.WinHttprequest.5") 줄에서
에러가나면 .5로 된부분을 5.1로 바꾸어 보시길~

그러면 스크립트는 delay에 지정된 초간격으로 url에 지정된 페이지를
긁어와서 그내용이 유효한 ip 이면 winvnc -connect [target ip] 명령으로 접속을 시도한다음, netstat 명령 결과를 추출하여 지정한 ip 의5500포트(vncviewer가 listen하는포트)로 연결이 되어있으면 정삭적인 접속이 되었다고 판단하고 연결이 이루어진 상태에서 확인 창을 띄우고 루프를 중지하게 된다.

이렇게 자신만의 url을 지정해서 해당 페이지 내용에 자기가 현재 위치한
client PC의 ip를 넣어놓기만 하면 server측에서 접속을 해오게되는것이다.
(이처럼 자기가 지정한 페이지를 올릴수 있는 홈페이지가 있어야 한다.)

실제로 서버에 접속할 클라이언트 컴퓨터에서는 vncviewer.exe 만 있으면 된다.
클라이언트 컴퓨터에서는 명령행창에서 vncviewer.exe /listen 이라고 실행을
한다. 그러면 마찬가지로 tray에 V자 모양이 아이콘이 생성되고 client가
서버측 접속을 listen하는 모드로 뜨게 된다.

이제 어디가서나 해당 url에 자신의 ip를 올리고 vncviewer를 listen모드로 실행시켜서
접속해 오기를 기다리기만 하면 되는것이다.

접속이되면
"접속 되어있습니다. 나중에 다시접속하려면 작업을 마치고 끊기직전에
확인을 눌러 이 창을 닫으세요. 종료하면 30초 후 부터 다시 접속시도를 합니다."
내용의 창이 떠있는데 스크립트를 보면 알겠지만 접속된 상태에서 다음 루프로
넘어가지 않기 위해서 창을 띄워서 대기하고 있는것이므로 그대로 두고
나중에 접속을 끊기전에 다시 루프로 빠져서 계속 재접속 시도를 하게 하려면
확인을 눌러서 닫으면 된다.

dispatcher.vbs 스크립트 실행을 중지하려면 작업관리자를 열어서
wscript.exe 라는 프로세스를 중지하면 된다.

Forums: 
moonzoo의 이미지

강좌내용이 마침 제게 필요한 것이라..

따라서 해 보았는데요..

에러가 발생해서요..

혹시나 알고 계시면 답변 부탁드립니다.

에러 메시지:
스크립트 : .............\dispatcher.vbs
행 : 12
문자 : 4
클래스에 대한 사용허가가 없습니다.
코드 : 80040112
원본 : (null)

=============

aero의 이미지

VB용 Winsock은 라이센스가 걸린 ocx라서 개발툴이 깔려있지 않으면
사용하지 못하더군요.

그래서 일반적인 명령으로 처리하도록 바꿨습니다.

새로올린 스크립트 코드로 해보세요

그리고 http://ultravnc.sourceforge.net/ 로 하면
tightvnc보다 훨씬 낫습니다. 파일전송도 되고
윈도용 VNC로는 최고네요

moonzoo의 이미지

답변에 감사드립니다.

visual studio를 깔아서 해결했습니다 ^^

덕분에 지금 회사 컴을 집에서도 사용할 수 있게돼서

얼마나 편리한지 모릅니다.

가끔.. 별거 아닌일로 회사 - 집 ( 왕복 2시간 이상) 을 왔다가야

할 일이 있었거든요.

tightvnc만으로도 일단 대만족입니다 ^^

amchiryo의 이미지

안녕하세요.

리눅스용 TightVNC로 위와 같은 reverse connection을 가능하게 하는 방법이 있는지요?
[/b]

amchiryo의 이미지

자답:

http://bbs.kldp.org/viewtopic.php?t=30212에
해결 방법을 올렸습니다.
리눅스 사용하시는 분은 참고하세요.

김희상의 이미지

우선, 팁 너무나 감사합니다....사실은 꼭 필요한 기능이긴 했는데,
귀차니즘으로 그만..... :lol:

그런데, 제가 처한 상황은 aero님이 작성하신 환경보단 좀 복잡(?)한데
집 - 회사 PC(window) - 회사 서버 의 구성인데, 회사는 NAT로 묶여있고, 서버는
회사 PC에서만 접속이 가능한 환경입니다.

윗글의 팁으로 회사 PC로 접속한 후, VNC로 회사서버에 접속하면 되겠지만
아무래도 VNC로 접속하면 좀 느리기에......
한가지 원하는게 있다면, 회사 PC가 집의 PC로 Reverse Connection를 맺은 뒤, 회사 PC가 집 - 회사 서버로 직접 통신하게 packet forwarding이나 터널링을 하는놈이 있으면 참 좋겠다는 생각입니다... :D

혹시, 좋은 아이디어나, 소프트웨어 알고계시는분 있으신가요?

지리즈의 이미지

한쪽이 unix이면.. openssl이나 ssh를 이용하여
포트forwarding이 가능하므로...
그다지 메리트가 없는데..

쌍방이 모두 Ms계열의 os면
골치가 많이 아파집니다.

http://www.winton.org.uk/zebedee/ 가 있습니다.

해킹 연구하다가 우연히 발견한 건데..
pc방에 같은데 깔아놓으면 좋겠다 싶어..
기억해 두었습니다.

사용법은 ssh의 포트 forwarding을 좀 다루신다면...
쉽게 적응을 하시리라 믿습니다.

There is no spoon. Neo from the Matrix 1999.

weirdo96의 이미지

혹시라도 위에 스크립트로 작업하시는데 Winhttp를 생성 못 한다는 오류가 발생하시는 분은

http://download.microsoft.com/download/2/e/0/2e068a11-9ef7-45f5-820f-89573d7c4939/soapsdk.exe

위 링크의 것을 받아서 설치하시기 바랍니다.

aero wrote:
VB용 Winsock은 라이센스가 걸린 ocx라서 개발툴이 깔려있지 않으면
사용하지 못하더군요.

그래서 일반적인 명령으로 처리하도록 바꿨습니다.

새로올린 스크립트 코드로 해보세요

그리고 http://ultravnc.sourceforge.net/ 로 하면
tightvnc보다 훨씬 낫습니다. 파일전송도 되고
윈도용 VNC로는 최고네요

amchiryo의 이미지

전에 리눅스용으로 만들어 보았는데,
aero님의 코드를 윈도우에서 사용해 보려니
저의 경우에는 잘 작동이 안되더군요....

아래와 같이 약간 바꾼 결과
잘 작동하네요.

혹시 aero님이 올려주신 코드가 자기 컴퓨터에서
잘 작동하지 않으면 아래 코드를 이용해 보는 것도
좋을 것 같습니다.

'접속할 ip가 있는 페이지의 URL
url="http://your URL/vnc.txt"
'채크할 초 간격
delay=30

Set http = CreateObject("WinHttp.WinHttprequest.5")
Set sh = CreateObject("WScript.Shell")

Do While True
    target = getURL(url)



   Set cmd = sh.exec("c:\windows\system32\netstat -an")
   netresult = cmd.StdOut.ReadAll
   Do While cmd.Status=0
       WScript.Sleep 50
   Loop

   Set cmd = Nothing
   If  InStr(netresult, target&":5500") Then

   Else
       Set cmd = sh.exec ("c:\Program Files\TightVNC\winvnc -connect " & target )
   			Do While cmd.Status=0
       	WScript.Sleep 50
   			Loop
   			Set cmd = Nothing
        WScript.Sleep 30*1000
   End If


    WScript.Sleep delay*1000
Loop

Function getURL(url)

    Dim re, matches

    http.Open "GET", url, False
    http.Send
    getURL = http.ResponseText
    Set re = New RegExp
    re.Pattern = "([\w\.]+)"
    Set matches = re.Execute(getURL)
    getURL = matches.Item(0)

End Function
litnsio2의 이미지

한글패치를 제작하였습니다. 허접이지만.. 많은 이용 부탁드립니다.

http://radiohead.egloos.com/718212/

doraq의 이미지

지정해둔 간격마다 netstat 창이 뜨면서 깜빡이는게 눈에 거슬립니다.
저는 마치 윈도 서비스 처럼 시작프로그램에 넣어두고 잊고 있으려고 했거든요.
그런데 120초로 해놨는데도 상당히 눈에 거슬리는군요.
특히 한참 키보드 치고있다가 포커스 뺐겨서 헛짓 되버리면 맥빠지더라구요.

리눅스 버젼도 보니까 php로 되 있던데 왜 shell script 버전은 없을까요.
shell script 거의 모르지만 한번 도전해 봐야 겠습니다.

제 환경은 윈도 XP데 cygwin이 깔려있습니다. 그래서 cygwin환경을
이용하면 창이 뜨지 않을거 같습니다.

송효진의 이미지

저 위의 봇 덕분에 좋은 글을 보게 된듯 하네요-_-;;;;
vnc 를 이용해서 윈도 서버 <-> 리눅스 클라이언트 가 구현 된다는 것인가요?
그렇다면, 윈도 콘솔 화면을 vnc 로 본다는 것인가요,
rdesktop 처럼 새 터미널을 연다는 것인가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.