FTP服务器原理

  FTP  的运作流程与使用到的埠口

FTP 的传输使用的是 TCP 封包协定,在第二章网络基础中我们谈过, TCP 在建立连线前会先进行三向交握。不过 FTP 服务器是比较麻烦一些,因为 FTP 服务器使用了两个连线,分别是命令通道与资料流通道 (ftp-data) 。这两个连线都需要经过三向交握, 因为是 TCP 封包嘛!那么这两个连线通道的关系是如何呢?底下我们先以 FTP 预设的主动式 (active) 连线来作个简略的说明囉:

 

图 21.1-1FTP 服务器的主动式连线示意图

简单的连线流程就如上图所示,至于连线的步骤是这样的:

1 建立命令通道的连线
如上图所示,用户端会随机取一个大于 1024 以上的埠口 (port AA) 来与 FTP 服务器端的 port 21 达成连线, 这个过程当然需要三向交握了!达成连线后用户端便可以透过这个连线来对 FTP 服务器下达指令, 包括查询档名、下载、上传等等指令都是利用这个通道来下达的;

2 通知 FTP 服务器端使用 active 且告知连接的埠号
FTP 服务器的 21 埠号主要用在命令的下达,但是当牵涉到资料流时,就不是使用这个连线了。 用户端在需要资料的情况下,会告知服务器端要用什么方式来连线,如果是主动式 (active) 连线时, 用户端会先随机启用一个埠口 (图 21.1-1 当中的 port BB) ,且透过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的连线;

3 FTP 服务器『主动』向用户端连线
FTP 服务器由命令通道了解用户端的需求后,会主动的由 20 这个埠号向用户端的 port BB 连线, 这个连线当然也会经过三向交握啦!此时 FTP 的用户端与服务器端共会建立两条连线,分别用在命令的下达与资料的传递。 而预设 FTP 服务器端使用的主动连线埠号就是 port 20 囉!

如此一来则成功的建立起『命令』与『资料传输』两个通道!不过,要注意的是, 『资料传输通道』是在有资料传输的行为时才会建立的通道喔!并不是一开始连接到 FTP 服务器就立刻建立的通道呢!留意一下囉!

· 

主动式连线使用到的埠号

利用上述的说明来整理一下 FTP 服务器端会使用到的埠号主要有:

· 命令通道的 ftp (预设为 port 21) 

· 资料传输的 ftp-data (预设为port 20)

再强调一次,这两个埠口的工作是不一样的,而且,重要的是两者的连线发起端是不一样的!首先 port 21 主要接受来自用户端的主动连线,至于 port 20 则为 FTP 服务器主动连线至用户端呢!这样的情况在服务器与用户端两者同时为公共 IP (Public IP) 的网际网络上面通常没有太大的问题,不过,万一你的用户端是在防火墙后端,或者是 NAT 服务器后端呢?会有什么问题发生呢?底下我们来谈一谈这个严重的问题!

· 

在主动连线的 FTP 服务器与用户端之间具有防火墙的连线问题

回想一下我们的第九章防火墙! 一般来说,很多的区域网络都会使用防火墙 (iptables) 的 NAT 功能,那么在 NAT 后端的 FTP 用户如何连接到 FTP 服务器呢? 我们可以简单的以下图来说明:

图 21.1-2、 FTP 用户端与服务器端连线中间具有防火墙的连线状态

1 用户与服务器间命令通道的建立:
因为 NAT 会主动的记录由内部送往外部的连线信息,而由于命令通道的建立是由用户端向服务器端连线的, 因此这一条连线可以顺利的建立起来的;

2 用户与服务器间资料通道建立时的通知:
同样的,用户端主机会先启用 port BB ,并透过命令通道告知 FTP 服务器,且等待服务器端的主动连线;

3 服务器主动连到 NAT 等待转递至用户端的连线问题:
但是由于透过 NAT 的转换后,FTP 服务器只能得知 NAT 的 IP 而不是用户端的 IP , 因此 FTP 服务器会以 port 20 主动的向 NAT 的 port BB 发送主动连线的要求。 但你的 NAT 并没有启动 port BB 来监听 FTP 服务器的连线啊!

