转!!ftp的主动模式(port)与被动模式(PASV)

转自 http://www.phpweblog.net/killjin/archive/2008/01/06/2653.html
ftp中主动模式(port)与被动模式(PASV)

目录 

    •      

 

  •  开场白 
  •  基础 
  •  主动FTP 
  •  主动FTP的例子 
  •  被动FTP 
  •  被动FTP的例子 
  •  总结 
  •  参考资料 
  •  附录 1: 配置常见FTP服务器 



开场白 

处理防火墙和其他网络连接问题时最常见的一个难题是主动FTP与被动FTP的区别以及如何完美地支持它们。幸运地是,本文能够帮助你清除在防火墙环境中如何支持FTP这个问题上的一些混乱。 

本文也许不像题目声称的那样是一个权威解释,但我已经听到了很多好的反馈意见,也看到了本文在许多地方被引用,知道了很多人都认为它很有用。虽然我一直在找寻改进的方法,但如果你发现某个地方讲的不够清楚,需要更多的解释,请告诉我!最近的修改是增加了主动FTP和被动FTP会话中命令的例子。这些会话的例子应该对更好地理解问题有所帮助。例子中还提供了非常棒的图例来解释FTP会话过程的步骤。现在,正题开始了... 

基础 

FTP是仅基于TCP的服务,不支持UDP。 与众不同的是FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个端口是21-命令端口和20-数据端口。但当我们发现根据(FTP工作)方式的不同数据端口并不总是20时,混乱产生了。 

主动FTP 

主动方式的FTP是这样的:客户端从一个任意的非特权端口N(N>;1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。 

针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP: 

    1. 任何端口到FTP服务器的21端口 (客户端初始化的连接 S<-C) 
    2. FTP服务器的21端口到大于1023的端口(服务器响应客户端的控制端口 S->C) 
    3. FTP服务器的20端口到大于1023的端口(服务器端初始化数据连接到客户端的数据端口 S->C) 
    4. 大于1023端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口 S<-C) 


      画出来的话,连接过程大概是下图的样子: 
       

      在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个"ACK"。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端返回一个"ACK"。 

      主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。 

      主动FTP的例子 

      下面是一个主动FTP会话的实际例子。当然服务器名、IP地址和用户名都做了改动。在这个例子中,FTP会话从 testbox1.slacksite.com (192.168.150.80),一个运行标准的FTP命令行客户端的Linux工作站,发起到testbox2.slacksite.com (192.168.150.90),一个运行ProFTPd 1.2.2RC2的Linux工作站。debugging(-d)选项用来在FTP客户端显示连接的详细过程。红色的文字是 debugging信息,显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示,用户的输入信息用粗体字表示。 

      仔细考虑这个对话过程我们会发现一些有趣的事情。我们可以看到当 PORT 命令被提交时,它指定了客户端(192.168.150.80)上的一个端口而不是服务器的。当我们用被动FTP时我们会看到相反的现象。我们再来关注PORT命令的格式。就象你在下面的例子看到的一样,它是一个由六个被逗号隔开的数字组成的序列。前四个表示IP地址,后两个组成了用于数据连接的端口号。用第五个数乘以256再加上第六个数就得到了实际的端口号。下面例子中端口号就是( (14*256) + 178) = 3762。我们可以用netstat来验证这个端口信息。 

      testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2 
      Connected to testbox2.slacksite.com. 
      220 testbox2.slacksite.com FTP server ready. 
      Name (testbox2:slacker): slacker 
      ---> USER slacker 
      331 Password required for slacker. 
      Password: TmpPass 
      ---> PASS XXXX 
      230 User slacker logged in. 
      ---> SYST 
      215 UNIX Type: L8
       
      Remote system type is UNIX. 
      Using binary mode to transfer files. 
      ftp> ls 
      ftp: setsockopt (ignored): Permission denied 
      ---> PORT 192,168,150,80,14,178
       
      200 PORT command successful. 
      ---> LIST 
      150 Opening ASCII mode data connection for file list. 
      drwx------   3 slacker    users         104 Jul 27 01:45 public_html 
      226 Transfer complete. 
      ftp> quit 
      ---> QUIT 
      221 Goodbye. 

      被动FTP 

      为了解决服务器发起到客户的连接的问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫做PASV,当客户端通知服务器它处于被动模式时才启用。 

      在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >; 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P >; 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。 

      对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP: 

      1. 从任何端口到服务器的21端口 (客户端初始化的连接 S<-C) 
      2. 服务器的21端口到任何大于1023的端口 (服务器响应到客户端的控制端口的连接 S->C) 
      3. 从任何端口到服务器的大于1023端口 (入;客户端初始化数据连接到服务器指定的任意端口 S<-C) 
      4. 服务器的大于1023端口到远程的大于1023的端口(出;服务器发送ACK响应和数据到客户端的数据端口 S->C) 

        画出来的话,被动方式的FTP连接过程大概是下图的样子: 
         

        在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令"PORT 2024",告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4 步中给客户端的数据端口返回一个"ACK"响应。 

        被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。详细内容参看附录1。  

        第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。 

        随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。 

        被动FTP的例子 

        下面是一个被动FTP会话的实际例子,只是服务器名、IP地址和用户名都做了改动。在这个例子中,FTP会话从 testbox1.slacksite.com (192.168.150.80),一个运行标准的FTP命令行客户端的Linux工作站,发起到testbox2.slacksite.com (192.168.150.90),一个运行ProFTPd 1.2.2RC2的Linux工作站。debugging(-d)选项用来在FTP客户端显示连接的详细过程。红色的文字是 debugging信息,显示的是发送到服务器的实际FTP命令和所产生的回应信息。服务器的输出信息用黑色字表示,用户的输入信息用粗体字表示。 

        注意此例中的PORT命令与主动FTP例子的不同。这里,我们看到是服务器(192.168.150.90)而不是客户端的一个端口被打开了。可以跟上面的主动FTP例子中的PORT命令格式对比一下。 

        testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2 
        Connected to testbox2.slacksite.com. 
        220 testbox2.slacksite.com FTP server ready. 
        Name (testbox2:slacker): slacker 
        ---> USER slacker 
        331 Password required for slacker. 
        Password: TmpPass 
        ---> PASS XXXX 
        230 User slacker logged in. 
        ---> SYST 
        215 UNIX Type: L8
         
        Remote system type is UNIX. 
        Using binary mode to transfer files. 
        ftp> passive 
        Passive mode on. 
        ftp> ls 
        ftp: setsockopt (ignored): Permission denied 
        ---> PASV 
        227 Entering Passive Mode (192,168,150,90,195,149). 
        ---> LIST 
        150 Opening ASCII mode data connection for file list 
        drwx------   3 slacker    users         104 Jul 27 01:45 public_html 
        226 Transfer complete. 
        ftp>; quit 
        ---> QUIT 
        221 Goodbye. 

        总结 

        下面的图表会帮助管理员们记住每种FTP方式是怎样工作的: 

        主动FTP: 
           命令连接:客户端 >1023端口 -> 服务器 21端口 
           数据连接:客户端 >1023端口 <- 服务器 20端口  

        被动FTP: 
           命令连接:客户端 >1023端口 -> 服务器 21端口 
           数据连接:客户端 >1023端口 -> 服务器 >1023端口  

        下面是主动与被动FTP优缺点的简要总结:  

        主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。 

        幸运的是,有折衷的办法。既然FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。详细信息参看附录1。 

