NAT面对NetMeeting该如何下手

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享




Windows NetMeeting采用的是H.323协议簇,此协议簇是由ITU-T(国际电信联盟电信标准化部门)颁布。本文首先提一下H.323协议,然后点一下NetMeeting,最后分析如何做NAT ALG。

H.323协议架构

以下是H.323的整个协议架构图:

image

from: http://en.wikipedia.org/wiki/File:Typical_H.323_Stack.png

H.323的协议流程如下:

  1. 通过H.225.0 Call Signaling建立连接(如果有网守则还包括RAS,但本文不考虑),并且协商H.245需要使用的端口;
  2. H.245协议交互过程,协商RTCP以及RTP端口;
  3. RTP/RTCP协议,传输音视频数据。

Data Applications中的协议用于传输非音视频数据,比如NetMeeting使用T.120来传输聊天数据,文件共享等,由于不会产生穿越的问题,所以本文不涉及。

所以H.323的架构还是非常清晰的,两类:连接控制以及数据传输。

NetMeeting和H.323

根据NetMeeting的官方文档【2】,NetMeeting使用了以下端口:

端口 意义
TCP/389 Internet Locator Server
TCP/522 User Location Server
TCP/1503 T.120
TCP/1720 H.225.0 Call Signaling
TCP/1731 Audio Call Control
Dynamic/TCP H.323 Call Control
Dynamic/UDP RTP

有几点需要注意的是:

  1. NetMeeting使用了非H.323的协议ILS以及ULS。本文不考虑;
  2. NetMeeting使用T.120作为非音视频数据传输;
  3. 在实际的抓包中,TCP/1731并没有出现,本文不考虑;
  4. 没有提及H.245以及RTCP,但是这两个协议确实会出现在NetMeeting的数据流中,考虑到有提及H.323 Call Control,并且符合H.245以及RTCP的TCP动态端口特征,不妨假定此项就是H.245和RTCP的总称。

在哪个地方会携带私网信息

以下叙述中,具体包格式请参见【1】。

H.225.0 Call Signaling的私网信息

此协议的交互采用的是以下的流程:

  1. 客户端向服务端(TCP/1720)端口发起setup请求,此时会携带客户端的IP/PORT信息,如果客户端在外网,需要将IP修改成内网IP(不要生成NAT会话);
  2. 服务端回应alerting;
  3. 服务端回应connect,在这个报文中,服务端会告诉自己的IP以及Port,以便后续客户端能够向服务端的此端口发起H.245连接请求,如下图所示:

image

不过面对这个数据包,得分两种情况考虑:

  1. 如果说服务端是在公网,此端口就不需要进行修改,但是这个端口需要记录下来,而且要打上H.245的标记,不然后面碰到以此端口的H.245协议,NAT将不会认识;
  2. 但是如果服务端处于内网(静态映射),IP和端口都需要修改,并且生成会话(注意标注此会话具有H.245特征),以便客户端发起H.245请求时能够匹配到。

H.245的私网信息

H.245会使用H.225.0中协商出来的端口,然后客户端会向服务端的此端口发起连接请求。在此次数据流中,会在以下几个数据包中协商RTP/RTCP将使用的端口:

  1. OpenLogicalChannel
  2. OpenLogicalChnanelAck
  3. OpenLogicalChnanelReject

以下是一个示例:

image

在这个例子中,开放的RTP/RTCP端口是49603,不过这只是其中的一个,RTP/RTCP会使用多个端口进行数据传输,所以:

  1. 在一个报文中可能会告知对端多个端口;
  2. 会有多个报文来告知对端自己的端口。

另外,还有以下特征:

  1. 客户端和服务端均会告诉对端自己开放的端口;
  2. 只要在OpenLogicalChannel, OpenLogicalChnanelAck, OpenLogicalChnanelReject中任何报文中告知了对方自己的端口,后续的RTP/RTCP都有可能使用到这些端口。

那么,NAT此时的策略有:

  1. 如果服务端(这个是针对最初的H.225.0连接而言,其实在后来的RTP/RTCP中,没有严格意义上的CS概念)在外网,客户端发送的私网信息需要做ALG(读者请考虑如何判别此为H.245连接),即要把IP和端口修改成公网的(可能会存在TCP reassemble现象,需要特别慎重),并且建立会话,以便让服务端能够主动式的访问此端口;服务端发送的IP/PORT信息不需要关心。
  2. 如果服务端在内网,那么服务端发送的私网信息需要做ALG,同时需要把IP和端口修改成公网的,并且建立会话,以便让客户端能够主动式的访问此端口;客户端发送的IP/PORT信息不需要关心。
  3. 只要是OpenLogicalChannel, OpenLogicalChnanelAck, OpenLogicalChnanelReject数据中的任何一种数据包,就需要进行1或者2步骤的操作。

经过H.245的ALG之后,已经建立了RTP/RTCP的会话,之后的音视频数据便可以顺利的在这些会话中传输了。

后记

通过以上的分析,可以看到,最基本的NetMeeting通信,有两个地方可能需要做ALG:

  1. H.225.0 Call Signaling的setup和connect;
  2. H.245中的OpenLogicalChannel, OpenLogicalChnanelAck, OpenLogicalChnanelReject。

参考

  1. http://www.packetizer.com/ipmc/h323/standards.html “H.323 Standards”
  2. http://support.microsoft.com/kb/158623 “How to Establish NetMeeting Connections Through a Firewall”
(1个打分, 平均:5.00 / 5)

雁过留声

Comments are closed.