了解问题的所在了吗?在 FTP 的主动式连线当中,NAT 将会被视为用户端,但 NAT 其实并非用户端啊, 这就造成问题了。如果你曾经在 IP 分享器后面连接某些 FTP 服务器时,可能偶尔会发现明明就连接上 FTP 服务器了 (命令通道已建立),但是就是无法取得文件名称的列表,而是在超过一段时间后显示『 Can't build data connection: Connection refused,无法进行资料传输』之类的讯息, 那肯定就是这个原因所造成的困扰了。

那有没有办法可以克服这个问题呢?难道真的在 Linux NAT 后面就一定无法使用 FTP 吗?当然不是! 目前有两个简易的方法可以克服这个问题:

· 使用 iptables 所提供的 FTP 侦测模块:

其实 iptables 早就提供了许多好用的模块了,这个 FTP 当然不会被错过! 你可以使用 modprobe 这个指令来载入 ip_conntrack_ftp 及 ip_nat_ftp 等模块,这几个模块会主动的分析『目标是 port 21 的连线』信息, 所以可以得到 port BB 的资料,此时若接受到 FTP 服务器的主动连线,就能够将该封包导向正确的后端主机了! ^_^

不过,如果你连结的目标 FTP 服务器他的命令通道预设埠号并非标准的 21 埠号时 (例如某些地下 FTP 服务器), 那么这两个模块就无法顺利解析出来了,这样说,理解吗?

· 用户端选择被动式 (Passive) 连线模式:

除了主动式连线之外,FTP 还提供一种称为被动式连线的模式,什么是被动式呢? 既然主动式是由服务器向用户端连线,反过来讲,被动式就是由用户端向服务器端发起连线的囉! 既然是由用户端发起连线的,那自然就不需要考虑来自 port 20 的连线啦!关于被动式连线模式将在下一小节介绍喔!

21.1.3 用户端选择被动式连线模式

那么什么是被动式连线呢?我们可以使用底下的图示来作个简略的介绍喔:

图 21.1-3FTP 的被动式资料流连线流程

1 用户与服务器建立命令通道:
同样的需要建立命令通道,透过三向交握就可以建立起这个通道了。

2 用户端发出 PASV 的连线要求:
当有使用资料通道的指令时,用户端可透过命令通道发出 PASV 的被动式连线要求 (Passive 的缩写), 并等待服务器的回应;

3 FTP 服务器启动资料埠口,并通知用户端连线:
如果你的 FTP 服务器是能够处理被动式连线的,此时 FTP 服务器会先启动一个埠口在监听。 这个埠口号码可能是随机的,也可以自订某一范围的埠口,端看你的 FTP 服务器软件而定。 然后你的 FTP 服务器会透过命令通道告知用户端该已经启动的埠口 (图中的 port PASV), 并等待用户端的连线。

4 用户端随机取用大于 1024 的埠口进行连接:
然后你的用户端会随机取用一个大于 1024 的埠号来对主机的 port PASV 连线。 如果一切都顺利的话,那么你的 FTP 资料就可以透过 port BB 及 port PASV 来传送了。

发现上面的不同点了吗?被动式 FTP 资料通道的连线方向是由用户端向服务器端连线的喔! 如此一来,在 NAT 内部的用户端主机就可以顺利的连接上 FTP Server 了!但是,万一 FTP 主机也是在 NAT 后端那怎么办...呵呵!那可就糗了吧~ @_@这里就牵涉到更深入的 DMZ 技巧了,我们这里暂不介绍这些深入的技巧,先理解一下这些特殊的连线方向, 这将有助于你未来服务器架设时候的考虑因素喔!

此外,不晓得你有无发现,透过 PASV 模式,服务器在没有特别设定的情况下,会随机选取大于 1024 的埠口来提供用户端连接之用。那么万一服务器启用的埠口被搞鬼怎么办?而且, 如此一来也很难追踪来自入侵者攻击的登录信息啊!所以,这个时候我们可以透过 passive ports 的功能来『限定』服务器启用的 port number 喔!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值