WF2411 공유기를 통한 외부 기기와 소켓 통신 프로그래밍

공대생의 팁 2014. 11. 2. 00:39

 스마트폰 시대가 열리면서 요즘은 집마다 공유기를 두는 경우가 많습니다. 그 덕에 공유기를 통해 안드로이드폰으로 통신하는 기능을 가진 기기들도 속속 등장하는 것을 볼 수 있지요.


 소켓 프로그래밍에 처음으로 입문한 분들의 경우 IP의 개념이 제대로 정립되지 않았을 경우 열심히 코드를 입력하였는데도 소켓 프로그래밍이 제대로 동작하지 않는 경험으로 멘붕을 경험하신 분들이 꽤 되실 거라 생각합니다.


 같은 공유기에 접속한 기기 끼리는 소켓 통신이 원활이 되는데 왜 공유기로 들어오는 신호는 잡히지 않을까요? 그 이유는 공유기가 접속한 기기에 제공하는 IP주소에서 원인을 찾을 수 있습니다.

 IP주소는 집주소와 같아 해당 IP주소를 입력하면 이론상 그 IP를 가진 컴퓨터에 접속하실 수 있습니다. 실제로 티스토리를 도메인이 아닌 아이피 주소를 입력하면 티스토리로 접속할 수 있는 것을 알 수 있습니다.


 

이미지 출저 : http://www.madtomatoe.com/what-are-private-ip-addresses/


 일반적으로 집에서 여러 대의 컴퓨터를 사용하게 될 때 각 컴퓨터마다 인터넷을 연결하기 위해서는 각 컴퓨터 대수 만큼의 회선이 필요합니다. 만약 각 컴퓨터마다 각각 다른 통신사의 회선을 연결하게 되면 통신요금이 상당히 많이 나올겁니다.

 이렇게 집안에 여러 대의 컴퓨터를 하나의 회선으로 사용할 수 있게 해주는 역할을 하는 것이 바로 공유기 입니다. 외부로부터 하나의 IP를 할당받아 인터넷에 접속할 수 있는 공유기에 각 컴퓨터의 회선을 한 공유기에 연결하면 연결된 PC들이 동시에 인터넷을 할 수 있습니다. 이 때 각 컴퓨터마다 인터넷에 접속하기 위해서는 각자 다른 IP주소를 할당받아야 합니다.

 공유기가 외부로부터 연결된 회선의 IP는 1개 뿐인데 이 여러대에 연결된 컴퓨터에는 주소를 어떻게 배포할까요? 이는 각 기기별로 공유기 자체에서 제공하는 주소를 나누어 주는 것으로 해결할 수 있습니다. 이 때 공유기가 각 컴퓨터에 할당하는 IP를 사설 IP라고 합니다.

 이 상황에서 공유기에 연결된 컴퓨터 끼리는 공유기가 할당한 IP주소를 통해 서로 통신을 할 수 있는 망이 구축된 것을 확인할 수 있습니다. 하지만 이들의 IP주소를 외부망에 있는 컴퓨터에 연결을 하려면 어떻게 해야 할까요?


 1. 실제 컴퓨터가 할당받은 사설 IP에 접속한다.

 사설 IP는 192.168.x.x 대열에서 사용되도록 하고 있습니다. 즉, 해당 주소를 가진 PC는 공유기에 연결되어 있는 모든 PC들을 대상으로 한다고 볼 수 있죠. 이는 해당 컴퓨터의 유일한 IP주소가 아니기 때문에 접속이 불가능합니다.


 2. 공유기가 할당받은 IP에 접속한다.

 분명 공유기는 외부로부터 자신만의 IP를 할당받았습니다. 실제로 외부망에서 공유기의 WAN포트에 걸린 IP주소를 입력하면 공유기에 접속이 가능합니다. 하지만 여기서 문제가 발생합니다. 우리가 목표로 하는 것은 공유기에 연결된 PC에 접속을 하는 것이지만 공유기 위치에서 해당 컴퓨터의 IP주소를 알아야 접속이 가능합니다. 하지만 처음에 접속할 때 우리는 오직 공유기에 도달하기 위핸 1개의 IP밖에 사용할 수 없습니다.


 그렇다면 위 2가지 방법 이외의 접속방법은 없는걸까요?

 이 질문의 답은 각 공유기가 제공하는 포트포워딩(Port forwarding)을 사용하는 방법으로 해결할 수 있습니다.



