VPN(Virtual Private Network : 가상 사설망)접속을 이용하면

외부 네트워크에서도 마치 내부망에서 접속하는 것처럼 사설망을 구성할 수 있다.


외부망에서 기존에 연결되어 있던 네트워크 회선 위에서 VPN연결을 하는 것으로

인터넷이 끊겨 있으면 이용할 수 없으며 모바일기기에서 3G/4G접속 시

통신사 데이터요금 없이 인터넷을 이용할 수 있는 것이 아니다.


VPN의 목적으로는 여러가지가 있지만..

비교적 적은 비용으로 외부에서 사설망에 접근할 수 있는 일종의 터널을 만드는 데에 쓰이거나

아니면 A, B, C가 있다고 할 때, A에서 C로의 접근은 차단되어 있으나 B에서 C로는 접속할 수 있고,

B에 VPN서버가 열려있고 A가 권한이 있다면, A에서 B를 거쳐 C로 접속할 수도 있다.



윈도우7(Windows7)이상에서는 자체적으로 VPN 서버를 여는 기능이 있는데

공유기 기종이나 네트워크 연결상황에 따라 안 될 수도 있다.

(공유기에서 직접 VPN서버를 열 수 있는 것도 있습니다)



1. 제어판에서 '네트워크 및 공유센터'로 들어가 '어댑터 설정 변경'을 누른다.






2. Alt키를 눌러서 메뉴를 연 뒤 '파일 - 새로 들어오는 연결'을 누른다





3. '사용자 추가'를 눌러서 계정을 만든다.

  여기서 '사용자 이름'과 '암호'는 VPN접속을 할 때 ID와 비밀번호가 되므로 잘 정해둬야 한다.





4. 체크한 뒤 다음버튼을 누른다.






5. Internet Protocol Version 4 (TCP/IPv4) 를 선택한 뒤 속성을 눌러서 IP주소를 할당한다.

  IP주소의 시작과 끝에 각각

10.1.0.1 , 10.1.0.10 이나,

192.168.5.1 , 192.168.5.10 등

현재 네트워크와 충돌하지 않는 사설IP 대역을 정해주면 된다.


하지만 VPN접속측에서 VPN서버측을 통해 인터넷으로 나가려고 할 때

VPN서버측에 공유기(DHCP서버)가 있다면 공유기의 서브넷과 맞춰줘야한다.

가령 공유기 DHCP서버의 서브넷마스크가 255.255.255.0이고  192.168.50.100 ~ 192.168.50.200 대역의 IP를 할당한다면, VPN IP주소 할당은 192.168.50.201 ~ 192.168.50.210 로 하는 것이다.

(서브넷은 같게, 공유기의 DHCP할당대역과는 다르게)






6. 위 5번에서 설정이 다 끝났으면 '엑세스 허용'을 눌러 완료한다.

  그러면 '들어오는 연결'이라는 항목이 생겨 있는데 연결을 암호화하려면 '모든 사용자의 암호 및 데이터 보안 필요'에 체크한다.






7. 공유기가 있을 경우

  1723번 포트와 47번 포트를 각각 포트포워딩해야 한다.

  그리고 공유기의 PPTP기능을 활성화시켜준다.

  공유기에 따라서 VPN관련 설정을 따로 하는 부분이 있을 수 있다.

 

포트포워딩 시 IP주소로는 VPN서버를 여는 컴퓨터의 사설IP를 입력한다.

(시작 - 맨아래 프로그램 및 파일 검색 - cmd - cmd.exe실행 후 ipconfig 명령어 입력하면 사설 IP를 볼 수 있습니다.)






8. 이제 외부 네트워크에서 접속하는 것을 테스트해 보는데

  모바일기기의 3G/LTE를 이용하면 쉽게 할 수 있어서 그걸로..


 기기마다 다 다르지만 보통 네트워크 설정하는 메뉴에서 VPN연결을 찾아볼 수 있다.








9. 외부망에서 접속하는  테스트를 위해 와이파이 대신 3G나 LTE로 연결한다.

 이름 입력란에는 이 설정의 이름을 알아볼 수 있게 적어두는 것으로 위 3번 그림에서 입력한 이름과는 관련없다.


서버주소는 VPN서버를 연 쪽의 공인IP를 적어야하는데,

그쪽 컴퓨터에서 http://ipconfig.co 등의 사이트에 접속해보면 알 수 있다.


PPP암호화는 위 6번에서 암호화에 체크를 했으면 여기서도 체크한다.




