当前位置 博文首页 > 文章内容

    FTP数据端口连接:云逸之的博客

    作者:shunshunshun18 栏目:未分类 时间:2021-10-17 20:17:03

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    推荐 IIS7批量FTP管理工具 IIS7批量FTP管理
    IIS7批量FTP管理功能说明:
    1、可批量导入,导出FTP信息
    2、其他ftp工具有的功能,我们也有
    3、特色功能:可以定时上传下载
    4、数据信息列表化、一眼就能知道那个是那个
    5、批量连接 标签页式切换 方便快捷
    6、7大连接模式 更多好的兼容
    7、内嵌编辑器 有效解决普通txt记事本乱码
    8、锁屏功能 当程序有规定时间内没人操作,则自动锁程序。输入密码才可以正常操作

    本产品适用于:懒得记录FTP信息和有批量定时备份,上传下载的运维或站长。

    图:


    IIS7批量FTP管理

    FTP基于TCP,可以配置SSL,此时便可成为FTPS。同于HTTP配置SSL后协议名变为HTTPS。

    但FTP交互通常会使用两个通道。命令通道与数据通道

    命令通道的建连:

    • 常说的FTP端口一般指命令通道的端口,命令通道的监听是在FTP服务启动的时候开始监听。
    • FTP连接的发起,由客户端主动发起,先建立TCP三次握手。
    • 如果是配置SSL/TLS。需要客户端在SSL握手前发送 AUTH TLS ,服务端也会从TCP明文通道回复 234 AUTH。(‘234’ 是FTP服务端响应 的状态码。)
    • 之后客户端才会发起SSL握手,建立加密通道后,再进行其他命令交互,进行一些设置,用户登录。
    • 再通过一些命令查询文件列表,传输文件。而文件列表以及文件的数据流,并不是通过命令通道进行输入输出。这些数据需要通过数据通道来传输。

    数据通道


    以下是一段点击ftp客户端上显示的文件夹(tem),进入一个新的FTP目录的FTP命令的日志

    [16:34:45] [R] CWD tem
    [16:34:45] [R] 250 Directory changed to /tem
    [16:34:45] [R] PWD
    [16:34:45] [R] 257 "/tem" is current directory.
    [16:34:45] [R] PASV
    [16:34:45] [R] 227 Entering Passive Mode (10,148,129,95,234,88)
    [16:34:45] [R] 正在打开数据连接 IP: 10.148.129.95 端口: 59992
    [16:34:45] [R] MLSD
    [16:34:45] [R] TLSv1.2 协商成功...
    [16:34:45] [R] TLSv1.2 已加密会话正在使用密码 ECDHE-RSA-AES256-GCM-SHA384 (256 位)
    [16:34:45] [R] 150 File status okay; about to open data connection.
    [16:34:45] [R] 226 Closing data connection.
    

    执行CWD(改变工作目录)和PWD(打印当前工作目录)后,发送了一个PASV命令,响应的报文中,带了一个地址。而执行MLSD的时候进行了TLS协商。

    MLSD 是获取文件列表的命令,具体解析如下:

    Causes a list to be sent from the server to the passive DTP

    获取文件列表之前发送PASV。PASV则是建立数据通道的连接的一种方式。PASV命令返回了一个服务端的地址,FTP服务端在这个地址完成了一个监听,然后等待客户端去连,这种成为被动模式。

    被动模式

    如上述,客户端发送PASV,服务端随机一个1024以上的端口监听,然后将地址发给客户端。有些FTP服务器是可以配置随机端口的范围。但被动模式下这种随机端口,可能被服务端防火墙屏蔽,造成FTP可以登录无法传文件

    其中FTP地址编码,如下(apache FTP server的实现)。是将IP的’.‘替换成’,’,将端口(端口范围1~0xffff,16位) 前8位的值用端口数字右移8位取出,放入第四个逗号与第五个逗号之间,而剩下的8位值与0xff做与运算取出拼在最后。上述端口为234,88 通过(234<< 8) | 88 可得出端口号。(可以使用Python nodejs jjs等命令行进行快捷计算。)

    public static String encode(InetSocketAddress address) {
            InetAddress servAddr = address.getAddress();
            int servPort = address.getPort();
            return servAddr.getHostAddress().replace('.', ',') + ','
                    + (servPort >> 8) + ',' + (servPort & 0xFF);
        }
    

    将FTP客户端设置为主动模式后,进行上述操作,其日志如下:

    [17:18:52] [R] CWD /tem
    [17:18:52] [R] 250 Directory changed to /tem
    [17:18:52] [R] PWD
    [17:18:52] [R] 257 "/tem" is current directory.
    [17:18:52] [R] 正在侦听端口: 13565,正在等待连接。
    [17:18:52] [R] PORT 10,148,129,225,52,253
    [17:18:52] [R] 200 Command PORT okay.
    [17:18:52] [R] MLSD
    [17:18:52] [R] TLSv1.2 协商成功...
    [17:18:52] [R] TLSv1.2 已加密会话正在使用密码 ECDHE-RSA-AES256-GCM-SHA384 (256 位)
    [17:18:52] [R] 150 File status okay; about to open data connection.
    [17:18:52] [R] 226 Closing data connection.
    
    主动模式

    主动模式,客户端会在本地启一个端口的监听,然后将地址通过PORT 命令发送给服务端,用来建立数据通道的连接。

    据网上资料,客户端与服务端命令通道建连 的本地的随机端口数值(N),在主动模式下会监听(N+1)的端口。

    经过实测,发现是连接后的首次打开数据端口监听会监听N + 1端口。再次需要打开数据端口重新传输数据,本人并未得出明显规律。

    也就是说在这种情况下,客户端会监听相对未知 的端口,也会面临被客户端数据端口所在机器的防火墙屏蔽的问题

    NAT组网下,数据端口无法建连 的问题

    • 本人对NAT组网认识比较浅粗,对这种场景不能做很细节的分析。

    • 本人将NAT理解为在内网中,通过内网中已经接入外网的NAT路由器将内网地址转成外网,来与外界通讯。

    • 这种场景,内网与网外的地址并不是通的,FTP建立数据端口连接的时候,通过PASV或者PORT命令交互的地址存在报文中,当另一端去访问那个地址时,就不能建立连接。这种情况下,需要在NAT路由器的地方使用应用网关 **ALG(Application Level Gateway)**将地址进行转换,来建立连接。

    设置数据端口的加密 PROT 命令

    FTPS情况下并不一定安全,数据端口在命令通道加密的情况下,也可以走建立非加密通道。

    涉及一个命令 PROT (protection )。这个命令容易与PORT命令混淆,这个命令用于设置数据通道的加密与非加密。

    Data channel protection level.

    参数有两种 C和P。PROT C PROT P 目前没有找到文档对C和P的详细解释,从源码中,得出C的情况 ,启数据端口监听是普通TCP通道的监听,而P的情况下会建立SSL通道的监听。当发起连接的时候,需要SSL握手,再进行数据流传输。

    cs