说说 FTP 主动连线模式

FTP 服务器使用了两个连线,分别是命令通道与资料流通道 (ftp-data)。 这两个连线都需要经过 TCP 的三次握手。

1 连线步骤

连线步骤是这样的:

(1)建立命令通道
用户端会随机取一个大于 1024 以上的端口 (比如示例中的 1025 ) 来与 FTP 伺服器端的 21 端口达成连线,这个过程需要三次握手!达成连线后用户端便可以透过这个命令通道对 FTP 服务器下达指令,比如查询 、 下载 、 上传等指令都是通过这个通道来下达的。

(2)通知服务端数据传输所使用的端口号以及连接方式为主动模式

当用户端需要数据时,会先随机启用一个端口 (比如示例中的 2000) ,然后使用刚才所建立的通道,来通知服务端数据传输所使用的端口号以及连接方式为主动模式,之后等待 FTP 服务器的连线。

(3) FTP 服务器 『 主动 』 向用户端连线

FTP 服务器从命令通道了解用户端的需求后,会主动从 20 这个端口向用户端的 2000 端口建立连线,这个连线也是会经过三次握手!此时 FTP 的用户端与服务器端总共会建立两条连线,分别用于下达命令与数据传输上。

注意: 『 资料传输通道 』 是在有资料传输的行为时才会建立的通道!


总的来说,有以下两个通道:

  1. 命令通道,预设端口为 21。
  2. 数据传输通道,预设端口为 20。

2 防火墙连线问题

一般来说,很多区域网络都会使用到防火墙 (iptables) 的 NAT 功能,这时如果使用 FTP 主动模式来连接,就会出现问题。

前两步很顺利,但会在服务器主动连到 NAT 并等待转递到用户端时出现问题:因为通过 NAT 转换后, FTP 服务器只知道 NAT 的 IP 而不懂用户端的 IP,因此 FTP 服务器会以 20 端口主动向 NAT 的 2000 端口 发送主动连线要求。可是我们的 NAT 并没有启动 2000 端口 来监听 FTP 服务器的连线!

在 FTP 的主动式模式中, NAT 被视为用户端,所以出现问题。这时就会发现明明命令通道可用,但就是无法取得数据(抛出 Can’t build data connection: Connection refused)。

可以使用以下方法来解决这个问题:

  1. 使用 iptables 所提供的 FTP 侦测模组。使用 modprobe 指令来载入 ip_conntrack_ftp 及 ip_nat_ftp 等模组,这些模组会主动的分析 21 端口,这时再接到 FTP 服务器的主动连线,就能够将该包导向正确的目的端咯。注意: 连结的目标 FTP 服务器,所对应的命令通道端口必须是 21,才能通过侦测模组导向成功。
  2. 使用被动 (Passive) 连线模式。被动模式指的是服务器被动接受用户端发起的连接,即由用户端向伺服器端发起连线,因此不需要考虑来自服务器 20 端口的连线。
发布了601 篇原创文章 · 获赞 668 · 访问量 88万+

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/103654364
今日推荐