前言:
- 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-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: