• ftpserver / FTP model:PORT/PASV/EPRT/EPSV


    s

    ftp 425 Can't open data connection. 的解决方案

    https://yq.aliyun.com/articles/475755

     425 Can't open data connection.的解决办法:
    问题背景:
        新使用独立主机一个.主机由防火墙.
    问题症状:
        服务器FTP服务正常启用.但是客户端不能连接.
        用客户端连接.提示以下信息:
        返回:    227 Entering Passive Mode (asdfasdfasdfasfd,asdfasdfasdf,asdfasdf).
        命令:    LIST
        错误:    传输连接被打断: ECONNABORTED - Connection aborted
        返回:    425 Can't open data connection.
        错误:    读取目录列表失败
    问题原因分析
        问题出在  Passive Mode ,因为被动模式会使用大概是5000~10000的TCP/IP端口,但是服务器已经屏蔽了此端口,所以必须使用主动模式,而非被动模式.
    问题解决方案:
        1.开放端口,不推荐.为了保障安全
        2.调整客户端软件的模式:使用主动模式.
     
    FTP模式简式:PORT/PASV/EPRT/EPSV

    https://www.cnblogs.com/wuyuxuan/p/5544725.html

    简介

           常见FTP有两种模式:PORT(主动模式)、PASV(被动模式)。

           而EPRT/EPSV模式出现的原因是FTP仅仅提供了建立在IPv4上进行数据通信的能力,它基于网络地址是32位这一假设。但是,当IPv6出现以后,地址就比32位长许多了。原来对FTP进行的扩展在多协议环境中有时会失败。我们必须针对IPv6对FTP再次进行扩展。EPRT、EPSV是Extended Port/Pasv的简写。

     

    详解

    PORT模式

            当FTP的Client以PORT模式连接FTP Server时,它动态的选择一个Port X(注意这个Port一定是1024以上的,因为1024以前的Port都已经预先被定义好,被一些典型的服务使用,当然有的还没使用,也是保留给以后会用到这些端口的资源服务)来连接FTP Server的21端口,当经过TCP的三次握手后,连接(控制信道)被建立。    

            现在用户要列出FTP Server上的目录结构(使用ls或dir命令),那么首先就要建立一个数据通道,因为只有数据通道才能传输目录和文件列表,此时用户会发出PORT指令告诉FTP Server连接自己的Port Y来建立一条数据通道(这个命令由控制信道发送给服务器)。当FTP Server接到这一指令时,FTP Server会使用20端口连接用户在PORT指令中指定的Port Y,用以发送目录的列表.

            当完成这一操作时,FTP Client也许要下载一个文件,那么就会发出get命令,请注意,这时Client再次发送PORT指令,告诉服务器连接他的哪个“新”端口。(你可以先用netstat -na这个命令验证,上一次使用的Y已经处于TIME_WAIT状态。)

            当这个新的数据传输通道建立后(在微软的系统中,客户端通常会使用连续的端口,也就是说这一次客户端会用Y+1这个端口),就开始了文件传输的工作。

    PASV模式

      在初始化连接这个过程,即连接FTP Server这个过程和PORT模式是一样的。

    然而,当FTP Client以PASV模式连接FTP Server,FTP Client发送ls、dir、get等这些要求数据返回的命令时,当情况就有些不同了。

        FTP Client不向服务器发送PORT指令而是发送PASV指令,在这个指令中,Client告诉FTP Server自己要连接服务器的某一个端口:

    1. 如果这个服务器上的这个端口是空闲的可用的,那么服务器会返回ACK的确认信息,之后数据传输通道被建立并返回用户所要的信息(根据用户发送的指令,如ls、dir、get等);

    2. 如果服务器的这个端口被另一个资源所使用,那么服务器返回UNACK的信息,那么这时,FTP客户会再次发送PASV命令,这也就是所谓的连接建立的协商过程。

        为了验证这个过程我们不得不借助CUTEFTP Pro这个FTP客户端软件,因为微软自带的FTP命令客户端,不支持PASV模式。虽然你可以使用QUOTE PASV这个命令强制使用PASV模式,但是当你用ls命令列出服务器目录列表,你会发现它还是使用PORT方式来连接服务器的。

    EPRT模式

            EPRT考虑到数据连接的扩展地址问题,扩展地址必须包括网络协议以及网络和传输地址。格式如下:

    1 EPRT<空格><d><网络协议><d><网络地址><d><TCP端口><d>

    EPRT后要跟空格,空格后面必须是分隔符<d>,分隔符必须在ASCII的33到126范围之内。推荐使用|,除非它已有它用。网络协议是一个数字,它指出使用的是什么协议。具体数据如下:

    1 1=IPv4;2=IPv6;

    网络地址是在指定网络协议下的相应地址,在IPv4和IPv6下地址分别如下格式:

    1 IPv4=132.235.1.2;IPv6=1080::8:800:200C:417A

    TCP端口指的是协议在哪一个TCP端口上侦听数据连接。下面是两个EPRT命令的例子:

    1 EPRT |1|132.235.1.2|6275|
    2 EPRT |2|1080::8:800:200C:417A|5282|
    3 第一个命令在TCP端口6275上用IPv4打开主机"132.235.1.2";
    4 第二个命令在TCP端口5282上用IPv6打开主机"1080::8:800:200C:417A"。

    在接收到合法的EPRT命令后,服务器必须返回200(命令合法)。标准的错误代码500和501已经足够处理大部分错误了,但是还需要一个错误代码,代码522指定服务器不支持请求的网络协议,新错误代码的解释如下:

    1 5yz 交换信息结束
    2 x2z 连接
    3 xy2 扩展端口错误:未知的网络协议

    响应的文本部分必须说明服务器运行的协议是什么,响应串的格式如下:

     
    1 <说明不支持的网络的字符串> /(协议1,协议2,...,协议n)

    上述的数字代码和在括号内的协议信息由软件自动控制接收响应;而在数字代码和'('之间的内容供人类用户处理。其后的协议表中的协议应该以逗号分隔。下面是两个响应串的例子:

    Network protocol not supported, use (1)
    Network protocol not supported, use (1,2)

    EPSV模式

    EPSV格式如下:

    1 EPSV<空格><网络协议>

    如果请求的网络协议是服务器支持的,那就必须使用此协议;如果不支持,则返回522。最后,EPSV命令可以使用参数"ALL"通过网络地址翻译器,EPRT命令不再使用。下面是例子:

    1 EPSV<空格>ALL

    接收到此命令后,服务器要拒绝除了EPSV以外所有建立连接的命令。

    对于所有在两台相同机器间建立控制和数据连接的FTP传输来说,必须使用EPSV。使用它可以减少通过防火墙和网络地址翻译器(NAT)对效率的影响。有些文章推荐在防火墙后使用被动命令,因此防火墙通常不允许主动连接。在本文中定义的EPSV命令不需要NAT在传输时对网络地址进行改变。如果使用EPRT,NAT必须改变网络地址。如果客户发送了"EPSV ALL"命令,NAT能够将连接变为快速方式,只要再不使用EPRT,就不需要对数据段的数据部分进行改变。如果客户希望进行两路FTP传输,应该使用这条命令,如果后来客户需要建立三种FTP传输,必须新打开了个FTP会话。

    EPSV请求服务器在一个数据端口上侦听等待连接,它可以带参数。对它的响应是TCP端口号。响应的格式与EPRT参数的很象。这对实现上有很大的方便。而且响应还留下了网络协议和/或网络地址的空位,可以供以后使用。使用扩展地址进行被动模式的响应码必须是229,对它的解释如下:

    1 2yz 主动完成
    2 x2z 连接
    3 xy9 进行扩展的被动模式

    响应的格式如下:

    1 <指示服务器已经进入初扩展的被动模式> /(<d><d><d><TCP端口><d>)

    包括在括号内的字符串必须是EPRT打开数据连接的端口。具体如上所未,这里就不多说了。数据连接使用的协议必须和控制连接使用的协议和地址一致,下面是响应的一个例子:

    1 Entering Extended Passive Mode (|||6446|)

    标准错误代码500和501对EPSV已经足够了(不支持EPSV)。在EPSV命令没有使用参数时,服务器会基于控制连接所使用的协议选择数据连接使用的网络协议。但是在有代理的情况下,这种机制可能不合适。因此客户也需要能够要求一个指定协议。如果服务器返回说明它在指定端口不支持此协议,客户必须发送ABOR(放弃)命令使服务器关闭连接,然后客户再使用EPSV命令要求使用特定的网络协议.

     
    常见的错误:FTP连接时出现“227 Entering Passive Mode”

    FTP的特殊性:

    大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但是,FTP协议却有所不同,它使用双向的多个连接,而且使用的端口很难预计。一般,FTP连接包括:

    • 1)一个控制连接(Control Connection)
      这个连接用于传递客户端的命令和服务器端对命令的响应。它使用服务器的21端口,生存期是整个FTP回话时间。

    • 2)几个数据连接(Data Connection)
      这些连接用于传输文件和其他数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭。每次使用的端口也不一定相同。而且,数据连接即可能是客户端发起的,也可能是服务器端发起的。

       在FTP协议中,控制连接使用周知端口21。相反,数据传输连接的目的端口通常实现无法知道。FTP协议使用一个标准的端口21作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况在这个端口上根本就没有监听进程。FTP的数据连接和控制连接的方向一般是相反的,也就是说,是服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的。FTP协议的这个特征对ISA转发以及防火墙和NAT的配置增加了很多困难。
        除此之外,还有另外一种FTP模式,叫做被动模式(passive mod)。在这种模式下,数据连接是由客户程序发起的,和刚才讨论过的模式(我们可以叫做主动模式)相反。是否采取被动模式取决于客户程序,在ftp命令行中使用passive命令就可以关闭/打开被动模式。

        主动 FTP :
          命令连接:客户端 >1024 端口 → 服务器 21 端口
          数据连接:客户端 >1024 端口 ← 服务器 20 端口
        被动 FTP :
          命令连接:客户端 >1024 端口 → 服务器 21 端口
          数据连接:客户端 >1024 端口 ← 服务器 >1024 端口
          
        PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了***X端口,你过来连接我”。于是服务器从20端口向客户端的***X端口发送连接请求,建立一条数据链路来传送数据。
        PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了***X端口,你过来连接我”。于是客户端向服务器的***X端口发送连接请求,建立一条数据链路来传送数据。
        从上面可以看出,两种方式的命令链路连接方法是一样的,而数据链路的建立方法就完全不同。而FTP的复杂性就在于此。

    解决此问题的办法也很简单,关闭客户端的PASV方式,强制其用PORT方式访问服务器. 登录FTP服务器后用passive命令关闭客户端的PASV方式,

    如下:

    ctrl+R-->cmd-->输入ftp回车  

    ftp> passive   

    Passive mode off.   

    ftp> passive (再次运行命令可打开)   

    Passive mode on.

    !!!鉴于使用云主机作为控制FTP服务器的,由于云主机本身对服务器端口就有限制,我们需要在云主机上创建安全组规则,开放端口(21+数据通道端口号)

    1、创建安全组规则,设置数据通道范围如10000到10809端口和21端口

    2、设置FTP的pasv端口范围(数据通道)

    如果不设置端口范围,在防火墙开启的情况下,连接FTP时可能出现列表错误的现象,下面介绍下如何设置FTP的pasv端口范围。
    一、首先打开IIS选择服务器会进入全局设置,再双击FTP防火墙支持


    二、设置指定的,数据通道端口范围,建议10000到10809端口,如果有云主机则必须和云主机配置一致。

     

    设置完毕后重新启动 FTP 服务

    end

  • 相关阅读:
    node起本地服务器以及实现代理,前端接口转发
    一键前端代理,一行命令开启nginx容器,代理前端页面
    go语言学习笔记
    patch需要数据格式前端算法,patch算法基础,两个对象对比取差异属性
    react-native中使用Echarts,自己使用WebView封装Echarts经验
    如何用js自己实现Animate运动函数
    vue中的表单异步校验方法封装
    Entity Framework6使用SQL Server Compact免安装部署
    WCF异常传播
    解决.net的堆碎片化带来的内存占用过大的问题
  • 原文地址:https://www.cnblogs.com/lindows/p/12120013.html
Copyright © 2020-2023  润新知