1. 개발 환경
컴파일러: gcc
UPNP SDK(UPNP 라이브러리) : upnp. sourceforge.net
IGD (UPNP 데몬): igd.sourceforge.net
2. 용 어
Device: TV, Gateway 등 장치를 뜻한다. C/S 개념으로 서버와 비슷한 개념이다.
Control Point: Device 를 제어하는 장치로서 일반 PC, 노트북을 예로 들수 있다. C/S 개념으로 클라언트와 비교할 수 있다.
3. UPNP Layer
UPNP 에는 6 Layer 로 구성되어 있다.
| 3 Control (SOAP) | 4 Eventing (GENA) | 5 Presentation (HTTP:HTML) | ||
| 2 Description (HTTP:XML) | ||||
| 1 Discovery (SSDP/GENA) | ||||
0 Address | |||||
0 Level (Address)
Control point 와 Device 네트워크에 참여하기 위해 IP Address 를 얻어온다.
1 Level (Discovery)
Control point 는 모든 Device 를 찾아내고 Device 자신의 사용 가능여부를 알려준다.
2 Level (Description)
Control point 가 device 에 대한 기본 정보를 가져 온다.
3 Level (Control)
Control point 가 Device를 제어한다.
4 Level (Eventing)
Control point 가 Device 상태를 listen 한다.
5 Level (Presentation)
Web 화면을 Device를 정보를 볼 수 있거나 제어 할 수 있다.
Intel Linux 하에서 구현된 upnp sdk 는 Level 1부터 구현되어 있다. Address를 얻어오는 부분은 DHCP 로 얻어 온다.
4. UPNP 프로토콜과 구현
Upnp 는 SSDP, GENA, SOAP 로 구성되어 있다. SSDP와 GENA 는 UDP 기반위에 멀티 캐스트/유니캐스트 패킷으로 이뤄어 졌고 SOAP는 TCP 기반으로 구성되어 있다. 약간씩 차이는 있지만 기본적인 형태는 HTTP로 이루어 졌기 때문에 UPNP SDK 를 살펴보면 WEB 모듈이 반이상을 차지하는 것을 알 수 있다.
1) Discovery(SSDP/GENA)
Device를 네트워크에 참여시키면 239.255.255.250 패킷 헤더에 NOTIFY , 장치의 고유번호 , 동작여부, Device 를 정의한 xml 파일의 경로 등을 담은 멀티캐스트 udp 패킷을 네트워크로 보낸다(광고한다).
NOTIFY * HTTP/1.1 NT: upnp:rootdevice
|
* 이 부분은 upnp sdk 에서 구현되어 있으므로 사용자가 프로그램 해야 할 부분은 UpnpSendAdvertisement 함수를 호출 해주면 된다.
2) Description (HTTP:XML)
Discovery에서 알아낸 Device의 XML description 파일을 얻어 온다. 프로토콜 방식은 HTTP 방식이다.
PC 에서 Description 패킷을 받으면 [내 네트워크 환경]에서 Device 가 나타나는걸 볼 수 있다. 이 아이콘을 누르면 바로 Device의 설정화면인 Web 화면으로 넘어간다. Anygate 상에서는 Description 부분이 구현되어 있다면 Device 의 IP 주소를 몰라도 이 아이콘의 클릭만으로 바로 설정 화면으로 들어갈 수 있다.
위에 등록 정보 내용을 수정하려면 xml 파일을 수정하면 된다. 우리는 gatedesc.xml 의 기본내용을 담고 있는 gatedesc.skl에서 각 내용을 수정할 수 있다
3) Control (SOAP)
Control pointer 에서 Device의 정보를 얻어오거나 Device를 제어할 때 사용되는 Control Level 은 Device와 관련된 부분으로 Anygate에 상에 upnp 를 돌리기 위해 가장 많이 구현해야 하는 부분이다.
해더부분은 M-POST 로 시작하며 SOAPACTION 뒤에 오는 각각의 #ActionName(제어시) 과 #QueryStateVariable(Device에 대한 정보) 요청에 대한 응답 부분을 구현해야 한다.
M-POST /upnp/control/WANIPConn1 HTTP/1.1 ============================================================== Device를 제어 할 때 SOAPACTION: "urn:schemas-upnp-org:service:serviceType:v#actionName" Device의 정보를 알고자 할 때 SOAPACTION: "urn:schemas-upnp-org:control-1-0#QueryStateVariable
|
Device 에는 여러 개의 Service 로 이루워져 있는데 인터넷 공유기인 Anygate 는 IGD 를 기반으로 하기 때문에 연결부분 (CONNECT), 설정 부분(CONFIG), Device 의 OS 3개 부분으로 구성되어 있고 각각을 정의한 description 파일 gateconnSCPD.xml, gateicfgSCPD.xml, gateinfoSCPD.xml 3개가 존재 한다.
각각의 서비스에 대한 Action 값은 igd.sourceforge.net 에 정의 되어 있으나 각 부분에 대한 값들은 구현을 해야 된다.
if (strcmp(ca_event->ServiceID, GateServiceId[GATE_SERVICE_CONNECT]) == 0) =>서비스 종류 확인 { strcpy(service_type, GateServiceType[GATE_SERVICE_CONNECT]); if (strcmp(ca_event->ActionName, "GetConnectionTypeInfo") == 0) => Action 종류 확인 { action_succeeded = 1; strcpy(result_param,"<NewConnectionType>IP_Routed</NewConnectionType> <NewPossibleConnectionTypes>IP_Routed</NewPossibleConnectionTypes>"); => 이부분이 Device 장치와 관련 부분으로 사용자가 정의 해야 한다. } } ca_event->ErrCode = UPNP_E_SUCCESS; sprintf(result_str, "<u:%sResponse xmlns:u=\"%s\">\n%s\n</u:%sResponse>", ca_event->ActionName,service_type,result_param,ca_event->ActionName); => Action 이름/ 서비스 종류/ Action 에 대한 value 값을 result_str 에 복사한 다음 result_str 값을 Control point에 보내주면 된다.
|
각 서비스에 대한 Action 과 구현은 아래와 같다.
연결 부분 (GateServiceId[GATE_SERVICE_CONNECT])에 대한 Action
- GetConnectionTypeInfo: 연결 타입으로 IP_Routed 로 정의
- GetNATRSIPStatus: NAT 사용 여부 로 Enable 값은 1로 정의
- GetStatusInfo: 연결 여부, 연결 시간
Uptime => /proc/uptime 을 이용한다.
- GetExternalIPAddress: 외부 IP 주소
- GetGenericPortMappingEntry: 기본적으로 내장되어 있는 포트포워딩 으로 아래와 같은 값은 만들어서 보내줘야 동작 한다.
포트 포워딩에 관련된 값들은 호스트 아이피, 외부 포트, 프로토콜, 내부 포트, 내부 아이피 , 사용여부, 포트 포워딩 설명, 사용 시간에 대한 내용을 표시하여 한다. 각각의 값은 아래 굵은 글씨를 참조하면 된다.
<NewRemoteHost xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"></NewRemoteHost> <NewExternalPort xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui2">23</NewExternalPort> <NewProtocol xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">TCP</NewProtocol> <NewInternalPort xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui2">23</NewInternalPort> <NewInternalClient xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"> 192.168.1.0 </NewInternalClient> <NewEnabled xmlns:dt="urn:schemas-microsoft-com:datatypes"dt:dt="boolean">0</NewEnabled> <NewPortMappingDescription xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"> Telnet </NewPortMappingDescription> <NewLeaseDuration xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui4"> 0 </NewLeaseDuration> |
- GetSpecificPortMappingEntry: 사용자가 직접 입력한 포트 포워딩 Entry
- AddPortMapping : 포트 포워딩 규칙이 추가될 때 동작 한다.
- DeletePortMapping : 포트 포워딩 규칙이 추가될 때 동작 한다.
GateServiceId[GATE_SERVICE_CONFIG]
이부분은 RX_PACKET /TX_PACKET 흐름에 대한 정보를 표현한 것으로 -> /proc/net/dev 에서 가져오면 된다.
- GetTotalPacketsSent 인터넷 게이트웨이가 보낸 패킷
- GetTotalPacketsReceived 인터넷 게이트웨이가 받은 패킷
- GetCommonLinkProperties: 연결 상태, 속도
GateServiceId[GATE_SERVICE_OSINFO]
UPNP 에서 Control 패킷을 받으면 [내트워크 연결] 를 보면 인터넷 게이트웨이에 Gateway를 설정할 수 있는 부분이 생겼다는걸 알수 있다.
위 아이콘을 클릭하면 연결 상태, 기간, 속도, 인터넷 게이트 웨이에서 주고 받은 패킷에 대한 정보가 나온다. 이부분은 Action 을 계속하여 보내므로써 출력된다.
4) Eventing (GENA)
Control Point Device의 정보를 광고 정보를 subscribe , unsubscribe 할때 받는 패킷으로 헤데 부분에 SUBSCRIBE, UNSUBSCRIBE 로 구현되어 있다.
SUBSCRIBE /upnp/event/OSInfo1 HTTP/1.1 |
5) Presentation
이부분은 일반 HTTP 프로토콜과 같다.
5. Upnp 실행
1) 멀티 캐스트 패킷을 받아야 하므로 멀티캐스킹에 라우팅 규칙을 추가해야 한다.
route add -net 239.0.0.0 netmask 255.0.0.0 eth0
upnp 실행 시키려면 [upnpd 외부 IF 내부 IF ] 명령어를 실행하면 된다.
ex)upnpd eth1 eth0
[출처] 리눅스 에서 UPNP 동작 시키기 |작성자 Sally
'ARM & 펌웨어 분석' 카테고리의 다른 글
UPNP XML 로 포트 포워딩하는 프로토콜 분석 (Analysis of port forwarding packet via UPNP) (0) | 2012.12.02 |
---|---|
공유기 UPNP 로 포트포워딩처럼 열어주는 프로그램 (0) | 2012.12.01 |
CGI 분석 이야기 (The story of CGI analysis) (0) | 2012.11.14 |
CGI 환경 변수 정의 모음 (Group of CGI enviroment) (0) | 2012.11.13 |
[ 펌 ] How to Create a Shellcode on ARM Architecture (0) | 2012.11.13 |