现在的位置: 首页 > 综合 > 正文

如何编写并配置局域网内FTP服务器程序

2013年09月22日 ⁄ 综合 ⁄ 共 2752字 ⁄ 字号 评论关闭
本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=31794243),在CSDN作同步更新。如需转载,请保留本段文字,并发邮件通知:zhangmeng@sina.com

 

如何编写并配置局域网内FTP服务器程序

 

一、FTP协议握手过程

 

要理解FTP协议的握手过程,首先需要理解两个基本概念:

1.       FTP协议需要服务端程序打开两个端口。一个作为监听端口,通常情况下为21,但是建议在代码编写过程中,将此端口设置为可配置端口,以防在系统实施过程中与其他系统冲突。另一个端口作为数据传输端口,由监听端口获得连接请求后打开并连接客户端,通常使用1024以上的非保留端口。在代码编写过程中,建议可以设置传输端口可使用范围,因为大多数企业使用了防火墙等网络安全设备,并非所有端口都可以暴露给Internet,而这也是广域网访问局域网内FTP主机的技术限制之一。

2.       FTP协议有两种连接方式:主动模式(Port模式)、被动模式(Passive模式),其区别在于由哪一方指定传输端口,因服务端连接的主、被动关系而命名。如果由客户端指定端口,服务端主动连接则称为主动模式;如果由服务端指定端口,客户端主动连接则称为被动模式。

 

了解了这两个基本概念后,我们分别以图形化的方式阐述两种连接模式的过程。

1.       主动模式

a)       服务端程序在监听端口(21)上监听连接请求;客户端选择可用端口1531连接服务端,先后发送命令“USER ****”、“PASS ****”,验证用户名密码。如果验证通过,服务器返回以“230”开头的字符串(以下简称为“230”),通知客户端验证通过。如果验证未成功,则返回“530”。

b)      客户端发送命令“PORT 172,16,0,1,5,252”,通知服务端连接IP地址为172.16.0.115325*256+252)端口。服务器将返回“220”。

c)      服务器选择一个可用端口20,连接172.16.0.1:1532。如果无法获得可用端口,返回“421”;如果无法连接客户端,返回“425”;成功则返回“150”。

d)      客户端返回“ACK”,表示连接成功。至此,握手过程完成。

2.       被动模式

a)       服务端程序在监听端口(21)上监听连接请求;客户端选择可用端口1531连接服务端,先后发送命令“USER ****”、“PASS ****”,验证用户名密码。如果验证通过,服务器返回以“230”开头的字符串(以下简称为“230”),通知客户端验证通过。如果验证未成功,则返回“530”。

b)      客户端发送“PASV”命令,要求服务端程序以被动模式连接。

c)      服务端程序挑选可用端口5660,并返回“227 Entering Passive Mode (172,16,0,1,22,28).”。通知客户端连接IP地址为172.16.0.1566022*256+28)端口。

d)      客户端通过端口1532连接172.16.0.1:5660

e)       服务端返回“ACK”,表示连接成功。至此,握手过程完成。

 

二、不同网络环境的分析

在实际使用情况中,服务器和客户端所处的网络环境可分为一下四种:在同一网络中;服务器在公网,客户端在局域网;服务器在局域网,客户端在公网;两者在不同的局域网中。下面就分别叙述在四种网络环境中可能导致的问题。

1.  在同一网络中

这是最理想的使用环境。但是如果两者之间有防火墙,那么连接上也会出现一点问题,但是很容易解决。

如果使用主动模式,则客户端的端口传入访问受限,服务器连接客户端指定端口时,可能会因为防火墙阻止而失败。

同理,如果使用被动模式,服务端传入访问受限,则客户端连接服务器指定端口时,可能因防火墙阻止而失败。

可以通过在防火墙上开放一部分端口解决这个问题。

 

2.  服务器在公网,客户端在局域网

这是一般会出现的情况。两者之间无法直接访问,如果防火墙设置合理,则客户端可以连接服务器指定端口,但是服务端无法连接客户端指定端口。

根据上面所讲的FTP握手方式,很容易得出解决方法,即使用被动模式(Passive模式)连接,由客户端主动连接服务端指定端口。

当然,如果客户端防火墙指定了端口映射的话,那么也可以使用主动模式。

 

3.  服务器在局域网,客户端在公网

这种情况比较少见。两者之间也无法直接访问。跟第二种情况相反,可以使用主动模式连接,或者设置服务端端口映射。

 

4.  两者在不同的局域网中

这种情况在企业环境中很常见。公司内部实施的系统会把FTP服务器配置在局域网内,但是又会有需求:员工不在公司时也要能访问到。那么员工在外部访问时使用的网络就很有可能处于另一个局域网内。

我们可以分析下在这种情况下会遇到的问题,分析的基础是服务端端口映射已经设置正确。如果不能设置不在本文讨论范围。

主动模式:客户端可以顺利连接服务端监听端口,并发送指定端口,要求服务端连接。但是一般情况下,程序都是使用微软提供的MFC类库,或者其他封装好的FTP连接函数。这些函数发送PORT命令时,只能发送本机的IP地址。而现在本机的IP地址是局域网内部的地址,服务端无法连接!即使客户端程序不使用封装好的函数,可以指定发送广域网中的IP地址,也不能保证客户端防火墙做了端口映射。所以,主动模式不能使用。

被动模式:客户端可以顺利连接服务端监听端口,服务端收到PASV命令后,返回本机IP地址和端口。这时候问题就出现了:服务端返回的也是服务器在局域网内的IP地址,客户端无法连接!

从上面的分析我们可以知道,当服务器和客户端在不同的局域网内时,普通的程序将无法顺利连接。我们需要对程序进行修改,使服务端程序在接收到PASV命令后,返回公网的IP地址。那么客户端可以通过公网IP地址连接到服务端路由,再经过路由端口映射,连接到服务端。

 

三、总结

如果要基于FTP协议,编写应用服务器,那么要注意以下几点:

1.       应用服务器的监听端口要可配置。

2.       应用服务器的数据传输端口要可配置。

3.       应用服务器在Passive模式下,可以选择返回本机IP地址,还是公网IP地址。

4.       实施时,在路由、防火墙等设备上做好端口映射。

本文知识产权归karman所有,首发于博客中国(http://www.blogcn.com/blog/trackback.asp?mydiary=31794243),在CSDN作同步更新。如需转载,请保留本段文字,并发邮件通知:zhangmeng@sina.com

 

 

【上篇】
【下篇】

抱歉!评论已关闭.