10. 설정이 끝났으면 3G/LTE상태인것을 확인하고

위 3번에서 설정했던 사용자이름과 비밀번호를 입력한다.



연결 성공시 화면





VPN서버가 있는 컴퓨터쪽에서도 연결이 들어온 것을 확인할 수 있다.





이제 모바일기기에서 공인IP주소를 확인해보면

서버쪽 IP를 통해 인터넷으로 나간다는 것을 볼 수 있다.





 

이 글은 tibyte.krcafe.naver.com/sdbx에 게시됩니다.

(설명글은 http://cafe.naver.com/sdbx/737에 있습니다.) 


플래시 클라이언트는 소켓서버에 연결할 때 정책파일(crossdomain.xml)을 달라는 요청을 보내는데 이 파일을 보내주지 않으면 통신을 시작할 수 없습니다.

클라이언트에서 Security.loadPolicyFile()메서드로 원격 서버와 같은 도메인에 연결하여 xml파일을 직접 받아올 수 있지만 그러지 못하는 상황에는 서버프로그램에서 이 정책파일을 직접 보내줄 수도 있습니다.

ActionScript 3.0으로 작성된 Adobe AIR 소켓서버 코드를 보겠습니다.

 

 


우선 ServerSocket객체를 만들고 bind()listen()을 수행하여 서버소켓을 가동시키는 함수입니다. (serverSocket은 이 클래스의 private멤버변수입니다.)


private function bind():void

{

//기존에 실행 중인 소켓서버가 있으면 닫고 새로 실행

if(serverSocket.bound)

{

serverSocket.close();

serverSocket = new ServerSocket();

}

serverSocket.bind(로컬포트, 로컬IP);

serverSocket.addEventListener(ServerSocketConnectEvent.CONNECT, onConnect);

serverSocket.listen();


//로그 코드 삽입

}

 



다음은 ServerSocketConnectEvent.CONNECT 이벤트가 발생했을 때  실행되는 onConnect함수입니다.



private function onConnect(event:ServerSocketConnectEvent):void

{

var socket:Socket = event.socket;

clientSockets[socket.remoteAddress] = 1;//연결된 클라이언트들을 배열로 관리

socket.addEventListener(Event.CLOSE, onClientDisconnect);//클라이언트가 접속을 끊었을

socket.addEventListener(ProgressEvent.SOCKET_DATA, onClientSocketCert);//클라이언트로부터 데이터가 들어올 때

//이 밖에도 다른 이벤트나 예외처리구문, 로그(기록) 남기는 구문들을 넣어줍니다.

}



 

연결이 되면 클라이언트는 서버로 메시지를 보내고 이에 따라 ProgressEvent.SOCKET_DATA 이벤트가 발생합니다.

 


 클라이언트가 정책파일을 찾지 못했을 때는 843번 포트로 "<policy-file-request/>" 이라고 정책파일을 요청하는 메시지를 보냅니다. 따라서 서버에서는 저 메시지가 들어왔을 때 정책파일을 보내주어야 합니다.

 



private function onClientSocketCert(event:ProgressEvent):void

{

var socket:Socket = event.target as Socket;

var message:String = socket.readUTFBytes(socket.bytesAvailable);

if (message == "<policy-file-request/>") {

var policy:String = "<cross-domain-policy>" +

"<allow-access-from domain=\"*.example.com\" to-ports=\"8800\"/>" +

"</cross-domain-policy>\x00";

socket.writeUTFBytes(policy);

socket.flush();

socket.close();

} else if(message=="BEGIN") {

socket.removeEventListener(ProgressEvent.SOCKET_DATA, onClientSocketCert);

socket.addEventListener(ProgressEvent.SOCKET_DATA, onClientSocketData);

socket.writeUTFBytes("READY");

socket.flush();

      }

//이 밖에도 로그 남기는 코드를 삽입

}

 

위 함수에서 볼 수 있듯이 XML파일을 문자열형태로 직접 전송합니다.

 

"<cross-domain-policy>" +

"<allow-access-from domain=\"*.example.com\" to-ports=\"8800\"/>" +

"</cross-domain-policy>\x00"

 

(여기서 쓴 8800번 포트는 임의로 정한 포트번호입니다.)

 

크로스도메인(crossdomain.xml)파일에서 도메인과 포트를 지정해주는데요, 와일드카드 문자를 쓸 수 있습니다.

 

 







 

+ Recent posts