Linux里面(linux ())

FTP(File Transfer Protocol)可以说是最古老的协议之一了,主要是用来进行文件的传输,尤其是大型文件的传输使用 FTP 更是方便。不过,值得注意的是,使用 FTP 来传输时,其实是具有一定程度的危险性,因为数据在因特网上面是完全没有受到保护的明文传输方式。

FTP 服务器的功能除了单纯地进行文件的传输与管理之外,依据服务器软件的配置架构,他还可以提供以下几个主要的功能:

1、不同等级的用户身份:user、guest、anonymous

FTP 服务器在默认的情况下,依据用户登录的情况而分为三种不同的身份,分别是①实体用于,real user ;②访客,guest ;③ 匿名用户,anonymous 。这三种身份的用户在系统上面的权限差异很大,例如实体用户取得系统的权限比较完整,所以可以进行比较多的操作;至于匿名用户,大概我们就提供他下载资源的能力而已。

2、命令记录与日志文件记录

FTP 可以利用系统的 syslogd 来进行数据的记录,而记录的数据包括了用户曾经使用过的命令与用户传输数据的记录,所以我们可以很轻松地在 /var/log/ 里面找到各项日志信息。

3、限制用户活动的目录

为了避免用户在你的 Linux 系统中随意进入其他目录去,可以将用户的工作范围局限在用户主目录下面。这样一来,由于用户无法离开自己的用户主目录,而且登录 FTP 后,显示的根目录就是自己用户主目录的内容,这种环境称之为 chang root ,简称 chroot ,即改变根目录的意思。

FTP 的工作流程与使用到的端口

FTP 的传输使用的是 TCP 数据包协议,TCP 在建立连接前会先进行三次握手。不过 FTP 服务器比较麻烦一些,因为 FTP 服务器使用了两个连接,分别是命令通道与数据量通道(ftp-data),而且都是 TCP 数据包,这两个连接都需要经过三次握手。

(1)建立命令通道的连接

客户端会随机取一个大于 1024 以上的端口(port AA)来与 FTP 服务器端的 port 21 实现连接,这个过程当然需要三次握手。实现连接后客户端便可以通过这个连接来对 FTP 服务器执行命令,查询文件名、下载、上传等等命令都是利用这个通道来执行的。

(2)通知 FTP 服务器端使用 Active 且告知连接的端口号

FTP 服务器的端口 21 号主要用在命令的执行,但是当涉及到数据流时,就不是使用这个连接了。客户端在需要数据的情况下,会告知服务器端要用什么方式来连接。客户端在需要数据的情况下,会告知服务器端要用什么方式来连接,如果是主动式(Active)连接时,客户端会随机启动一个端口(port BB)且通过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的连接。

(3)FTP 服务器主动向客户端连接

FTP 服务器由命令通道了解客户端的需求后,会主动地由 port 20 向客户端 port BB 连接,这个连接也需要经过三次握手。此时 FTP 的客户端与服务器会建立两条连接,分别用在命令的执行与数据的传递。而默认 FTP 服务器端使用的主动连接端口就是 port 20

这样就成功地建立起“命令”与“数据传输”两个通道。不过,需要注意的是,数据传输通道是在有数据传输的行为时才会建立的通道,并不是一开始连接到 FTP 服务器就立刻建立的通道。

一般来说,很多局域网络都会使用防火墙(iptables)的 NAT 功能,而在 NAT 后端的 FTP 用户如何连接到 FTP 服务器呢?

(1)用户与服务器间命令通道的建立

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

(2)用户与服务器间数据通道建立时的通知

同样地,客户端主机会先启用 port BB ,并通过命令通道告知 FTP 服务器,且等待服务器端主动连接。

(3)服务器主动连接到 NAT 等待转递至客户端的连接问题

但是由于通过 NAT 的转换后,FTP 服务器只能得知 NAT 的 IP 而不是客户端的 IP ,因此 FTP 服务器会以 port 20 主动向 NAT 的 port BB 发送主动连接的要求。但 NAT 并没有启动 Port BB 来监听 FTP 服务器的连接。

由于 NAT 会被视为客户端,但 NAT 其实并非客户端,这也造成问题了。可以采用以下两种解决办法:

1、使用 iptables 提供的 FTP 检测模块

可以使用 modprobe 这个命令来加载 ip_conntarck_ftp 及 ip_nat_ftp 等模块,这几个模块会主动分析目标是 port 21 的连接信息,所以可以得到 port BB 的资料,此时若接受到 FTP 服务器的主动连接,就能够将该数据包导向正确的后端主机了。

2、客户端选择被动式(Passive)连接模式

FTP 还提供了一种称为被动式连接的模式,被动式连接其实就是由客户端向服务器端发起连接,既然是客户端发起连接的。那自然就不需要考虑来自 port 20 的连接了。

(1)用户与服务器建立命令通道

同样的需要建立命令通道,通过三次握手就可以建立起这个通道了

(2)客户端发出 PASV 的连接要求

当使用数据通道的命令时,客户端可以通过命令通道发出 PASV 的被动式连接要求,并等待服务器的回应

(3)FTP 服务器启动数据端口,并通知客户端连接

FTP 服务器会先启动一个监听端口。这个端口号码可以是随机的,也可以是自定义某一范围的端口,这要看 FTP 服务器软件而定。然后 FTP 服务器会通过命令通道告知客户端该已经启动的端口(port PASV),并等待客户端的连接

(4)客户端随机取用大于 1024 的端口进行连接

客户端会随机取用一个大于 1024 的端口号来进行对主机的 port PASV 连接。如果一切顺利的话,那么 FTP 数据就可以通过 port BB 及 port PASV 来传送了

被动式 FTP 数据通道的连接方向是由客户端向服务器端连接的,如此一来,在 NAT 内部的客户端主机就可以顺利地连接上 FTP Server 了。

以上内容主要出自《鸟哥的Linux私房菜》

对此献上本人真挚的谢意!

bye!