teleme(常败将军)

1、引言
  这篇文章主要介绍如果配置分布式组件对象模型(DCOM)通过防火墙。首先假设读者已经熟悉TCP和UDP协议,并理解防火墙的一些基本概念。还有下面介绍的端口限制技术将工作在Windows NT环境下,Windows 95目前不支持该功能(但是不用担心,大部分情况下不需要)。还有一点注意的是,本文讨论的很多内容也适用于那些使用动态端口的远程过程调用(RPC)系统。 

2、实现原理
  不像大部分Internet应用程序都是采用固定的TCP或UDP端口,DCOM在运行的时候给每个服务于DCOM对象的可执行进程动态的赋予一个TCP端口和一个UDP端口。尽管一个进程可以容纳2000个客户和50000个对象,每个要和该进程中的对象进行通信的客户都是通过相同TCP或UDP端口。客户端使用DCOM的服务控制管理者(SCM)提供的服务来得到一个特定对象相关的端口。SCM总是运行在计算机的一个固定的网络端口上,通常对于TCP和UDP都是135号端口。SCM也提供多个基于RPC(不是基于DCOM/ORPC)的服务,他们用于处理下列操作,如:"为我生成一个新的COM类对象,并告诉我它在哪个TCP和UDP端口上","我拥有一个接口指针,告诉我到哪里用它"等等。关于进程和DCOM协议的一个更详细的解释可以参见分布式对象协议--DCOM/1.0。
  DCOM的动态端口分配特点给程序员提供了很大的自由度,并且也免除了管理员配置应用程序端口和解决多个应用程序竞争一个端口的麻烦。不幸的是,因为DCOM缺省的情况下是在1024-65535之间随机选择端口给应用程序的,导致防火墙的配置比较麻烦。如果为了使用DCOM,把这个范围的端口都放开的话,那么就存在着严重的安全漏洞。微软的开发者认识到这点,并实现了一个功能来允许你限制DCOM分配端口的范围。
  有一点要提示的,在DCOM中回调功能不是在同一个连接上处理的。当一个服务器向客户发起了一个回调,它产生了一个新的到客户端的连接,在这个独立的信道上发送调用方法。换句话说,DCOM将回调看作任何其他的客户/服务器调用一样,除了"客户"变成了服务器,"服务器"实际上是客户。某些情况下(比较少见),如果你的防火墙限制了只许指定的端口从内部连到外部,你需要在客户端配置端口限制。
  注意,如果你要在防火墙的环境中用回调功能,你必须使用TCP。原因是:当服务器对客户发起了一个调用,源端口不在允许的范围中。因此,当客户向服务器的源端口回复信息时,被防火墙拒绝。而这对于TCP则不算什么问题,因为大部分防火墙都跟踪TCP连接,允许连接的双向通信,不管源端口配置,只要这个端口来自于防火墙内部的机器。
  最后要注意的是,客户必须能够以真实的IP地址连到服务器。不能在防火墙上使用地址转换功能。这是因为DCOM将原始IP地址存在接口配置包中,如果客户不能连到包中的地址,那么就导致通信失败。

3、具体的配置方法:
3.1 配置DCOM,只许使用TCP
下面是各个系统平台间采用的协议
平台 协议
Windows NT4.0 ?---à Windows NT4.0 UDP
Windows NT5.0 ?--à Any TCP(*)
Windows 95/98 ?---à Any TCP
DCOM for UNIX ?---à Any TCP

l 在WindowsNT4.0客户尝试连到非WinNT4.0平台的DCOM服务器情况下,尝试通过UDP连接需要花费30-45秒的延时。Win95、Win98和WinNT5.0、DCOM for Linux(包括微软的DCOM for Linux产品和AG的Entrex产品)总是使用TCP协议。

  WindowsNT4.0通常都采用UDP协议,因为测试表明某些情况下UDP要比TCP性能好些。但是要想让UDP应用通过防火墙并且不影响安全是很困难的。所以首先要确保采用在所有Windows NT上缺省使用TCP协议。方法是:在HKEY_LOCAL_MACHINE/Software/Microsoft/Rpc注册表项的DCOM协议列表中,将"NCACN_IP_TCP"放在最上层。要想删除连接TCP服务器的30-45秒的延时,需要在Windows NT的客户端也进行想用的设置。
WindowsNT5.0的DCOM实现缺省采用的就是TCP,因为不可能在UDP上实现SSL和SNEGO安全协议。

3.2 限制TCP端口的范围
所有与设置DCOM端口范围的注册表项都在下面列出了,他们都在HKEY_LOCAL_MACHINE/Software/Microsoft/Rpc/Internet主键下(需要手动生成)。注意:只需要在服务器端的机器上设置,客户端会在SCM的控制下自动选择。
还有,必须用regedt32.exe来配置下面的注册项,regedit.exe当前还不支持REG_MULTI_SZ类型。但你改变了下面的注册项后,必须重新启动机器。
名字 类型 值 描述
Ports REG_MULTI_SZ 每行制订一个端口范围3000-40005142 一个或多个端口范围
PortsInternetAvailable REG_SZ Y 总是设置为Y
UseInternetPorts REG_SZ Y或N 设置为Y,则Ports中的数值表示允许使用的端口范围。设置为N,则Ports重的数值表示不允许使用的端口范围

强烈推荐:设定端口号>5000的一个许可范围。端口号低于5000可能正在被其他应用程序使用,从而产生冲突。

3.3 限定特定应用程序的Internet访问权限
可以控制DCOM应用程序通过指定的端口范围来访问Internet。步骤如下:
(1) 改变上面注册表项UseInternetPorts为N,以至于DCOM对象服务器(RPC服务器)不能自动通过这些端口。重新启动机器
(2) 将下面的代码片断加入到DCOM对象服务应用程序的CoInitializeEx()前面。
RPC_POLICY rp;

p.Length = sizeof (RPC_POLICY);
rp.EndpointFlags = RPC_C_USE_INTERNET_PORT;
rp.NICFlags = RPC_C_BIND_TO_ALL_NICS;

hr = RpcServerUseAllProtseqsEx (RPC_C_PROTSEQ_MAX_REQS_DEFAULT,NULL,&rp);
(3) 将rpcrt4.lib加入到Makefile文件的link命令行中。

3.4 配置防火墙
在你的服务器和Internet之间的防火墙需要配置如下:
(1) 禁止所有外部到你的服务器的进入流量
(2) 允许从所有客户到你的服务器的TCP 135端口(UDP 135)的进入流量
(3) 允许从所有客户到你服务器在Ports范围中的TCP端口的进入流量
(4) 如果正在使用回调功能,配置允许连接起始于你的服务器所有TCP的所有相关端口的访问。

警告:包含在WindowsNT4.0 Service Pack4中的DCOMCNFG工具也提供手段配置端口范围,不需要直接编辑注册表项。但是不好的是,使用该工具经常导致许多RPC应用程序在下次重启机器后工作不正常。如果发生这种事情,删除HKEY_LOCAL_MACHINE/Software/Microsoft/Rpc/Internet注册表项,重新启动机器。