[转帖]让Linux NAT服务器支持UPnP

Web、Mail、Ftp、DNS、Proxy、VPN、Samba、LDAP 等基础网络服务
回复
头像
jazzi
帖子: 532
注册时间: 2005-10-16 23:26
来自: 泉州
联系:

[转帖]让Linux NAT服务器支持UPnP

#1

帖子 jazzi » 2006-06-17 14:41

作者:Nanu
如需转载请注明作者,谢谢!
参考文献:
《UPnP on your Linux 2.4 firewall how-to》 by bijl
《让 Linux NAT 服务器支持 UPnP》 by lonestar
《UPnP为我们献上一道怎样的大餐》 by Sharon Crawford
=========================================

注意:如果对网络安全要求较高或要求高可控制性的网络,则不要安装配置UPnP支持,否则会导致网络NAT映射比较混乱,从而引发许多问题。建议小型网络或者家庭网络使用UPnP。

最近经常使用一些P2P类型软件,发现老得在Linux服务器上手动设置NAT,非常麻烦,而看着许多P2P软件都支持UPnP就眼馋,如果能让Linux支持UPnP那就简单方便多了!于是在网上搜索了一下有关让Linux支持UPnP的文章,于是就写了这篇文章。

一、什么是UPnP

1. UPnP简介
--------------
UPnP(Universal Plug and Play)技术对即插即用进行了扩展,它简化了家庭或企业中智能设备的联网过程。在结合了UPnP技术的设备以物理形式连接到网络中之后,它们可以通过网络自动彼此连接在一起,而且连接过程无需用户的参与

UPnP规范基于TCP/IP协议和针对设备彼此间通讯而制订的其它Internet协议。这就是它之所以被称作"通用(Universal)" 的原因所在--UPnP技术不依赖于特定的设备驱动程序,而是使用标准的协议。UPnP设备可以自动配置网络地址,宣布它们在某个网络子网的存在,以及互相交换对设备和服务的描述。基于Windows XP的计算机可以充当一个UPnP控制点,通过程序界面对设备进行发现和控制。

如果与以前的即插即用相比,这种技术似乎并不具有什么革命性的意义。在操作系统中增加即插即用技术使得在单个计算机上安装、配置和添加外设的工作变得更容易了。但是UPnP为家庭用户或者小型办公环境中的非专业用户所带来的是一道更加美味的"大餐",他们可以利用UPnP玩多人游戏,进行实时通信(Internet电话,电话会议)以及使用类似Windows XP的远程协助这样的其它技术。

2. NAT 穿越技术
------------------
NAT穿越技术允许网络应用程序对它们是否位于一个具有UPnP能力的NAT设备之后进行检测。然后,这些程序将获得共享的全球可路由IP地址,并且配置端口映射以将来自NAT外部端口的数据包转发到应用程序使用的内部端口上--所有这一切都是自动完成的,用户无需手动映射端口或者进行其它工作。 NAT穿越技术允许网络设备或者点对点应用程序通过动态开启和闭合与外部服务之间的通信端口穿过NAT网关与外界通信。

二、在Linux中部署UPnP支持

我们假设该Linux的内核版本是2.4.x,使用拨号上网,外网接口是ppp0,内网接口是eth0,并且已经启用iptables设定了 NAT。

在Linux中部署UPnP主要使用2个软件的配合:UPnP SDK for Linux和LinuxIGD。

下载地址:
注意:要下载upnpsdk-1.0.4.tar.gz,1.0.4以上的版本不能和LinuxIGD很好的协同工作!

A. 安装:
----------
1. 解包UPnP SDK

代码: 全选

# tar xzvf upnpsdk-1.0.4.tar.gz
2. 修改源代码
为了能够使Windows MSN Messenger在UPnP下正常通讯,所以必须修改源代码:

代码: 全选

# cd upnpsdk-1.0.4
# vi src/ssdp/ssdplib.c
将第406行的:
SelfAddr.sin_addr.s_addr = inet_addr(SSDP_IP);
改为:

S
elfAddr.sin_addr.s_addr = htonl(INADDR_ANY);
3. 编译安装UPnP SDK

代码: 全选

# make
# make install
4. 解包Linux-IGD

代码: 全选

# tar xzvf linuxigd-0.92.tgz
5. 编译安装Linux-IGD

代码: 全选

# cd linux-igd
# make
# make install
B. 配置
--------
1. 增加多播路由

代码: 全选

# route add -net 239.0.0.0 netmask 255.0.0.0 eth0
2. 为iptables建议一个软链接

代码: 全选

# cd /usr/sbin
# ln -s /sbin/iptables ./
启动UPnP

代码: 全选

# upnpd ppp0 eth0
诊断UPnP运行状态

代码: 全选

# tail /var/log/messages
如果能够看到:
Dec 14 16:01:49 doorway -- MARK --
Dec 14 16:02:15 doorway upnpd: The Linux UPnP Internet Gateway Device Ver 0.92 by Dime (dime@gulfsales.com)
Dec 14 16:02:15 doorway upnpd: Special Thanks for Intel's Open Source SDK and original author Genmei Mori's work.
则说明UPnP已经成功启动。

C. 测试
--------
以支持UPnP的P2P网络电视PPLive为例,在PPLive中打开UPnP支持选项,然后连接一个频道。
在Linux中执行:

代码: 全选

