1. 程式人生 > 實用技巧 >路由器上的upnp

路由器上的upnp

前言:

在路由器上,upnp的實現工具普遍都是miniupnpd,miniupnpd是一個實現了upnp協議的opensource專案名稱。這篇就以最新的miniupnpd版本來介紹從網站下載下來的原始碼,怎麼一步一步的在交叉編譯環境上編譯並且如何使用又是如何驗證的。

1.下載

http://miniupnp.free.fr/files
miniupnpd-2.1.tar.gz

2.解壓縮
tar -zxvf miniupnpd-2.1.tar.gz
3.編譯

 1 ./genconfig.sh
 2 ./genconfig.sh --leasefile --vendorcfg
 3 Step1: 把 Makefile.linux中的如下行遮蔽掉
 4 # LDLIBS += $(shell $(PKG_CONFIG) --static --libs-only-l libssl) # line 156
 5 Step2:
 6 IPTABLESPATH=/home/jennifer/Temp/iptables-1.8.5 make -f Makefile.linux CC=/opt/toolchain-mips_24kc+nomips16_gcc-6.3.0_musl-1.1.16/bin/mips-openwrt-linux-gcc
7 Step3:把 Makefile.linux中 的 名為 install的 target修改 為如下 8 DESTDIR = $(shell pwd)/rootfs 9 install: 10 $(INSTALL) -d $(DESTDIR)$(SBININSTALLDIR) 11 $(INSTALL) miniupnpd $(DESTDIR)$(SBININSTALLDIR) 12 $(INSTALL) -d $(DESTDIR)$(ETCINSTALLDIR) 13 $(INSTALL) netfilter/iptables_init.sh $(DESTDIR)$(ETCINSTALLDIR)
14 $(INSTALL) netfilter/iptables_removeall.sh $(DESTDIR)$(ETCINSTALLDIR) 15 $(INSTALL) netfilter/ip6tables_init.sh $(DESTDIR)$(ETCINSTALLDIR) 16 $(INSTALL) netfilter/ip6tables_removeall.sh $(DESTDIR)$(ETCINSTALLDIR) 17 $(INSTALL) netfilter/miniupnpd_functions.sh $(DESTDIR)$(ETCINSTALLDIR) 18 $(INSTALL) --mode=0644 -b miniupnpd.conf $(DESTDIR)$(ETCINSTALLDIR) 19 $(INSTALL) -d $(DESTDIR)$(PREFIX)/etc/init.d 20 $(INSTALL) linux/miniupnpd.init.d.script $(DESTDIR)$(PREFIX)/etc/init.d/miniupnpd 21 # $(INSTALL) -d $(DESTDIR)$(MANINSTALLDIR) 22 # $(INSTALL) --mode=0644 miniupnpd.8 $(DESTDIR)$(MANINSTALLDIR) 23 # gzip -f $(DESTDIR)$(MANINSTALLDIR)/miniupnpd.8 24 Step4: 25 make -f Makefile.linux install

備註:

要依賴iptables,在編譯iptables 應用層程式碼時,./configure 要務必加上選項--enable-shared, 另外在編譯upnp 程式碼時,要通過IPTABLESPATH=指明iptables

應用層程式碼的路徑。

執行完結果如下:

 1 jennifer@cdBSCMPL03:~/Temp/miniupnpd-2.1$ ls -l rootfs/* rootfs/*/*
 2 rootfs/etc:
 3 total 8
 4 drwxr-xr-x 2 jennifer jennifer 4096 Jul 9 15:57 init.d
 5 drwxr-xr-x 2 jennifer jennifer 4096 Jul 9 15:55 miniupnpd #this is a shell script
 6 rootfs/etc/init.d:
 7 total 4
 8 -rwxr-xr-x 1 jennifer jennifer 1640 Jul 9 15:54 miniupnpd
 9 rootfs/etc/miniupnpd:
10 total 28
11 -rwxr-xr-x 1 jennifer jennifer 673 Jul 9 15:54 ip6tables_init.sh
12 -rwxr-xr-x 1 jennifer jennifer 444 Jul 9 15:54 ip6tables_removeall.sh
13 -rwxr-xr-x 1 jennifer jennifer 1203 Jul 9 15:54 iptables_init.sh
14 -rwxr-xr-x 1 jennifer jennifer 1448 Jul 9 15:54 iptables_removeall.sh
15 -rw-r--r-- 1 jennifer jennifer 5117 Jul 9 15:54 miniupnpd.conf
16 -rwxr-xr-x 1 jennifer jennifer 1327 Jul 9 15:54 miniupnpd_functions.sh
17 rootfs/usr:
18 total 4
19 drwxr-xr-x 2 jennifer jennifer 4096 Jul 9 15:54 sbin
20 rootfs/usr/sbin:
21 total 208
22 -rwxr-xr-x 1 jennifer jennifer 209904 Jul 9 15:54 miniupnpd
23 jennifer@cdBSCMPL03:~/Temp/miniupnpd-2.1$

4.使用

在使用之前,一定要仔細閱讀下編譯後產生的幾個指令碼檔案,主要是看他們的相互聯絡,涉及的shell 指令在相應平臺上是否可用,必要時要做出適當的調整。其中ip6tables 開頭的指令碼是要編譯時候在config.h 有” #define ENABLE_IPV6才有用ENABLE_IPV6”才有用。
rootfs/etc/init.d/miniupnpd
rootfs/etc/miniupnpd/ip6tables_init.sh
rootfs/etc/miniupnpd/ip6tables_removeall.sh
rootfs/etc/miniupnpd/iptables_init.sh
rootfs/etc/miniupnpd/iptables_removeall.sh
rootfs/etc/miniupnpd/miniupnpd_functions.sh
指令碼啟動程序的方法:
sh /usr/sbin/iptables_init.sh
cp -f /etc/miniupnpd.conf /var/miniupnpd.conf
/usr/sbin/miniupnpd -f /var/miniupnpd.conf
指令碼停止程序的方法:
sh /usr/sbin/iptables_removeall.sh
killall -15 miniupnpd

5.配置檔案
命令啟動方式:/usr/sbin/miniupnpd -f /var/miniupnpd.conf

 1 # cat /var/miniupnpd.conf
 2 ext_ifname=ppp0.1
 3 listening_ip=br0
 4 port=0
 5 enable_natpmp=yes
 6 enable_upnp=yes
 7 bitrate_up=1000000
 8 bitrate_down=10000000
 9 secure_mode=no
10 system_uptime=yes
11 notify_interval=30
12 clean_ruleset_interval=600
13 uuid=DFF4486F-FFAB-0018-00D9-ACF1EC5CDB23
14 serial=ACF1CE6DEC10
15 model_number=1
16 deny 0-1024 0.0.0.0/0 0-1024

6.驗證

方法1:

方法2:

方法3: