登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

NET START HERE

研究C/C++、网络/通信/协议编程、网络安全、软件安全

 
 
 

日志

 
 

ftp主动连接、被动连接、连接端口的分配与使用、误区总结  

2011-05-22 16:34:39|  分类: 技术探讨 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
今天在一个网络工程师考试群中无意中看到的,好像今年有一道题叫什么ftp客户端可以使用哪个端口,有4个答案,20,21,80,4155,其中肯定是4155了,因为20、21都是ftp服务器使用的,80是web服务器使用的。再者从另一方面说,客户端使用的端口都是动态向系统申请的,一般都大于1024。后来记得我说了句主动连接时服务器使用的是20号端口与客户端建立连接,有人就开始反驳了说是不管主动还是被动端口服务器的数据连接端口都大于1024,很好笑。今天也就顺便总结一下吧,google了一下,发现网上各种解释都有,错误的也不乏少数。我就使用真实的连接过程响应数据跟大家分析一下吧:
 
被动(PASV)模式:
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条控制连接。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。
服务器控制端口(21),服务器端等待的数据传输端口(动态申请)
ftp服务器动态申请一个端口(一般大于1024)然后告诉客户端,我在这个端口上等待你的连接,客户端收到以后便向服务器的这个端口发起连接,数据连接建立以后,数据传输就可以开始了
端口计算方法:172,16,101,104,7,254,256*7+254=2046
 
一次完整的被动连接及数据传输过程:
状态: 正在连接 172.16.101.104:21...
状态: 连接建立,等待欢迎消息...
响应: 220 Serv-U FTP Server v6.4 for WinSock ready...
命令: USER test
响应: 331 User name okay, need password.
命令: PASS ****
响应: 230 User logged in, proceed.
状态: 已连接
状态: 读取目录列表...
命令: PWD
响应: 257 "/" is current directory.
状态: 列出目录成功
状态: 正在连接 172.16.101.104:21...
状态: 连接建立,等待欢迎消息...
响应: 220 Serv-U FTP Server v6.4 for WinSock ready...
命令: USER test
响应: 331 User name okay, need password.
命令: PASS ****
响应: 230 User logged in, proceed.
状态: 已连接
状态: 开始上传 E:\Downloads\liuzhigong\liuzhigong\404.htm
命令: CWD /
响应: 250 Directory changed to /
命令: TYPE A
响应: 200 Type set to A.
命令: PASV
响应: 227 Entering Passive Mode (172,16,101,104,8,86)

命令: STOR 404.htm
响应: 150 Opening ASCII mode data connection for 404.htm.
响应: 226 Transfer complete.
状态: 文件传输成功,传输了 2,052 字节 (用时1 秒)
状态: 读取目录列表...
命令: TYPE I
响应: 200 Type set to I.
命令: PASV
响应: 227 Entering Passive Mode (172,16,101,104,8,88)

命令: MLSD
响应: 150 Opening BINARY mode data connection for MLSD.
响应: 226 Transfer complete.
状态: 列出目录成功
 
 
主动(PORT)模式:
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条控制连接。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。
 
一次完整的主动连接及数据传输过程:
状态: 正在连接 172.16.101.104:21...
状态: 连接建立,等待欢迎消息...
响应: 220 Serv-U FTP Server v6.4 for WinSock ready...
命令: USER test
响应: 331 User name okay, need password.
命令: PASS ****
响应: 230 User logged in, proceed.
状态: 已连接
状态: 开始上传 E:\Downloads\liuzhigong\liuzhigong\404.htm
命令: CWD /
响应: 250 Directory changed to /
命令: TYPE A
响应: 200 Type set to A.
命令: PORT 172,16,101,104,8,76
响应: 200 PORT Command successful.

命令: STOR 404.htm
响应: 150 Opening ASCII mode data connection for 404.htm.
响应: 226 Transfer complete.
状态: 文件传输成功,传输了 2,052 字节 (用时1 秒)
状态: 读取目录列表...
命令: TYPE I
响应: 200 Type set to I.
命令: PORT 172,16,101,104,8,77
响应: 200 PORT Command successful.

命令: MLSD
响应: 150 Opening BINARY mode data connection for MLSD.
响应: 226 Transfer complete.
状态: 列出目录成功
 
端口的使用:任何一种模式中客户端均是动态申请一个端口来使用,服务器端控制连接端口(默认21)始终不变,当使用主动模式时,客户端申请一个端口告诉服务器,服务器则使用20号端口向客户端的这个端口主动建立一条数据连接;当使用被动模式时,服务器则动态申请一个端口告诉客户端以等待客户端的连接
 
网络上的误区:网络上有的文章中提到说是客户端向服务器发送一个pasv命令告诉服务器在那个端口上等待,实际上是错的。从上面的完整ftp连接流程中:
 
命令: PASV
响应: 227 Entering Passive Mode (172,16,101,104,8,88)
 
命令: PORT 172,16,101,104,8,77
响应: 200 PORT Command successful.
 
中可以看出,在被动连接中由客户端发送PASV命令,服务器动态申请一个端口告诉客户端,然后等待客户端的连接;在主动连接中,客户端动态申请一个端口告诉服务器,然后等待服务器的连接。
 
常见问题1:为什么处于内网的FTP客户端要使用被动连接?
由以上可知,使用主动连接时,是服务器主动向客户端的端口发起连接,则当ftp服务器的连接目标IP实际是你的公网IP(因为私有IP是不允许路由到互联网上的),如果是通过NAT上网,则是NAT池中的IP,如果客户端中网络路由器没有和你的计算机做端口映射,则当数据到达路由器时,路由器会自动丢弃数据包,因为路由器不是你的ftp客户端,无法处理这个数据包。而使用被动连接由客户端主动发起连接,则将能顺利通过路由器,木马内网反弹连接也是这个原理,由内网中的机器主动向外网发起连接。
 
还是希望大家多多编程,如果做过ftp服务器就会知道其中原理,不要只顾着理论学习,还是要以实践为重


 
  评论这张
 
阅读(8116)| 评论(4)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018