# tail /var/log/debug -f
如果能看到:
Dec 14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 17 ExtPort: 3226 Int: 10.0.0.2.3226
Dec 14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 6 ExtPort: 3226 Int: 10.0.0.2.3226
Dec 14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 6 ExtPort: 3156 Int: 10.0.0.2.3156
Dec 14 16:56:33 doorway upnpd: AddPortMap: RemoteHost: (null) Prot: 6 ExtPort: 3156 Int: 10.0.0.2.3156
则说明PPLive已经向UPnP请求进行端口映射了。只要看到这样的字样,就说明UPnP已经完全工作起来了。

[ 本帖最后由 Nanu 于 2005-12-14 18:19 编辑 ]
platinum 回复于:2005-12-14 18:08:13

比特精灵有寻找网络中 UPnP 并自动打开端口的功能,一直想让 Linux 也支持,现在终于有方法了 ^_^
platinum 回复于:2005-12-14 18:14:48

看到一个小问题
引用:
1. 增加广播路由
# route add -net 239.0.0.0 netmask 255.0.0.0 eth0


这不是“广播”,而是“多播”,为什么会用到多播还不清楚,不知道 UPnP 的工作原理。。。。
Nanu 回复于:2005-12-14 18:19:12

啊!对对对!应该是多播!呵呵,谢谢斑竹啊!
skylove 回复于:2005-12-15 00:29:04

因为upnp用到了udp1900端口进行广播,否则它根本不知道内网内存在着多少机器有开着upnp的(注意,在我的实际观察中,目的地是广播地址),因此在一个比较大的子网中,upnp容易导致广播风暴,而且是一定时间搜索一次,所以干扰更大。在winxp中,该服务默认是开启状态,即会对外不断发 1900端口的询问。

由于我管理的网原则上是禁止bt类软件的,因此直接在交换机上把1900口是封锁了的。

别爱我我没钱 回复于:2005-12-15 11:31:23

哈,回头我也试试.
gowind 回复于:2005-12-15 13:06:36

在没看这个帖子的时候,我刚远程布置过这个东西,但还没有来的及测试。其实安装并不难,就是大家都没想到linux能支持这个东西,那两个版本的软件的东西都是好几年前出的东西了。不过现在已经有了更新版本的了,sdk 到了1.2.2,igd到了1.0
bingosek 回复于:2005-12-15 17:17:20

引用:原帖由 skylove 于 2005-12-15 00:29 发表
因为upnp用到了udp1900端口进行广播,否则它根本不知道内网内存在着多少机器有开着upnp的(注意,在我的实际观察中,目的地是广播地址),因此在一个比较大的子网中,upnp容易导致广播风暴,而且是一定时间搜索一 ...

根据我看的文档,multicast和broadcast都用了,但broadcast只用在dhcp和duplicate IP detection上
参考www.upnp.org上文档:<UPnP Device Architecture v1.0.1 Draft >

http://www.upnp.org/resources/documents ... 31202s.pdf
skylove 回复于:2005-12-15 18:05:40

ok,谢谢了~~~ 等下吃了饭就去拜读
linuxpiao 回复于:2005-12-17 15:30:28

先收下......
flycolt 回复于:2005-12-20 09:58:49

这个upnpd支持的连接的数量有限,用户少的时候还行,我试过在小区接入中使用过(200用户左右同时在线),做nat的服务器就慢得不行了,top看upnpd cup占用率居然99%,甚至夸张到在机器的控制台上敲字都得等10几秒才能出来。
ybbnew 回复于:2005-12-20 10:49:55

是啊,用这个还得小心。以前试过,人一多的话,CPU占用率就很高了,最后还是抛弃了。
急不通 回复于:2006-03-02 10:26:38

就向上面说的,upnp是无法用在大网络上的。其解决NAT穿透问题的方式比较简单,但开销就太大了。而ALG方式呢,要针对各个协议分别来实现NAT穿透功能,很精确、开销也小。当然,也存在问题——每种新的多通道的会话通讯协议,都要配备一个专门实现的ALG部分。



原文链接:http://bbs.chinaunix.net/viewthread.php?tid=668952
转载请注明作者名及原文出处
You make it fun
It will make you fun
gman3025
帖子: 151
注册时间: 2007-01-13 18:55

#2

帖子 gman3025 » 2007-03-16 13:28

编译后出现以下结果:
………………
In file included from gena_client.c:38:
../inc/gena/gena.h:50:23: error: uuid/uuid.h: No such file or directory
gena_client.c: In function ‘genaSubscribe’:
gena_client.c:41: error: ‘uuid_t’ undeclared (first use in this function)
gena_client.c:41: error: (Each undeclared identifier is reported only once
gena_client.c:41: error: for each function it appears in.)
gena_client.c:41: error: expected ‘;’ before ‘uuid’
gena_client.c:41: warning: implicit declaration of function ‘uuid_generate’
gena_client.c:41: error: ‘uuid’ undeclared (first use in this function)
gena_client.c:41: warning: implicit declaration of function ‘uuid_unparse’
make[2]: *** [gena_client.o] 错误 1
make[2]: Leaving directory `/home/fatality/Desktop/upnpsdk-1.0.4/src/gena'
make[1]: *** [all] 错误 2
make[1]: Leaving directory `/home/fatality/Desktop/upnpsdk-1.0.4/src'
make: *** [upnp] 错误 2

这是什么回事啊?请教
回复