软件开发培训班 >> 网络技术 >> 网络搭建
代理服务器的研究与实现 |
|
代理服务器作为连接Internet与Intranet的桥梁,在实际应用中发挥着极其重要的作用。它可用于多个目的,最基本的功能是连接,此外还包括安全性、缓存、内容过滤、 访问控制管理等功能。目前市场上主要是国外的代理服务器产品,而国外的产品并不能很好的适应国内企业的需求。本文实现了一个代理服务器系统,可代理HTTP, FTP, TELNET, SMTP, POP这五个常用协议,此外还有用户管理和拨号等功能。 随着Internet与Intranet的飞速发展,作为连接Internet与Intranet的桥梁,代理服务器在实际应用中发挥着极其重要的作用。它可用于多个目的,最基本的功能是连接,此外还包括安全性、缓存、内容过滤、访问控制管理等功能。具体来说主要有以下特点: (1) 可通过一个公用IP地址供多个用户同时访问Internet 在代理服务器的众多功能中,安全性是一个突出且敏感的功能。绝大多数企业、部门在使用代理服务器的时候,都会考虑这个问题,把它作为选购代理服务器产品的重要依据。目前市场上流行的代理服务器,像Microsoft Proxy Server、Netscape Proxy Server、WinGate等,都是国外的产品,虽然功能和性能等方面都还不错,但毕竟是别人的东西,从保证安全性的角度出发,很有必要开发一个自己的代理服务器。而且,在实际使用国外这些产品的过程中,发现它们并不能很好的满足国内企业的要求。比如说,访问日志功能,虽然绝大多数的国外产品都有,但是,这些日志功能都是定死的,不能够根据企业的要求来灵活的生成,而这个功能又是国内很多企业所必须的。因此研究并实现代理服务器不仅有助于我们深入了解各种Internet协议的实现细节,掌握代理的技术,而且可实现软件的国产化,满足国内用户的安全性需求,对于社会和个人都是有积极意义的。 代理服务器的实现模型和总体框架 代理服务器(Proxy)是接收或解释客户端连接并发起到服务器的新连接的网络节点。它是客户端/服务器关系的中间人,这意味着代理服务器必须满足以下条件:
根据代理服务器工作的层次,一般可分为应用层代理、传输层代理和SOCKS代理。应用层代理工作在TCP/IP模型的应用层之上,它只能用于支持代理的应用层协议(如HTTP,FTP)。它提供的控制最多,但是不灵活,必须要有相应的协议支持。如果协议不支持代理(如SMTP和POP),那就只能在应用层以下代理,也即传输层代理。传输层代理直接与TCP层交互,更加灵活。要求代理服务器具有部分真正服务器的功能:监听特定TCP或UDP端口,接收客户端的请求同时向客户端发出相应的响应。另一种代理需要改变客户端的IP栈,即SOCKS代理。它是可用的最强大、最灵活的代理标准协议。SOCK V4允许代理服务器内部的客户端完全地连接到外部的服务器,SOCK V5增加了对客户端的授权和认证,因此它是一种安全性较高的代理。 传输层代理主要有两种方案:端口重定向和客户端服务器代理。端口重定向比较简单,代理服务器通过监听特定的TCP或UDP端口接收连接,希望连接到外部网络的客户端通过该端口,连接到代理服务器,代理服务器使用另外的端口和IP地址发出对远端目的地的连接。建立连接以后,所有客户端和远端目的地的数据都由代理服务器转发。客户端服务器代理需要安装客户端,用户启动与外部网络通信的程序时,代理客户端封装包并直接转发给代理服务器。代理服务器打开封装并将包传输给外部网络。接到响应时,代理服务器封装数据并转发给客户端。这种方案有一个严重缺点,由于客户端程序的安装,改变了TCP/ IP栈的工作方式,使代理复杂化,增加了发生问题的机会。
系统由七大模块组成。TELNET代理模块、HTTP代理模块、FTP代理模块、SMTP代理模块和POP代理模块分别实现了对应协议的代理。用户管理模块贯穿整个代理服务器系统,主要负责对用户的认证和访问权限控制等。拨号连接模块是专为那些通过拨号访问Internet的用户提供的服务。 代理服务器的实现 本代理服务器系统建立在Windows NT平台上,基于WinSock网络通信接口,使用Microsoft Visual C++,利用MFC类库中提供的两个Socket类CAsyncSocket和Csocket。这两个类不仅使我们可以用面向对象的方法来进行Socket编程,而且它们还分别在较低和较高层次上封装了Windows Sockets API,为程序员开发Socket程序提供了便利。而图2中五种协议的代理实际上是设计此软件时涉及的五个基本对象,这五个对象涉及五种协议和五种代理服务,代理服务不同则对象的属性及行为均不同,因此很自然地用C++中的五个类来对应这五个对象。即CTPSocket(Telnet代理)、CFPSocket(FTP代理)、CSPSocket(SMTP代理)、CPPSocket(POP代理)、CWPSocket(WWW代理),它们都是CAsyncSocket类的子类。显然这样设计既考虑了实际需求,又很好地利用了C++的面向对象程序设计的优点,同时由于每一个类分别代表一种服务,封装了其实现细节,有利于程序的移植、扩展和维护。下面以Telnet代理(CTPSocket)为例来说明实现的细节。 2.1 TELNET协议 与其它应用协议不同的是,TELNET允许其客户端与Internet上任何服务器的每个协议端口建立TCP连接,并进行TCP会话,用户可以利用TELNET的这一功能检测其它协议。如用户可以把TELNET客户端连到端口25(SMTP的周知口)来实现Internet e_mail的发送或者连到端口110(POP的周知口)来实现Internet e_mail的接收等等。因此TELNET代理的实现是其它代理实现的基础,可以用TELNET代理来测试其它代理。 2.2 TELNET代理的实现
其它几个协议的实现与TELNET在TCP连接上是类似的。其中FTP协议特殊一点,它使用了两个TCP连接,控制连接和数据连接。在整个FTP处理过程中,控制连接起传输控制信息的作用,它始终保持主动状态。数据连接负责传输用户需求的数据。当启动FTP代理服务时,系统首先启动守护进程(默认端口为21),FTP客户向该端口发送控制连接请求,与代理服务器建立控制连接,然后代理服务器与远端FTP服务器建立控制连接。控制连接建立成功后,FTP客户与代理服务器(默认端口20)建立数据连接,代理服务器进而与远端FTP服务器建立数据连接,数据连接成功后,FTP客户和远端FTP服务器就可以进行数据的传输了。 代理服务器的其它功能 3.1 用户管理 3.2 拨号连接 结束语 本文分析了代理服务器工作的基本原理,并对其开发作了较深入的研究。实际开发了一个代理服务器系统,在实验室进行一系列功能测试后,现已在某企业网上正式运行。运行结果显示,系统能稳定地代理各类Internet访问服务;企业利用系统基于用户的管理机制,加强了访问管理和控制。可以说系统很好地适应了企业的需求,在企业的整个管理系统中起了不可忽视的作用。 |