UPNP Port Forwarding (Debian)

category 서버/리눅스 서버 2017.10.26 12:55

안녕하세요. 도정진입니다. 오늘은 UPNP 를 통해서 포트 포워딩을 하는 방법을 알아 보도록 하겠습니다.





0. 필요성


자취방에서 생활하고 있습니다. 그런데 포트포워딩을 하고 싶으나 포트포워딩을 못할 경우가 있습니다.


혹은 공유기 설정창 열기 귀찮을 때 사용하시면 됩니다.


예로써, 아래와 같습니다. 공유기를 통해 방마다 인터넷을 넣을때.. 이럴 때에는 상위에 있는 공유기를 먹지 않고서야 작업이 불가능합니다. (여기서 먹는다는 것은 ID / PW 를 설정되지 않은 공유기일때, 관리창에 들어가서 입맛대로 설정을 하고 비밀번호를 거는 작업.)


물론 이 방법이 모든 환경에 대응하는 것은 아닙니다. UPNP 데몬이 공유기나 스위치에서 돌지 않고 있거나 그 상위에 또 공유기가 있을 경우에는 작동하지 않을 수 있습니다.


아래의 그림을 보시면 이해가 가능합니다.



위의 경우에는 사용이 불가능 할 가능성이 높아집니다.


실제로 UPNP 를 통해 하위 공유기에서 넘어온 설정이 상위 공유기에도 설정이 되는것을 확인한 바 있습니다만, 위의 경우는 거의 실패하네요.


한편, UPNP 는 토렌트 , 게임 , 팟플레이어 등등에서 기본적으로 통신 포트를 열기 위해서 사용하는 데몬 / 클라이언트 입니다.





1. 윈도우 / 리눅스 (데스크톱 환경) UPNP PortMapper 사용


일단 UPNP PortMapper 는 자바 기반이라 윈도우에서 사용하실 경우 JAVA 설치가 필요합니다.


https://java.com/ko/download/windows-64bit.jsp


https://sourceforge.net/projects/upnp-portmapper/


실행을 하고 Connect 버튼을 통해서 연결 한 다음 입맛대로 포트 포워딩을 추가해 주시면 됩니다.






2. 리눅스 콘솔 환경


miniupnpc 패키지를 설치합니다.


root@u5pvr-debian:~# apt-get install miniupnpc

Reading package lists... Done

Building dependency tree

Reading state information... Done

miniupnpc is already the newest version.

0 upgraded, 0 newly installed, 0 to remove and 54 not upgraded.

root@u5pvr-debian:~#


그리고 아래와 같은 명령어로 포트 포워딩을 하실 수 있습니다.


upnpc -a [source_ip] [source_port] [external_port] [protocol]


root@u5pvr-debian:~# upnpc -a 192.168.0.12 22 22 TCP

upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard

Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/

for more information.

List of UPNP devices found on the network :

 desc: http://192.168.0.200:1024/etc/linuxigd/gatedesc.xm

 st: urn:schemas-upnp-org:device:InternetGatewayDevice:1


recv: Connection reset by peer

No valid UPNP Internet Gateway Device found.

root@u5pvr-debian:~#


그런데 환경에 따라서 못찾는 경우가 있습니다. 위에 보시면 192.168.0.200 에 물려 있는 무선 AP 용 (DHCP 꺼짐) 의 UPNP 데몬은 검색이 되지만 실질적인 192.168.0.1 의 데몬은 못찾는 경우가 있는데요. 그 경우는 아래와 같이 야매로 찾습니다.


상기 1번 방법에서 UPNP Port Mapper 를 동일 서브넷의 컴퓨터에서 실행시킵니다.



그럼 위의 기반으로 다시 명령을 실행해 봅니다.


Options:

  -e description : set description for port mapping.

  -6 : use ip v6 instead of ip v4.

  -u url : bypass discovery process by providing the XML root description url.

  -m address/interface : provide ip address (ip v4) or interface name (ip v4 or v6) to use for sending SSDP multicast packets.

  -p path : use this path for MiniSSDPd socket.