转载于:https://www.cnblogs.com/wuyun-blog/p/8184041.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入MTK平台bootloader启动分析笔记

bootloader到kernel启动总逻辑流程图ARM架构中&#xff0c;EL0/EL1是必须实现&#xff0c;EL2/EL3是选配&#xff0c;ELx跟层级对应关系&#xff1a;EL0 -- appEL1 -- Linux kernel 、lkEL2 -- hypervisor&#xff08;虚拟化&#xff09;EL3 -- ARM trust firmware 、pre-loade…

Android反翻译详解

这段时间在学Android应用开发&#xff0c;在想既然是用Java开发的应该很好反编译从而得到源代码吧&#xff0c;google了一下&#xff0c;确实很简单&#xff0c;以下是我的实践过程。 在此郑重声明&#xff0c;贴出来的目的不是为了去破解人家的软件&#xff0c;完全是一种学习…

51单片机——UART

单片机——UART串口通信 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 对于单片机来说&#xff0c;通信则与传感器、存储芯片、外围控制芯片等技术紧密结合&#xff0c;成为整个单片机系统的“神经中枢”。 1、初步认识 一位一位的发送出去的&#xf…

day 34 守护线程守护进程 互斥锁线程 信号量 生产者消费者

今日内容 1、守护进程vs 守护线程&#xff08;*&#xff09; 2、互斥锁&#xff08;**&#xff09; 3、信号量&#xff08;**&#xff09; 4、生产者消费者模型&#xff08;*****&#xff09; 5、GIL&#xff08;什么时候用进程&#xff0c;什么时候用线程&#xff09;&#xf…

20000W的电灯泡,真的是叼炸天

编排 | strongerHuang素材来源 | 电工电气学习1000W的灯泡有多亮&#xff1f; 20000W的灯泡呢&#xff1f;嵌入式专栏11000W灯泡一位手工帝名叫rctestflight&#xff0c;他认为普通白炽灯泡的能耗是LED灯8倍&#xff0c;他自己要做一盏最亮最亮的灯&#xff0c;就选择了LED灯泡…

以色列:新发明大幅提高太阳能发电效率

央视国际 [url]www.cctv.com[/url]  2007年08月22日太阳能发电是个老话题了&#xff0c;同时也有一个老问题&#xff0c;就是发电效率很低。最近&#xff0c;以色列科学家宣布&#xff0c;他们发明了一种新型的、高效太阳能发电系统&#xff0c;将促进太阳能在工业领域的广泛…

51单片机——I2C总线

单片机——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 UART 属于异步通信&#xff0c;比如电脑发送给单片机&#xff0c;电脑只负责把数据通过TXD 发送出来即可&#xff0c;接收数据是单片机自己的事情。而 I2C 属于同步通信&#xff0c; SCL 时…

