FTP服务2种工作方式详解,PORT方式和PASV方式,(即主动模式和被动模式)

摘要:
基本FTP仅是基于TCP的服务,不支持UDP。红色文本是调试信息,显示发送到服务器的实际FTP命令和生成的响应信息。这是所谓的被动模式,即PASV,当客户端通知服务器它处于被动模式时启用。第一个端口连接到服务器的端口21,但与活动模式下的FTP不同,客户端不提交port命令,并允许服务器来回连接到其数据端口,而是提交PASV命令。幸运的是,许多FTP守护程序(包括流行的WU-FTPD)允许管理员指定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 :

任何端口到 FTP 服务器的 21 端口 (客户端初始化的连接 S<-C )

FTP 服务器的 21 端口到大于 1024 的端口( 服务器响应客户端的控制端口 S->C )

FTP 服务器的 20 端口到大于 1024 的端口( 服务器端初始化数据连接到客户端的数据端口 S->C )

大于 1024 端口到 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:

从任何端口到 服务器的 21 端口 (客户端初始化的连接 S<-C )

服务器的 21 端口到任何大于 1024 的端口 ( 服务器响应到客户端的控制端口的连接 S->C )

从任何端口到 服务器的大于 1024 端口 (入;客户端初始化数据连接到 服务器指定的任意端口 S<-C )

服务器的大于 1024 端口到远程的大于 1024 的端口(出; 服务器发送 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 :

命令连接:客户端 >1024 端口 -> 服务器 21 端口

数据连接:客户端 >1024 端口 <- 服务器 20 端口

被动 FTP :

命令连接:客户端 >1024 端口 -> 服务器 21 端口

数据连接:客户端 >1024 端口 -> 服务器 >1024 端口

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

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

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

解决办法,譬如leapftp,按F4,站点管理器,高级选项,“使用PASV模式”打勾去掉。

参考资料

O'Reilly 出版的《组建 Internet 防火墙》(第二版, Brent Chapman , Elizabeth Zwicky 著)是一本很不错的参考资料 。里面讲述了各种 Internet 协议如何工作,以及有关防火墙的例子 。

最权威的 FTP 参考资料是 RFC 959 ,它是 FTP 协议的官方规范 。RFC 的资料可以从许多网站上下载,例如:FTP服务2种工作方式详解,PORT方式和PASV方式,(即主动模式和被动模式)第3张ftp://nic.merit.edu/documents/rfc/rfc0959.txt

免责声明:文章转载自《FTP服务2种工作方式详解,PORT方式和PASV方式,(即主动模式和被动模式)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux中编译安装时的make test【转载】Android属性动画和视图动画的区别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

TCP/IP协议族基本知识

常见的网络拓扑 两台主机通信的过程:应用进程产生消息,经由主机的 TCP/IP 协议栈发送到局域网(LAN),最后经过广域网(目前最大的广域网的因特网)中的网络设备(路由器)传给目的主机所在的局域网(LAN),最后经过局域网(LAN)将报文传送个目的主机,经由主机 TCP/IP 协议栈处理,将消息递交给目的应用程序。网络拓扑如下: 图中路由器是网络中的架...

第二章:Android Studio概述(二)[学习Android Studio汉化教程]

The Main Menu Bar 主菜单栏 主菜单栏位于Android Studio的最上面,你几乎可以利用主菜单和其子菜单来执行任何操作。不像Android Studio中其他的一些菜单,主菜单不能被隐藏。不要被主菜单和它的子菜单项吓到。即使经验丰富的Android开发者也在日常编码中仅仅使用其中的一小部分,更多的则是通过快捷键和相应的上下文菜单实现。...

ZooKeeper

目录 一、ZooKeeper简介 分布式应用程序 分布式应用程序的好处 分布式应用程序的挑战 Apache ZooKeeper 意味着什么? ZooKeeper的优点 二、Zookeeper基础 ZooKeeper的体系结构 分层命名空间 Znodes 类型 会话 监视 三、Zookeeper工作流ZooKeeper集合的节点 四、Zo...

linux下部署程序,tomcat启动正常,但网页无法访问

问题背景:测试环境部署程序,之前是可以的。但是在安装rabbitmq的时候,再来打开网页的时候就出现一直转圈圈,网页无法打开。 经过检查发现是由于开启了防火墙。 系统是centos7 ,查看其防火墙的状态:#systemctl status firewalld.service 发现是开启的状态,估计是在安装mq的时候开启了防火墙。那么将其关闭#sys...

TCP和UDP的区别(Socket)

TCP和UDP的区别(Socket)  TCP和UDP区别 TCP和UDP编程区别 TCP编程的服务器端一般步骤是:   1、创建一个socket,用函数socket();   2、设置socket属性,用函数setsockopt(); * 可选   3、绑定IP地址、端口等信息到socket上,用函数bind();   4、开启监听,用函数l...

wordpress需要FTP用户名密码的问题

wordpress安装删除插件需要FTP用户名密码的问题 方法一: 服务器命令操作: 1、在wordpress目录下面wp-config.php末尾加入下面代码:  if(is_admin()) {      add_filter('filesystem_method',create_function('$a','return "direct";')); ...