FTP 的数据链路原理

FTP 是相当古老的传输协议之一,他最主要的功能是在服务器与客户端之间进行档案的传输。 FTP 其实是以 TCP 封包的模式进行服务器与客户端计算机之间的联机,当联机建立后,使用者可以在客户端端连上 FTP 服务器来进行档案的下载与上传,此外,也可以直接管理用户在 FTP 服务器上面的档案呢,相当的方便!而这个古老的协议是使用明码传输,且过去有相当多的安全危机历史。为了更安全的使用 FTP 协议,我们主要介绍较为安全但功能较少的 vsftpd 这个软件吶。

FTP 功能简介

FTP 服务器的功能除了单纯的进行档案的传输与管理之外,依据服务器软件的设定架构,他还可以提供几个主要的功能,底下我们约略的来谈一谈:

·        不同等级的用户身份:

FTP 服务器在预设的情况下,依据使用者登入的情况而分为三种不同的身份,分别是 (1)实体账号,realuser(2)访客, guest(3)匿名登录者, anonymous 这三种。这三种身份的用户在系统上面的权限差异很大喔!例如实体用户取得系统的权限比较完整,所以可以进行比较多的动作;至于匿名登录者,大概我们就仅提供他下载一下资源而已,并不许匿名者使用太多主机的资源啊!当然,这三种人物能够使用的『在线指令』自然也就不相同啰! ^_^

·        命令记录与登录文件记录:

FTP 可以利用系统的 syslogd 这个daemon 来进行数据的纪录,而记录的数据报括了用户曾经下达过的命令与用户传输数据(传输时间、档案大小等等)的纪录呢!所以你可以很轻松的在/var/log/ 里面找到各项登录信息喔!

·        限制或解除用户家目录所在(change root, 简称 chroot)

为了避免用户在您的 Linux系统当中随意逛大街 (意指离开用户自己的家目录而进入到Linux 系统的其他目录去)所以将使用者的工作范围『局限』在用户的家目录底下,嗯!实在是个不错的好主意!FTP 可以限制用户仅能在自己的家目录当中活动喔!如此一来,由于使用者无法离开自己的家目录,而且登入 FTP 后,显示的『根目录』就是自己家目录的内容,这种环境称之为 change root ,简称chroot ,改变根目录的意思啦!

这有什么好处呢?当一个恶意的使用者以 FTP 登入您的系统当中,如果没有chroot 的环境下,他可以到 /etc, /usr/local, /home 等其他重要目录底下去察看档案数据,尤其是很重要的 /etc/ 底下的配置文件,如/etc/passwd 等等。如果您没有做好一些档案权限的管理与保护,那他就有办法取得系统的某些重要信息,用来『***』您的系统呢!所以在 chroot的环境下,当然就比较安全一些咯!

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

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

wKioL1X_dDzyJLlYAAB97t-NUzQ560.jpg
图一、FTP 服务器的主动式联机示意图


简单的联机就如上图所示,至于联机的步骤是这样的:

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

 

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

 

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

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

 

 

以上是vsftpd的功能和原理,下面我给大家做一个小小的实验


实验环境