物联网开发者被疯抢,华为做了什么?

5G时代到来&#xff0c;物联网技术的应用也离我们越来越近。智慧交通、智能家庭、智慧园区&#xff0c;越来越多的融入到我们的生活当中。所以&#xff0c;对于开发者而言&#xff0c;物联网将是未来发展的一大蓝海领域。但国内物联网人才短缺&#xff0c;每年人才缺口达百万之…

VMware 安装kali——linux

学习信息安全需要安装kali-linux,会遇到许多问题&#xff0c;如下&#xff1a; 1、版本问题 需要注意自己多用软件和电脑操作系统是否是一致版本&#xff0c;有些是可以安装但是不能运行。 2、安装过程选择错误的选项 我们创建新的虚拟机&#xff0c;这时&#xff0c;选择自定…

FreeRTOS及其应用,万字长文,基础入门

嵌入式系统不只是ARMLinux&#xff0c;不是只有安卓&#xff0c;凡是电子产品都可称为嵌入式系统。物联网行业的兴起&#xff0c;也提升了FreeRTOS市场占有率。本文就是介绍FreeRTOS基础及其应用&#xff0c;只是个人整理&#xff0c;可能存在问题&#xff0c;其目的只是简要介…

从中工毕业到年薪30万,我用了2年9个月

1夜色如潮水一般淹没了这座城市。我蹲在阳台&#xff0c;问我的死党&#xff0c;你说我的第一篇文章&#xff0c;起个什么样的标题才足够吸引人&#xff0c;让人想点开看看呢&#xff1f;死党从床上的帘子里探出头来说&#xff0c;UC震惊部啊&#xff0c;屡试不爽&#xff0c;况…

51单片机——LCD1602

单片机——1602液晶 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1、1602液晶读写时序 &#xff08;1&#xff09;、读状态 RSL&#xff0c;R/WH&#xff0c;EH。(判断忙完毕后释放总线) &#xff08;2&#xff09;、读数据 RSH&#xff0c;R/WH&a…

recovery模式下支持ADB连接和串口操作

前言Android平台下我们有时候会进入recovery下做一些操作&#xff0c;不管是通过ADB连接还是通过串口操作&#xff0c;都需要你的平台支持&#xff0c;不支持的话可以按照我们这篇文章进行修改。正文ADB连接进入recovery后&#xff0c;我通过ADB连接会有如下报错exec "/sy…

Get busy living or get busy dying

好久不看大片了&#xff0c;今天花了一些时间仔细看了一遍《肖申克的救赎》&#xff0c;应该是很仔细的看了一遍&#xff0c;这个影片真的震撼心灵&#xff0c;“Get busy living or get busy dying.”&#xff08;忙着活&#xff0c;还是忙着死&#xff09;是安迪最重要的一句…

买房这件小事

终于有时间再来讨论这个问题&#xff0c;可能因为在深圳&#xff0c;每次说这个问题时都挺热闹的。— — 为什么想买房&#xff1f;人很奇怪&#xff0c;也很自知&#xff0c;我在上学的时候从来没有过这样大胆的想法。后来突然想买房&#xff0c;一个原因是自己有钱了&#xf…

51单片机——DS18B20

单片机——DS18B20 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 DS18B20——温度传感器&#xff0c;单片机可以通过 1-Wire 和 DS18B20 进行通 信&#xff0c;最终将温度读出。1-Wire 总线的硬件接口很简单&#xff0c;只需要把 18B20 的数据引脚和单…

房价是不是泡沫?

日本买房这件小事记&#xff0c;我在深圳买房继上一篇文章之后&#xff0c;有人说我没有了解中国房地产的历史&#xff0c;就公然写房产的文章。确实&#xff0c;我没有去搜刮很多历史的数据和文章来佐证&#xff0c;也没有引用什么大家之谈&#xff0c;很多都是自己经历的一些…

用Metasploit破解ftp用户名和密码

Metasploit是渗透测试人员在世界各地的资源和工具&#xff0c;比较常用的命令&#xff1a; msfconsole——直接进入 show options——查看 set RHOSTS ip地址/段 use 路径 需要在虚拟机的2003版本下创建FTP服务 将字典密码文件加入到虚拟机的系统里边 命令 ——rz 查看ftp是…

PWM实现语音播放原理

采用PWM进行播放语音原理1.概述2.声音原理3.DAC产生声音的原理是什么4.PWM又是如何实现的DAC的5.PWM的频率与底噪的关系6.PWM音乐曲目解析7.后续1.概述大多数微控制器上播放音频都是采用DAC进行输出&#xff0c;因为微控制器上都不会去带CODEC编解码芯片&#xff0c;但是DAC不是…

CTF 这个看起来有点简单

这个看起来有点简单分值&#xff1a;10 来源&#xff1a; 西普学院难度&#xff1a;易 很明显。过年过节不送礼&#xff0c;送礼就送这个 格式&#xff1a; 解题链接&#xff1a; http://ctf5.shiyanbar.com/8/index.php?id1 解法&#xff1a; 1.手工注入 id1 id1 and 11 id…