공식 설명에는 서칭 작업을 하지 않고 URL 을 직접 지정하는 게 가능하다고 합니다.


upnpc -u [upnp_xml_url] -a [source_ip] [source_port] [external_port] [protocol]


결과적으로 아래와 같이 실행을 합니다.


root@u5pvr-debian:~# /usr/bin/upnpc -u http://192.168.0.1:59297/etc/linuxigd/gatedesc.xml -a 192.168.0.12 22 22 TCP

upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard

Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/

for more information.

upnpDiscover() error code=0

Found valid IGD : http://192.168.0.1:59297/etc/linuxigd/gateconnSCPD.ctl

Local LAN ip address : 192.168.0.12

ExternalIPAddress = 124.194.31.74

AddPortMapping(22335, 22, 192.168.0.12) failed with code 718 (ConflictInMappingEntry)

InternalIP:Port = 192.168.0.12:22

external 124.194.31.74:22 TCP is redirected to internal 192.168.0.12:22 (duration=0)

root@u5pvr-debian:~#


그럼 상기처럼 포트포워딩이 되었음을 알 수 있습니다.


혹시나 등록이 제대로 되었는지 UPNP PortMapper 로 확인을 해 봅니다. 아래와 같이 libminiupnpc 이름으로 등록이 되어 있습니다.



목록에서 삭제를 하려면 아래의 명령어를 사용하시면 됩니다. (포트포워딩 삭제)


root@u5pvr-debian:~# /usr/bin/upnpc -u http://192.168.0.1:59297/etc/linuxigd/gatedesc.xml -d 22 TCP

upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard

Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/

for more information.

upnpDiscover() error code=0

Found valid IGD : http://192.168.0.1:59297/etc/linuxigd/gateconnSCPD.ctl

Local LAN ip address : 192.168.0.12

UPNP_DeletePortMapping() returned : 0

root@u5pvr-debian:~#





3. 입력하기 귀찮으니 스크립트 작성


아래의 내용으로 스크립트를 작성하고 실행 권한을 준 다음 /usr/bin/ 같은 곳에 바로 실행이 가능하도록 복사합니다.


root@u5pvr-debian:~# nano /usr/local/bin/port


#!/bin/sh

local=`ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`

/usr/bin/upnpc -u http://192.168.0.1:59297/etc/linuxigd/gatedesc.xml -a $local $1 $2 $3

#/usr/bin/upnpc -a $local $1 $2 $3


local 이라는 변수에 eth0 이더넷의 IP 주소가 들어갑니다. 경우에 따라서 수정해서 사용하시길 바랍니다. 그 아래 줄은 정상적으로 서칭이 될 경우에는 코멘트 처리된 부분을 사용하시고 정상적으로 서칭이 되지 않을때에는 코멘트 아웃된 부분처럼 지정해서 사용해주시길 바랍니다.


그럼 아래와 같이 쉽게 실행이 가능합니다.


port [internal_port] [external_port] [protocol]


root@u5pvr-debian:~# port 21 21 TCP

upnpc : miniupnpc library test client. (c) 2005-2014 Thomas Bernard

Go to http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/

for more information.

upnpDiscover() error code=0

Found valid IGD : http://192.168.0.1:59297/etc/linuxigd/gateconnSCPD.ctl

Local LAN ip address : 192.168.0.12

ExternalIPAddress = 124.194.31.74

InternalIP:Port = 192.168.0.12:21

external 124.194.31.74:21 TCP is redirected to internal 192.168.0.12:21 (duration=0)

root@u5pvr-debian:~#



여기까지 글 마치도록 하겠습니다.


감사합니다.




댓글을 달아 주세요

  1. dean 신고">2017.11.28 14:45 신고

    portmapper 프로그램 소스만 있고 응용 프로그램은 없는데요. 응용프로그램 다운 받으려면 어떻게 해야하나요?

  2. dean 신고">2017.11.30 12:05 신고

    좋은글 답변 감사드립니다. ^^