一:Linux6.4一台(192.168.10.199

测试二:win7(物理机,IP192.168.10.113

 

环境建设起来了,我们想一想要做什么呢!平时企业中用的最多的就是vsftpd虚拟用户。如果要是用本地用户的话,那管理员的工作量有多大!我们可以想想一下,最好的方法就是用vsftpd的强大功能虚拟用户。

下面我来给大家演示:

Linux一:

wKiom1X_cY7xLZcfAAK0JrDp05Y664.jpg

物理机

wKioL1X_dOGTfO5sAADHW3y5EVw756.jpg

接下来我们在Linux上安装vsftpd

这里我为了加快进程就安装好了

wKiom1X_cqTTWjFQAAA6iwHjWTQ303.jpg

我们查看一下vsftpd产生哪些配置文件

wKiom1X_cqSzx7VzAAB-MiSqAm4449.jpg

第一个是日记文件

第二个是虚拟用户认证配置文件

第三个是限制

第四个是黑白名单

第五个是vsftpd的配置文件(核心)

 

下面我开始配置虚拟用户,看我操作。

Ⅰ:我在/etc/vsftpd/下创建了一个名字为vuser.txt的文本

wKioL1X_dOLw3ZsEAAA0-arhx9Q677.jpg

里面添加了三个用户(奇数为用户,偶数为密码)

wKioL1X_dOKARPPsAAAkrZbeKGE225.jpg

Ⅱ:建立访问者的口令库文件,然后修改其权限(如果系统提示找不到db_load命令,则需先安装yum –y install db4 (pam*是否需安装没经过测试)wKiom1X_cqWj-TkIAABP5eH59so527.jpg

:进入/etc/pam.d/中创建vsftpd.vuser

在其中添加如下信息:

auth required /lib64/security/pam_userdb.sodb=/etc/vsftpd/vuser (32位系统是/lib/目录)

account required/lib64/security/pam_userdb.so db=/etc/vsftpd/vuser(32位系统是/lib/目录)

Ⅳ:创建虚拟用户映射的系统账号

Useradd –d /home/vsftpd –s /sbin/nologinvuser (创建系统账号,但不能登录系统)

Chmod 700 /home/vsftpdⅤ:修改主配置文件(/etc/vsftpd/vsftpd.conf)

wKioL1X_dOKCBe3BAABYrgX9Fy0222.jpg

在里面添加如下几行信息

Guest_enable=yes  开启虚拟用户

User_config_dir=/etc/vsftpd/vsftpd_vuser_conf  虚拟用户配置文件存放目录

Guest_username=vuser 虚拟用户映射到系统账号

Pam_service_name=vsftpd.vuser   PAM认证文件

wKiom1X_cqWAaZeGAABuFXjIXZ0016.jpg

Ⅵ:进入/etc/vsftpd/vsftpd_vuser_conf目录,创建与虚拟用户名相同名称的文件(虚拟用户名即vuser.txt中的用户名名),比如创建test1。这个目录是手工创建出来的,默认没有的。

wKioL1X_dOPj0KWsAAB5TsXpTsE647.jpg

Ⅶ: 在test1中填写如下信息

write_enable=YES

anon_world_readable_only=NO

anon_upload_enable=YES

anon_mkdir_write_enable=YES

anon_other_write_enable=YES

local_root=/usr/local/amp/apache/htdocs/test1(此路径根据虚拟用户要访问的目录对应修改)全部

wKiom1X_cqawuLO7AABiy5S91zQ104.jpg

弄好之后不要忘记重新启动服务器


测试:我在物理机上!

先来互拼一下,看看网络到底通不通.(如果不通关闭防火墙iptables -F)

wKioL1X_dOOTIHoxAAFKvTxMiTA573.jpg

此时我们就开始测试了。

wKiom1X_cqbjXhVFAAEJqeaUY9k553.jpg

如果一开始访问不了的话,我们把防火墙和selinux全部关掉在试我们发现此时是可以访问了,但是不要用户和密码,那就说明我们的主配置文件内的匿名用户还开启中。我们去把他关掉在试试看。还有没有同样的错误。看,我们修改了主配置内的匿名,不允许登录了,测试成功了

wKioL1X_dOTCl_VhAAP9AK8T4B4319.jpg

总结:客户端根据创建的虚拟用户连接服务器,虚拟用户映射到系统账号vuser登录ftp,然后FTP根据配置文件vsftpd.conf的设置(user_config_dir=/etc/vsftpd/vsftpd_vuser_conf)找到虚拟用户配置文件的存放目录,然后根据虚拟用户的配置文件指定的目录路径(local_root=/usr/local/amp/apache/htdocs/demo)访问到指定的目录。(注:虚拟用户访问到的文件根目录属主需要改成vuser