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握手,再进行数据流传输。

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页