给猛禽大虾的信:
......现有以下困惑,提出来希望得到你的指点,也可以大家一起探讨一下,以求共同提高!
1、 大家知道目前流行的分布式核心技术主要有三种(也即三种组件模型):微软的DCOM/COM+、OMG的CORBA、SUN的EJB。Borland公司的透明中介引擎MIDAS(BCB6以后改名为DataSnap)可以使用的通讯协议有以下几种:DCOMConntection(DCOM协议)、SocketConnection(TCP/IP协议)、WebConnection(HTTP协议)等等。应用程序服务器端是一个RemoteDataModule(分布式COM对象、OLE自动化对象)。那么我感到困惑的是,如果我使用SocketConnection(或WebConnection)的话,我用的算是哪种分布式核心技术呀?是DCOM吗?为什么?
2、 请看下面两段文档:
(1) DCOM动态的选择1024~65535之间的网络端口,在这些端口上Internet和Intranet之间的通信是不被允许的,所以不可能在Internet上可靠的使用DCOM通讯协议(尽管它在Intranet上表现的很完美)。此外,DCOM要用135端口实现一些重要的功能,而通常安装的防火墙要限制135端口的访问。(摘自MSDN英文版)
(2) DCOM是使用RPC进行通讯的。利用RPC功能进行通信时,就会向对方电脑的135端口询问可以使用那个端口进行通讯。这样,对方的电脑就会告知可以使用的端口号,实际的通讯将使用这个端口来进行。135端口起的是动态的决定实际的RPC通讯使用的端口的端口映射功能。(摘自一网络安全文章)
由文档1可以看出DCOM在Internet上表现不佳的原因,但我现在更感到困惑的是:DCOM到底能不能运行在Internet上?我们以前曾做过一个软件系统也是用DCOM,那时是运行于VPN环境里;但现在这个是要运行于Internet上呀,不知道能不能行得通???如果行的话,是否需要其他支持???
由文档2可以看出DCOM不能穿透防火墙得原因——即一般防火墙封了135端口。有没有哪位高手有什么解决方案可以绕过防火墙?
3、 现在我们用的是DCOMConnection,需要进行安全配置,DCOM的安全配置是比较麻烦的,将来产品卖出去,当然不会让用户自己去配置的,所以我们要把这种配置通过编程实现。讲解这方面技术的书籍比较少,只找到了一本。不知大虾有成功案例可以让小弟借鉴一下???
4、 其实,我们系统的安全需要并不是太高,所以我想改成SocketConnection,这样简单一些,也不用担心那么多事了;但在网上论坛看到的大家议论纷纷,意见不一,说用SocketConnection系统会很不稳定。也不知道不稳定到什么程度???我想知道你现在在用DCOMConnection还是SocketConnection,还是WebConnection???
回信:
天涯浪子,您好!
1、流行的的确是主要就这三种,BORLAND的MIDAS主要是基于MS的技术(因为WINDOWS平台的缘故)。DCOMConnection是基于DCOM的ORPC的,SocketConnection/WebConnection其实只是一个代理,把ORPC通过TCP/HTTP转换为本地COM调用而已。所以本质上还是DCOM。包括早先MIDAS支持的CORBA,其实也是通过CORBA的DII来代理DCOM请求而已,不是真正的CORBA应用。还有新的SoapConnection也是,只是用SOAP来代理DCOM请求而已,但在这里把原来依赖于DCOM的VARIANT类型的ClientDataSet数据包改成了通用的XML数据包,并在Linux下实现了新的独立于平台的ClientDataSet,实现了通过Kylix进行跨平台MIDAS开发,当然目前还仅限于客户端。
2、135-137等几个端口是Windows用于实现RPC和Windows本身的安全机制的,DCOM的ORPC也是基于RPC的,所以它的实现也要依赖于这些端口。因为Windows本身的安全机制还是比较脆弱的,所以一般连在Internet上的LAN都会在防火墙上关闭这些端口,并且一般只会开放几个需要用得上的端口,而不可能开放所有端口,这样的话,DCOM需要的135端口不能用就不能确定通信所需要的动态端口,而且即使开放了135也不够,由于不知道它会用什么端口进行RPC,又不可能全部开放,所以RPC还是不能进行,这就是DCOM不能用于Internet的原因。VPN等于是一个虚拟的远程LAN,可以就当作LAN(因为VPN的Tunnel中一般可以把全部端口打开,没有关系,Internet访问是进不了Tunnel的),当然可以用。但如果要直接用于Internet,唯一的办法就是打开防火墙的所有端口,那防火墙就形同虚设,所以是行不通的。这不是高手的问题,是安全的问题。
3、DCOM的安全机制完全依赖于Windows的域用户管理机制,在实际应用中很不方便,不只是配置的问题,很多用户的网络根本就没有域,这样DCOM就没法用了。要编程进行安全配置的前提是要能连通,那就要降低DCOM的安全级别,开放WINDOWS的安全验证,但在很多情况下,DCOM即使用GUEST也连不通,这种情况下用编程来进行安全配置也就没有意义了。
4、如果安全性要求不高,用SocketConnection是最好的,也是我用得最多的一种方式。不过它还是有一些问题的,比如对Callbacks的支持就有问题,还好我从来不用Callbacks,所以一般把SocketConnection的SupportCallbacks设置为false,情况就好很多。当然,除此之外,对不同的应用情况,还会有一些其它的问题,这就需要修改Scktsrvr和Socketconnection的源码,基本上都是可以解决的,比起DCOM来说,还是要好很多。不过即使安全性要求不高,也最好做一些简单的保护措施,最简单的就是修改SocketConnection的端口号,改一个较大的数,不要用默认的211。另外就是用Intercept,那就看你的水平了,想做到多安全都可以。
致
礼!
猛禽
raptorz@163.com
2003-03-11