Universal Plug and Play 프로토콜은 PC와 네트워크 기능을 갖춘 장치 간의 통신을 가능하게 합니다. 통신 방법으로 TCP/IP, UDP, HTTP, XML (SOAP)을 사용하고 있기 때문에, 특별한 디바이스 드라이버를 사용할 필요가 없습니다. UPnP 아키텍처는 별도의 설정 없이 네트워킹이 가능합니다. UPnP 호환되는 장치는 동적으로 네트워크에 들어와서 IP를 할당받고, 자신의 이름을 공표한 다음, 자신이 제공하는 서비스를 알려주고, 네트워크 내의 다른 장치의 존재 유무와 기능을 식별할 수 있습니다.

UPnP는 기본적으로 인증 메커니즘을 정의하지 않고 있으며, 라우터나 방화벽에서 UPnP 기능을 지원하도록 되어있는 것을 악용하여, 사용자의 동의 없이 임의로 NAT 설정을 변경하고 포트를 개방할 수 있습니다. 게이트웨이에서는 반드시 UPnP 지원 기능을 비활성화 하시고, 그 외에도 UPnP가 필요하지 않은 경우에는 가급적 끄시기 바랍니다. 실제로 UPnP가 활성화 된 경우 아래 코드를 이용하여 포트를 쉽게 열 수 있습니다. 이런 취약점을 P2P 프로그램이나 게임에서 방화벽 자동 설정에 이용하는 경우도 있습니다. 사용자가 직접 NAT를 설정하기 어려운 경우가 많기 때문입니다.

http://bytes.com/forum/thread431643.html

코드가 들여쓰기 제대로 안 되어있어서 따로 첨부했습니다. 윈도우에서 UPnP 기능을 COM으로 사용 가능하도록 구현되어 있지만, 원래 UPnP가 네트워크 기능만 되면 사용이 가능하도록 만든 스펙이기 때문에 이 코드처럼 현재 컴퓨터의 NIC를 조사하여 연결되어 있는 모든 게이트웨이의 UDP 1900 포트로 SSDP 패킷을 보내어 UPnP 지원 여부를 확인하고, SOAP 형식의 제어 패킷을 보내 NAT 설정을 변경할 수 있습니다.

http://www.codeproject.com/KB/IP/PortForward.aspx

그렇지만 그래도 MFC와 C++ 코드가 편안하신 분은 위의 코드 프로젝트 기사를 참고하시기 바랍니다. urn:schemas-upnp-org:device:InternetGatewayDevice:1 타입을 인수로 하여 IUPnPDeviceFinder 인터페이스를 구현한 컴포넌트의 FindByType를 호출하기만 하면 UPnP가 지원되는 게이트웨이 장치를 쉽게 나열할 수 있습니다. 그 이후에 IUPnPNAT 인터페이스를 구현하는 컴포넌트의 get_StaticPortMappingCollection 메소드를 이용해서 현재 포트 매핑 목록 객체를 얻어내고, 여기에 Add 메소드를 호출해서 NAT 매핑을 추가하면 됩니다.

관련 API는 아래 MSDN에서 찾아보시기 바랍니다.
http://msdn.microsoft.com/en-us/library/aa382303%28VS.85%29.aspx

참조 : http://en.wikipedia.org/wiki/Universal_Plug_and_Play