作者:
dagger
无崖阁
xyg.ods.org

版本:
1.0 2003-06-22
初始版本

一、引言
现在Linux的NAT和firewall只支持MSN Messenger的文字聊天,
本文介绍了如何让Linux的NAT和firewall支持MSN Messenger的语音聊天、文档传送等其他功能的方法。

二、几个基本概念
1、Linux NAT
Network Address Translation (NAT)是IETF的一个标准,用来使在私有网络中的PC和设备共享一个公开的可路由的IPv4地址。
使用NAT的一个主要原因是缓解现在IPv4地址资源的不足。通常NAT被用在网关设备中,位于私有网络和公共Internet之间。
当IP包要通过网关时,NAT就会把私有IP地址、端口和公开的IP地址、端口作转换。
Linux 2.4内核中NAT分为两种,Source NAT (SNAT)和Destination NAT (DNAT)。Source NAT就是转换IP包头的源地址,
SNAT总是在POSTROUTING中处理,即包被发送出去之前。Masquerading(IP伪装)是SNAT的一种特别形式。
Destination NAT就是转换IP包头的目的地址,DNAT总是在PREROUTING中处理,即在收到包后在路由处理之前。
Port forwarding、load sharing、和transparent proxying都是属于DNAT。
Linux 2.4内核的NAT流程图:
_____ _____
/ \ / \
PREROUTING -->[Routing ]----------------->POSTROUTING----->
\D-NAT/ [Decision] \S-NAT/
| ^
| |
| |
| |
| |
| |
| |
--------> Local Process ------

2、Linux Packet Filter
在Linux中使用包过滤(Packet Filter)来实现防火墙(firewall)的功能。Linux在内核中检查通过的包头,
决定任何包的命运,可能是丢弃(DROP)这个包,或允许(ACCEPT)包通过,或其他更复杂的动作。使用包过滤主要能够实现控制、
安全和警戒的功能。Linux 2.4内核中有三个过滤规则表,他们是INPUT、FORWARD和OUTPUT。对于数据包,假如是发给本机的,
则交INPUT处理;假如是发给其他PC或设备的,则交FORWARD处理;假如是由本机发送的,则交OUTPUT处理。
Linux 2.4内核的Packet Filter流程图:
_____
Incoming / \ Outgoing
-->[Routing ]--->|FORWARD|------->
[Decision] \_____/ ^
| |
v ____
___ / \
/ \ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
----> Local Process ----


3、UPnP
Universal Plug and Play (UPnP)是一种架构,用来实现现在流行的PC、智能设备或装置(特别是家庭中的)的端到端的网络连接。
UPnP基于Internet标准和技术,如TCP/IP、HTTP和XML,支持“零配置”网络和自动发现,一个设备能够动态地加入一个网络,
获得一个IP地址,声明自己的名字,向其他设备回应自己的能力,并学习到网络中其他设备的存在和能力。进一步,
一个设备能够平滑地并自动地离开这个网络,不会留下任何不期望保存的状态。UPnP会集了多个厂商的合作,以建立标准的
Device Control Protocols (DCPs),使用XML来表达,通过HTTP来通信,并提出了Internet Gateway Device (IGD)规格。

4、MSN Messenger使用的端口
微软的MSN Messenger软件是流行的实时通行软件,包含很多功能,根据微软的资料这个软件需要使用很多端口。
文字聊天:TCP 1863或80
音频和视频聊天:UDP 5004-65535 动态分配
应用共享和白板:TCP 1503
文档传输:TCP 6891-6900 允许一次传10个文档
远程助手:TCP 3389

三、碰到的问题
现在我这里的环境是在网关的电脑上装了Redhat Linux 8.0,配置了Masquerading能够让内部网络中的电脑共享上网;
配置了firewall限制外部电脑对网关的部分端口的访问。内部网络中的电脑除了MSN Messenger的文字聊天能够正常和外界通信外,
其他如音频聊天、文档传输等功能都无法实现。
NAT的问题:
* 在NAT后面的电脑使用私有IP地址,MSN Messenger会把这个私有IP地址的数据传送给对端,而NAT只能转换IP包头的内容,
无法转换IP包数据中包含的私有地址。
* NAT需要Port forwarding (端口映射)来使外部IP地址和端口和内部电脑IP地址和端口对应。MSN Messenger动态使用端口,
需要NAT能动态端口映射。
* 对于使用静态端口的情况,在NAT后面只能有一台电脑使用此功能。
firewall的问题:
* 对应MSN Messenger的TCP和UDP端口不能禁止,需要都开放。

四、解决方法
1、方案
MSN Messenger使用了UPnP,我们只要在Linux网关中支持UPnP,就能让MSN Messenger实现自动获得相应的NAT或firewall信息,
从而能够使用正确的IP地址和端口来通信。
现在已有Linux下的UPnP研发包(libupnp)和支持Internet Gateway Device规格的应用软件(linux-igd)。

2、获得软件包
libupnp-1.2.1.tar.gz
http://sourceforge.net/projects/upnp
linuxigd-0.92.tgz

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!