이미지 출저 : http://documentation.commvault.com/hds/v10/article?p=features/firewall/port_forward_gateway.htm


 위 그림에서 중간에 위치한 기기를 공유기라 하였을 때 오른쪽의 컴퓨터는 외부의 컴퓨터로 공유기의 IP를 통해 접속을 시도하는 모습을 나타내고 있습니다. 왼쪽의 2대의 컴퓨터는 각각 공유기에 연결되어 있으며 440포트가 개방되어 있는 상황을 나타내고 있습니다.

 만약 공유기가 포트포워딩으로 외부에서 공유기의 특정 포트를 연결하게 되면 공유기는 해당 포트로 접속시 설정된 공유기에 연결된 컴퓨터에 연결할 수 있도록 도와줍니다.

 예를들어 외부의 컴퓨터가 공유기의 IP주소와 포트번호 443번을 입력하였을 경우 공유기는 443번 포트 접속시 설정되어있는 사설IP와 포트번호를 통해 내부망의 컴퓨터에 접속을 시도하게 됩니다. 이와 같은 방법으로 공유기 외부의 컴퓨터가 공유기 내부에 연결된 PC와 소켓통신을 할 수 있는 것을 알 수 있습니다.


 여기까지 포트포워딩에 대해 간단하게 설명드렸습니다. 포드 포워딩에 대해 좀 더 자세히 알고 싶으신 분은 아래의 블로그를 참조하시길 바랍니다.

http://luckyyowu.tistory.com/102


 그렇다면 이번에는 외부 컴퓨터가 공유기 내부망에 연결된 컴퓨터와 소켓 프로그래밍을 할 수 있는 환경을 설정해 보도록 하겠습니다.


※본 포스팅은 Windows7 기반의 컴퓨터와 Netis사의 WF2411 공유기를 기준으로 작성되었습니다.


1. 먼저 CMD를 실행하여 'ipconfig'를 입력하면 아래와 같은 결과를 알 수 있습니다. 이 때 IPv4가 해당 컴퓨터가 공유기로부터 할당받은 IP 주소입니다. 이를 기억하도록 합니다.



2.자신의 공유기의 관리자 모드에 접속합니다.

Netis사의 공유기의 초기 설정은  http://192.168.1.1 로 설정되어 있습니다.



3. '방화벽/포트 포워딩 메뉴'로 들어가신 후 '가상 서버' 메뉴를 선택하시면 위와 같은 화면을 보실 수 있습니다.

'규칙 이름'은 자신이 알 수 있는 이름으로 정해줍니다.

'내부 IP 주소(서버 PC)'는 외부 접속을 받고자 하는 공유기 내부망 PC의 사설IP주소를 입력하는 부분입니다. 위 CMD를 통해 확인한 IP주소를 입력하면 되겠습니다.

소켓 프로그래밍 용도로 접속을 하는 것이므로 '프로토콜'은 TCP로 설정합니다.

'포트번호(외부)'는 외부에서 공유기 접속시에 입력하는 Port 번호로 외부 컴퓨터가 공유기에 접속할 때의 포트번호를 입력합니다.

'포트번호(내부)'는 위에서 설정된 포트번호로 접속한 외부 접속을 공유기에 연결된 PC에 전송시 쓰이는 포트번호입니다. 공유기에 연결된 PC가 정해진 포트로 접속해야할 경우 해당 포트번호를 입력합니다.


위의 설정을 모두 완료하시면 외부 접속으로 공유기 내에 있는 기기가 소켓 통신을 하는 것을 확인하실 수 있습니다.



※Windows7 기반 사용자의 경우 위의 설정까지 진행되었음에도 소켓통신이 이루어지지 않는 경우가 있습니다. 이는 해당 Windows7에 설정된 방화벽으 접속을 막는 경우 발생합니다. 이를 해결하기 위해서는 방화벽 설정을 통해 특정 포트를 개방하면 해결할 수 있습니다. 자세한 사항은 다음 포스팅을 참고 하시기 바랍니다.


윈도7 기반 서버 컴퓨터와 소켓 프로그래밍이 안될 때

300x250