FTP 的特殊性:
大多数的TCP 服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但是,FTP 协议却有所不同,它使用双向的多个连接,而且使用的端口很难预计。一般,FTP 连接包括:
一个控制连接(control
connection)
这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21 端口,生存期是整个FTP 会话时间。
几个数据连接(data
connection)
这些连接用于传输文件和其它数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。而且,数据连接既可能是客户端发起的,也可能是服务器端发起的。
在FTP 协议中,控制连接使用周知端口21 ,因此使用ISA 的IP PACKET
FILTER 就可以这种连接进行很好的安全保护。相反,数据传输连接的目的端口通常实现无法知道,因此处理这样的端口转发非常困难。FTP 协议使用一个标准的端口21 作为ftp-data 端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。FTP 的数据连接和控制连接的方向一般是相反的,也就是说,是服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的。FTP 协议的这个特征对ISA 转发以及防火墙和NAT 的配置增加了很多困难。
除此之外,还有另外一种FTP 模式,叫做被动模式(passive mod) 。在这种模式下,数据连接是由客户程序发起的,和刚才讨论过的模式( 我们可以叫做主动模式) 相反。是否采取被动模式取决于客户程序,在ftp 命令行中使用passive 命令就可以关闭/ 打开被动模式。
前面我们讲过,FTP 协议的数据传输存在两种模式:主动模式和被动模式。这两种模式发起连接的方向截然相反,主动模式是从服务器端向客户端发起;被动模式是客户端向服务器端发起连接。
我们回到ISA 的情况,如果采用被动模式,由于IIS 是完全随机的选择一个端口,并告知客户,然后客户进行主动连接,这就意味着在ISA 上,你要让所有的端口都允许动态入站连接才行,这样肯定不行,因为太危险了,等于打开了所有的端口连接。
如果采用主动模式(PORT Mode) ,IIS 选择好端口后,主动与客户进行连接,这时候不需要像PASV 模式那样打开所有的动态入站连接,而且正好相反,我们需要打开所有的动态出站连接即可,安全性增加很多。而且由ISA 的IP PACKET FILTER 只对ISA 本机起作用,不会造成局域网内的客户“放了羊”。
所以,我个人这样做的:
(1 )由于IIS 和ISA 都在一台机器上,所以它俩都在侦听21 号端口(IIS 默认情况下会侦听所有地址的21 端口),所以我们首先要让IIS 只侦听内
网地址的PORT 21 ,在DOS 下,你可以通过NETSTAT -NA > abc.txt ,然后打开这个文件,你会看到0.0.0 .0 21 LISTENING 字样。
输入如下命令:
net stop msftpsvc (停止FTP 服务)
进入\Inetpub\adminscripts\ 目录
cscript adsutil.vbs set msftpsvc/disablesocketpooling true (停止侦听)
net start msftpsvc (启动FTP 服务)
(2 )在IIS 控制台里面,ftp->Property->FTP Site->IP Address 改为内网地址。现在,FTP 服务只侦听内网IP 的21 号端口了。
(3 )大家可能这时候有疑问,如果是IIS 主动连接客户端,那客户端的防火墙是不是会阻止这个连接(PASV 模式不存在这个问题)。为了防止这种情况,我们可以强制IIS 不能与客户端的任意端口进行连接,而只有客户端连接IIS 的端口进行数据传输。这样就可以解决PORT MODE 与客户端防火墙的冲突。方法:修改注册
表,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Msftpsvc\Parameters\ ,将EnablePortAttack 的值由0 改为1 ,然后重新启动FTP 服务。
(4 )在ISA 里面,使用SERVER PUBLISH 的方法发布FTP 服务,其中:IP address of internal server 填写ISA 的内部网卡的IP ,IP address of external server 填写ISA 的外部网卡的IP ,Mapped
server protocol 选择 FTP Server 。
(5 )然后在IP Packet Filter 建立一条新RULES ,Protocol->TCP,Direction->Outbound,Local
Port->Dymanic,Remote Port->All 。
这是我的解决办法,但是并不完美,主要是:
(1 )客户不能使用PASV 方法进行连接,原因上面已经讲了。
(2 )由于第五条,所以ISA 服务器随着保证了对外部访问的限制,却无法限制ISA 本机对外部的访问。
我也把我的方法做了一下实验,使用serv-u 做的,有一点错误,不过终归做了出来,下面总结一下:
PASV 服务器放在ISA 后面,其实就是要解决两个问题:
1 。PASV 的端口。我上面的方法提出使用secondary connection ,但事实证明不对,应该每个PASV 端口都建立一条primary connection ,然后分别建立server publishing
rules ,有多少个PASV 端口,就要建立多少条。
这里还可以引出另一个话题,就是对web
publishing rules 的运用,tony 你应该知道,通过web publishing rules 也可以发布ftp 服务器,但rule 里面只给了一个ftp 端口的选项,很明显,这是为PORT 模式的FTP 服务器准备的,因为PORT 模式的数据连接是由服务器发起的,在服务器一边,不存在穿过防火墙的问题。
使用web publishing
rules 还有一个很令人振奋的特性,就是支持动态公用IP 用户,不需要象server publishing rules 那样,每拨一次号都要修改一次外部地址。如果在web publishing rules 中也能搞定PASV 问题,那么对于那些使用拨号上网而又想在内网发布PASV 服务器的人来说,简直是天大的喜讯。
需要好好考虑的是如何通过那个只能填一个端口的选项来发布随机的PASV 端口?我从今天的实验找到了一点灵感,就是也象上面说的那样,每个PASV 端口都设置一条web publishing rules !我还未做这个实验,还不能证实这样做行不行,相信晚上就会有结果了。
当然,还需要考虑如何控制PASV 模式端口的范围,serv-u 可以设定,而IIS 的FTP 不行。
2 。是服务器向客户端传送IP 的问题。当FTP 客户端登录进入服务器的时候,PASV 模式服务器会向客户端传送本机的IP 地址和数据端口,当服务器放在内网中的时候,服务器会向客户端返回内网的IP ,这当然是不能完成连接的,需要让服务器返回ISA 的外网地址。本来,解决方法可以使用firwall client 的application settings 中的nameresolutionforlocalhost 参数,设为P 就可以让应用程序返回ISA 的外网地址,但这个参数是供firewall client 使用的,而发布服务器不能安装firewall client ,这很可惜。
幸好,还是有一个好消息,就是serv-u 本身具有返回ISA 外网地址这样的功能,方法是先选中新建FTP 服务器的属性,在domain 标签里选择“enable dynamic dns ”,此时会出现第二个标签,叫“dynamic dns ”,然后到tz0.com 申请动态域名,申请后会得到一个key ,在此标签中填入此key 即可。最后一步,是到新建服务器的settings 属性中,选择advanced 标签,选中“allow passive mode data transfer ”,旁边的IP 地址框留空。这个框对于拨号用户不用填,只有出口使用固定地址才需要填。
这样,serv-u 向客户端返回IP 和端口前,会先向tz0.com 查询到ISA 外网的地址,再发送给客户端。
解决了这两个问题,剩下的工作就简单了。
从以上内容也可以说明一点,从内网不能发布IIS 的FTP 服务器,因为IIS 既没有选项可以选择PASV 端口的范围,也没有办法让其返回ISA 外网的地址。而serv-u 这两条都可以满足。当然,在微软的网站上也可能有方法解决IIS 的这两个问题。
发布FTP 服务器的时候,要注意FTP 服务器有PORT 和PASV 两种模式。两者的共同点,是都使用21 端口进行用户验证及管理,差别在于传送数据的方式不同,PORT 模式的FTP 服务器数据端口固定在20 ,而PASV 模式则在1025-65535 之间随机。发布的时候要考虑这个差别。
如果FTP 服务器在内部网络中,在建立server
publish rules 时(虽然web publish rules 也能发布ftp 服务器,但它并没有提供对port 和pasv 模式的处理),protocol definitions 中的21 inbound 条目要建立一个secondary connection ,为20 端口上的inbound 或1025-65535 端口之间的inbound 。
如果FTP 服务器建立在ISA 服务器上,就需要在ip packet filters 中设置相关的条目,对于PORT 模式,很简单,开放20 inbound 就是,但pasv 模式就麻烦一点,因为ip packet filters 不能设置端口段,但我们也不可能把几万个端口逐个写一遍,只能把local port 设置为dynamic ,remote port 设置为all ports ,当然,对安全性这是个损害。
幸运的是,有些PASV 模式的FTP 服务器能够设置PASV 模式端口的范围,比如serv-u ,它能够把PASV 模式端口控制在最多50 个端口范围内,如果为serv-u 设置的并发用户数不多,那么我们就可以为每个PASV 端口写一条filter ,不需要开放所有的端口了。如果使用IIS 的FTP 服务器,这个FTP 服务器没有提供选择PASV 模式端口的功能,只能如上所述那样,开放dynamic 和all ports 。
从你上面的出错信息来看,你应该是使用IE 来访问FTP 服务器吧。IE 的FTP 客户端与其它专业FTP 客户端不同,不能够自动检测FTP 服务器的类型以及根据服务器的类型改变客户端的种类。IE 只提供了一个手工选项来改变PORT 和PASV 客户端角色,就是internet 选项-> 高级-> 为FTP 站点启用文件夹视图,选择它,IE 为PASV 模式客户端,不选则为PORT 客户端。你需要根据服务器的类型手工更改这个选项。如果服务器的出口是ADSL 类的链路,还要把“使用被动FTP (为防火墙和DSL 调制解调器兼容性)”一项选上,这两个选项只在IE5 。5 以上版本提供。