路由器上的upnp
前言:
- upnp是一種協議的名稱,全稱是Universal Plug and Play,中文名是即插即用,目的是在不需要使用者手動參與配置,即可在兩個終端裝置上完成埠對映功能。
- upnp協議的標準規範在"https://datatracker.ietf.org/doc/rfc6970/"上可以細看
- upnp協議的介紹,"https://zhuanlan.zhihu.com/p/40407669"講得更通俗易懂些
在路由器上,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-gcc7 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: