FTP PortActive模式和Passive模式详解.docx
《FTP PortActive模式和Passive模式详解.docx》由会员分享,可在线阅读,更多相关《FTP PortActive模式和Passive模式详解.docx(13页珍藏版)》请在冰豆网上搜索。
FTPPortActive模式和Passive模式详解
ftp的端口号20、21有何区别?
一个是数据端口,一个是控制端口,控制端口一般为21,而数据端口不一定是20,这和FTP的应用模式有关,如果是主动模式,应该为20,如果为被动模式,由服务器端和客户端协商而定
FTPPort(active)模式和FTPPassive模式
当你对一个FTP问题进行排错时候,你首先要问的一个问题是使用的是port模式的还是passive模式。
因为这两种行为迥异,所以这两种模式引起的问题也不同;在过去,客户端缺省为active(port)模式;近来,由于Port模式的安全问题,许多客户端的FTP应用缺省为Passive模式。
>>2.1FTPPort模式
Port模式的FTP步骤如下:
步骤1~3建立控制连接
1、客户端发送一个TCPSYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;
2、服务器端发送SYNACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;
3、客户端发送一个ACK(确认)包;
客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;
接下来在这个TCP连接中进行用户名、密码认证等;
-----------------------------------------------------------------------------------------------
步骤4协商数据连接方式
4、当用户请求一个列表(List)请求或者发起一个要求发送或者接受文件的请求,客户端软件使用PORT命令,这个命令包含了一个暂时的端口,客户端希望服务器在打开一个数据连接时候使用这个暂时端口;PORT命令也包含了一个IP地址,这个IP地址通常是客户自己的IP地址,而且FTP也支持第三方(third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接(如下图);
-----------------------------------------------------------------------------------------------
步骤5~7建立数据连接
5、服务器端发送一个SYN包给客户端的暂时端口,源端口为20,暂时端口为客户端在PORT命令中发送给服务器端的暂时端口号;
6、客户端以源端口为暂时端口,目的端口为20发送一个SYNACK包;
7、服务器端发送一个ACK包;
-----------------------------------------------------------------------------------------------
步骤8~10数据传送与连接关闭
8、发送数据的主机以这个连接来发送数据,数据以TCP段(注:
segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要对方进行ACK确认(注:
因为TCP协议是一个面向连接的协议)
9、当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;
10、客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。
当使用FTP时候,网络中的防火墙必须要声明相应的端口,防火墙必须要跟踪FTP对话然后检查PORT命令,防火墙必须要参与从服务器端到客户端在PORT命令中指定的端口连接的建立过程。
如果网络中使用了NAT(注:
网络地址翻译),那么NAT网关同样也需要声明相应的端口,网关需要把在PORT命令中指定的IP地址翻译成分配给客户的地址,然后重新计算TCP的Checksum;如果网关没有正确地执行这个操作,FTP就失败了。
黑客可能会利用FTP支持第三方特性这一特点,在PORT命令中设置IP地址和端口号参数来指定一台目标主机的地址和端口号(有时候称这种攻击为FTP反弹攻击),例如黑客可以让一台FTP服务器不断地从它的源端口20发送TCPSYN包给一系列目的端口,让FTP服务器看起来正在进行端口扫描,目的主机不知道攻击来自黑客的主机,看起来攻击象是来自FTP服务器。
一些常用的FTP应用在PORT命令中设置地址为0.0.0.0,这样做的意图是让FTP服务器只需要与打开控制连接
的相同客户进行数据连接,设置地址为0.0.0.0可能会让防火墙不知所措。
例如,CISCOPIXIOS6.0以上版本的PIX(注:
CISCO硬件防火墙设备,6.0以上版本为其修正了相关的FTP协议)要求数据连接的IP地址与已经存在的控制连接的IP地址必须相同。
这样做的原因是防止黑客用PORT命令来攻击别的机器,虽然一些FTP应用设置IP地址为0.0.0.0不是有意图的攻击,但在PIX修正协议环境下的确引起了一些问题,同时对其他不允许第三方模式和避免FTP反弹攻击的防火墙来说,这也会引起相同的问题。
>>2.2FTPPassive模式
步骤1~3建立控制连接
下面的列表描述了Passive模式的FTP的步骤,步骤1到3和Port模式FTP相同,步骤9到11同样与Port模式FTP最后三步相同。
1、客户端发送一个TCPSYN(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;
2、服务器端发送SYNACK(同步确认)包给客户端,源端口为21,目的端口为客户端上使用的暂时端口;
3、客户端发送一个ACK(确认)包;客户端使用这个连接来发送FTP命令,服务器端使用这个连接来发送FTP应答;
-----------------------------------------------------------------------------------------------
步骤4~5协商数据连接方式
4、当用户请求一个列表(List)或者发送或接收文件时候,客户端软件发送PASV命令给服务器端表明客户端希望进入Passive模式;
5、服务器端进行应答,应答包括服务器的IP地址和一个暂时的端口,这个暂时的端口是客户端在打开数据传输连接时应该使用的端口;如果服务器端使用了NAT,在客户端还可以进行如下设置:
-----------------------------------------------------------------------------------------------
步骤6~8建立数据连接
6、客户端发送一个SYN包,源端口为客户端自己选择的一个暂时端口,目的端口为服务器在PASV应答命令中指定的暂时端口号;
7、服务器端发送SYNACK包给客户端,目的端口为客户端自己选择的暂时端口,源端口为PASV应答中指定的暂时端口号;
8、客户端发送一个ACK包;
-----------------------------------------------------------------------------------------------
步骤9~11数据传送与连接关闭
9、发送数据的主机以这个连接来发送数据,数据以TCP段(注:
segment,第4层的PDU)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要对方进行ACK确认;
10、当数据传输完成以后,发送数据的主机以一个FIN命令来结束数据连接,这个FIN命令需要另一台主机以ACK确认,另一台主机也发送一个FIN命令,这个FIN命令同样需要发送数据的主机以ACK确认;
11、客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确认。
很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP20无法和内部网络的客户端建立一个新的连接,造成无法工作。
NAT设备内的客户端不支持主动模式,NAT设备内的服务端不支持被动模式;
●常见的FTP客户端软件PORT方式与PASV方式的切换方法
大部分FTP客户端默认使用PASV方式。
IE默认使用PORT方式。
在大部分FTP客户端的设置里,常见到的字眼都是“PASV”或“被动模式”,极少见到“PORT”或“主动模式”等字眼。
因为FTP的登录方式只有两种:
PORT和PASV,取消PASV方式,就意味着使用PORT方式。
(1)IE:
工具->Internet选项->高级->“使用被动FTP”(需要IE6.0以上才支持)。
(2)CuteFTP:
Edit->Setting->Connection->Firewall->“PASVMode”或File->SiteManager,在左边选中站点->Edit->“UsePASVmode”。
(3)FlashGet:
工具->选项->代理服务器->直接连接->编辑->“PASV模式”。
(4)FlashFXP:
选项->参数选择->代理/防火墙/标识->“使用被动模式”或站点管理->对应站点->选项->“使用被动模式”或快速连接->切换->“使用被动模式”。
●FTP客户端filezillaFTPClient简介:
两种传输模式可选:
主动模式时可以填入客户端的外网IP(在客户端只有NAT设备而没有防火墙的时候有用):
被动模式时即使收到的数据包中包含的是服务端内网IP,软件也可以自动向服务器端外网IP发起响应数据包(在服务端只有NAT设备而没有防火墙的时候有用)(实际测试无效果?
):
一般普通的桌面式路由器也支持FTP等协议,如以下这款TP-LINK:
常见FTP传输错误分析
*使用FTP客户端filezillaFTPClient;
*大部分NAT路由器或防火墙设备都支持FTP应用代理,不用考虑以下问题;
●主动模式正常连接过程
状态:
正在连接12.113.250.102:
21...
状态:
连接建立,等待欢迎消息...
响应:
220MicrosoftFTPService
命令:
USERadministrator
响应:
331Passwordrequiredforadministrator.
命令:
PASS***********
响应:
230Useradministratorloggedin.
状态:
已连接//控制连接建立、用户认证
状态:
读取目录列表...
命令:
PWD
响应:
257"/"iscurrentdirectory.
状态:
列出目录成功//初始连接时会出现此提示,但此时尚未建立数据连接,实际看到的是之前的目录列表缓存,为软件错误提示,必须刷新目录才会触发数据连接并列出目录列表
状态:
开始下载/Test01!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
//准备建立数据连接,开始协商
命令:
CWD/
响应:
250CWDcommandsuccessful.
命令:
TYPEA
响应:
200TypesettoA.
命令:
PORT192,168,252,69,39,64//主动模式中FTP客户端必须向服务端提供IP及端口
响应:
200PORTcommandsuccessful.//端口协商结束
命令:
RETRTest01!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
响应:
150OpeningASCIImodedataconnectionforTest01!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
(0bytes).
//以下开始建立数据连接
......//数据连接建立,开始数据传输......
响应:
226Transfercomplete.//数据传输结束
状态:
文件传输成功,传输了0字节(用时1秒)
●主动模式错误一
网络结构:
Client-路由器(NAT)-Internet-Server
状态:
正在连接61.113.250.102:
21...//模拟NAT环境
状态:
连接建立,等待欢迎消息...
响应:
220MicrosoftFTPService
命令:
USERadministrator
响应:
331Passwordrequiredforadministrator.
命令:
PASS***********
响应:
230Useradministratorloggedin.
状态:
已连接
状态:
读取目录列表...
命令:
PWD
响应:
257"/"iscurrentdirectory.
状态:
列出目录成功//注意此时为软件缓存,实际不能列出目录,更无法下载文件
状态:
开始下载/Test01!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
命令:
PORT192,168,252,69,39,60//协商过程中Client使用本地网卡的IP(内网IP)
响应:
500InvalidPORTCommand.
//IP、端口协商失败,服务器端报错
解决方法:
1、在FTP客户端设置【PORT命令使用客户端NAT后的外网IP】;2、使用支持FTP的NAT路由设备(即自动转换PORT命令中的IP地址);
错误:
文件传输失败
●主动模式错误二
网络结构:
Client-防火墙(无NAT)-Internet-Server
状态:
正在连接61.129.101.8:
21...
状态:
连接建立,等待欢迎消息...
响应:
220MicrosoftFTPService
命令:
USERadministrator
响应:
331Passwordrequiredforadministrator.
命令:
PASS***********
响应:
230Useradministratorloggedin.
状态:
已连接
状态:
读取目录列表...
命令:
PWD
响应:
257"/"iscurrentdirectory.
命令:
TYPEI
响应:
200TypesettoI.
命令:
PORT61,113,253,254,39,86//此处为客户端软件填写的外网IP,模拟无NAT环境
响应:
200PORTcommandsuccessful.
命令:
LIST
响应:
150OpeningBINARYmodedataconnectionfor/bin/ls.
响应:
425Can'topendataconnection.
//服务端发起对客户端的数据连接被防火墙拒绝或重置,服务端返回错误消息
解决方法:
1、使用支持FTP应用代理的防火墙设备;
错误:
读取目录列表失败
或:
命令:
LIST
响应:
150OpeningBINARYmodedataconnectionfor/bin/ls.
错误:
连接超时//收不到服务端的响应数据包,客户端自动超时并重置连接
错误:
读取目录列表失败
●被动模式正常连接过程
状态:
正在连接12.113.250.102:
21...
状态:
连接建立,等待欢迎消息...
响应:
220MicrosoftFTPService
命令:
USERadministrator
响应:
331Passwordrequiredforadministrator.
命令:
PASS***********
响应:
230Useradministratorloggedin.
状态:
已连接
状态:
读取目录列表...
命令:
PWD
响应:
257"/"iscurrentdirectory.
状态:
列出目录成功//控制连接建立、用户认证、列出目录
状态:
开始下载/Test01!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
//准备建立数据连接,开始协商
命令:
CWD/
响应:
250CWDcommandsuccessful.
命令:
TYPEA
响应:
200TypesettoA.
命令:
PASV
响应:
227EnteringPassiveMode(12,113,250,102,19,138).//被动模式中FTP服务端必须向客户端提供IP及端口
命令:
RETRTest01!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
//以下开始建立数据连接
响应:
125Dataconnectionalreadyopen;Transferstarting.
//服务端回应“数据连接已经建立”
......//数据连接建立,开始数据传输......
响应:
226Transfercomplete.
状态:
文件传输成功,传输了0字节(用时1秒)
●被动模式错误一
Client-Internet-路由器(NAT)-Server
状态:
正在连接61.129.101.8:
21...
状态:
连接建立,等待欢迎消息...
响应:
220MicrosoftFTPService
命令:
USERlee
响应:
331Passwordrequiredforlee.
命令:
PASS************
响应:
230Userleeloggedin.
状态:
Serverdoesnotsupportnon-ASCIIcharacters.
状态:
已连接
状态:
读取目录列表...
命令:
PWD
响应:
257"/"iscurrentdirectory.
命令:
TYPEI
响应:
200TypesettoI.
命令:
PASV
响应:
227EnteringPassiveMode(12,113,250,102,19,138).//协商过程中Server使用本地网卡的IP(内网IP)
命令:
LIST
响应:
426Connectionclosed;transferaborted.
//因为协商错误,客户端会对服务端内网IP12.113.250.102发起数据连接,必定连接失败;服务端报错(因为连接超时?
);
解决方法:
1、在FTP客户端设置【客户端自动对服务端外网IP发起数据连接】;2、使用支持FTP的NAT路由设备(即自动转换PORT命令中的IP地址);
错误:
读取目录列表失败
(*模拟环境,实际环境中192.168.252.69与12.113.250.102不能直接通信)
●被动模式错误二
网络结构:
Client-Internet-防火墙(无NAT)-Server
状态:
正在连接12.113.250.102:
21...
状态:
连接建立,等待欢迎消息...
响应:
220MicrosoftFTPService
命令:
USERadministrator
响应:
331Passwordrequiredforadministrator.
命令:
PASS***********
响应:
230Useradministratorloggedin.
状态:
已连接
状态:
读取目录列表...
命令:
PWD
响应:
257"/"iscurrentdirectory.
命令:
TYPEI
响应:
200TypesettoI.
命令:
PASV
响应:
227EnteringPassiveMode(12,113,250,102,19,137).
命令:
LIST
响应:
425Can'topendataconnection.
\\客户端发起对服务端的数据连接被防火墙拒绝或重置,服务端报错
解决方法:
1、使用支持FTP应用代理的防火墙设备;
错误:
读取目录列表失败