为何常常连上 FTP 站台后,进去后就停留且无法列表?
防火墙有很多种,其中有一些会禁止那些不是从内部网络IP发出的连接请求。而FTP协议是个很老的东东,没有考虑这个问题。可以这样简单描述一般FTP的工作原理:Client对Server发出请求:「嗨,我的xx Port正等着你传送数据呢,Sever听到这个请求,就会建立一个连接,指向这个Port,并且开始传送数据。这就回到了我们的问题,如果发出请求的Client在防火墙的后面,而这个防火墙禁止外部IP建立连接,那么当然Server(在外部)不能建立与Client的连接。
所以,过了几年,人们修改了FTP协议以应付这种情况。这就是Passive Mode,工作原理如下:Client向Server发出Passive命令,Server回答说:「资料在xx Port等你,自己来拿。」而这回则由Client建立指向Server的连接,从而取得数据。这就避免了防火墙的限制。
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard(也就是Active,主动方式),一种是Passive(也就是PASV,被动方式)。Standard模式FTP的客户端发送PORT命令到FTP Server。Passive模式FTP的客户端发送PASV命令到FTP Server。
而在大部份的防火墙设定中,使用 FTP 传输档案时经常会遇到需要设定使用 Passive Mode 的 FTP,但大部份的 FTP client 软件,default 大都是 Active Mode FTP,这二种 FTP 模式在传输上有何不同?先了解 FTP 的工作方式,有助于了解 active FTP 及 passive FTP 的不同。
一般的 FTP 使用 TCP port 20 及 21 二个 port,正常来说, port 20 是传输数据用,而 port 21 传输命令,但事实上并不是一直使用 port 20 来传输数据。
Active Mode FTP (主动模式 FTP)
在 Active 模式的 FTP client 一开始时会先使用一个大于 1024(N) 的 TCP port 连结至 FTP server 的port 21,然后 FTP client 会打开该 port 的下一个数字的 port (N+1) 并送至 FTPserver 说期望下次的沟通可以经由新的 port (N+1),这样比较不会占用到 FTP server 的 port 21 而影响别的 FTP sessions,同时 FTP server 会使用 port 20 连结至 FTP client 新送过来的 port 号来传资料。
所以在防火墙上需要打开:
FTP server port 21 from anywhere # 给 FTP client 开始连接
FTP server port 21 to port > 1024 # 给 FTP server 回应 client 命令
FTP server port 20 to port > 1024 # 给 FTP server 开始数据传输
FTP server port 20 from port > 1024 # 给 FTP cleint 传送 data ACK 给 server
所以连接顺序为:
1. FTP client use TCP port 1026 for command to FTP server command port 21
2. FTP server use TCP port 21 responed to FTP client command port 1026
3. FTP server use TCP port 20 for sending data to FTP client data port 1027 (1026 + 1)
4. FTP client use TCP port 1027 ( 1026 + 1) for data ACK to FTP server port 20
问题在于使用 Active Mode FTP 时主控权在 FTP client,FTP client 并不是真正的连至 FTP server 的data port (TCP port 20),它只是告诉 FTP server 它准备在那个 port 接收数据及port+1 传送 ACK,并期望 FTP server 可以主动连接至 FTP client 所期望的 port,这在使用防火墙的环境中就会造成问题。
Passive Mode FTP (被动模式 FTP)
解决主动模式在防火墙外面时所发生无法连接的问题,可以用被动模式 FTP,在Passive Mode FTP 下,FTP client一开始和 Active Mode FTP 一样,打开二个 port (N > 1024 及 N+1),使用第一个port 连接至 FTP server的 port 21,并送出命令 PORT 让 server 连至 N port 再送出 PASV 命令给 server,这样会造成 server使用 一个大于 1024 的 port 连接至 client 并送出命令 PORT N ( N >1024 ) 给client,这样 client 就会使用 N + 1 并开始传输数据。
这样子在防火墙上需要设定:
FTP server TCP port 21 from anywhere # FTP client 开始连接至 FTP server
FTP server TCP port 21 to port > 1024 # FTP server 回应 client 控制
FTP server TCP port > 1024 from anywhere # FTP client 数据传输
FTP server TCP port > 1024 to client port > 1024 # FTP server 响应数据 ACK至 client data port
连接顺序为:
1. FTP client use TCP port 1026 to FTP server command port 21 via command PASV
2. FTP server use TCP port 21 to FTP client 1026 command port for reply data port 2024
3. FTP client use TCP port 1027 (N+1) to FTP server 2024 for data transmit and ACK
4. FTP server use TCP port 2024 to FTP client for data transmit and ACK
因为 Passive Mode FTP 是由 FTP server 发起一个大于 1024 的 port 至 client,在防火墙上的设定就相对简单,而可以传输资料而不会被防火墙 block。因为FTP Server会开放一个随机的高Port,尽管在IIS4和IIS5里面Port的范围是1024-5000,但是许多FTP Server的Port范围却可达到了1024-65535,这个时候在这个主动开放的随机Port上是有完全的访问权限喔,如果IIS也要设置成开放的Port为1024-65535,设置方法如下:
1. regedt32
2. 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
3. 编辑→新增→数值→ValueName:MaxUserPortDataType:REG_DWORDValue:65534
现在的FTP软件里面包括在IE5以上的版本里面,也已经支持这两种模式了。一般一些FTP客户端的软件就比较好设置了,一般都有一个PASV的选项,比如CuteFTP,传输的方式都有Standard和PASV的选项,可以自己进行选择;另外在IE里面如果要设置成PASV模式的话,可以在工具→因特网选项→进阶→使用被动式FTP(启用),否则就采用Standard模式。
所以如果遇到了有防火墙或者怕配置麻烦的话,还是采用PASV模式比较好些,但是如果真的对安全的需求很高的话,建议采用Standard模式。如何设置Standard模式?首先要建立一条规则就是允许内部的IP连接外部的IP的21 Port;第二条就是禁止外部IP的TCP 20 Port连接内部IP小于1024的Port,这条是为了防止外部连接内部的一般Port;第三条验证ACK是否等于1,这个的原理就要参见TCP建立连接的三方交握了。
在 Windows 下原来的 ftp client 并没有 passive 这个指令,但可以利用 literal 指今来下给 FTP server FTP session 为 Passive Mode。方法如下:
C:\>ftp 10.10.100.121
Connected to 10.10.100.121.
220 (vsFTPd 2.0.1)
User (10.10.100.121:(none)): ftp
331 Please specify the password.
Password:
230 Login successful.
ftp> literal pasv
227 Entering Passive Mode (10,10,100,121,242,172)
ftp>
可以看到进入 Passive Mode 了.使用的 port 号码是 (242*256)+172= 62124
若是 UNIX,但 FTP client 不支持 Passive Mode 指令,可以用 quote pasv。
Linux 操作系统的话,则可以利用 Passive 指令来切换。