基础服务——FTP文件传输服务

 

服务理论:

1FTP连接及传输模式:

FTP服务器默认使用TCP协议的2021端口与客户端进行通信。20端口用于建立数据连接,并传输文件数据。21端口用于建立控制连接。并传输FTP控制命令。根据FTP服务器在建立数据连接过程中的主、被动关系。FTP数据连接分为主动模式和被动模式。两者的含义及主要区别如下。

 

主动模式:服务器主动发起数据连接。首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,客户端以PORT命令告知服务器“我打开了某端口,你过来连接我”,于是服务器从20端口向客户端的该端口发送请求并建立数据连接。

 

被动模式:服务器被动等待数据连接,如果客户机所在网络的防火墙禁止主动模式连接,通常会使用被动模式,首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,服务器以PASV命令告知客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的该端口(非20)发送请求并建立连接

 

客户端与服务器建立好数据连接以后,就可以根据从控制连接中发送ftp命令上传或下载文件了,在创数文件时,根据是否进行字符转换,分为文本模式和二进制模式

 

文本模式:又称为ASCIIAmerican Standard Code for Information Interchange,美国信息交换标准码)模式,这种模式在传输文件时使用ASCII标准字符序列,一般只用于纯文件传输。

二进制模式:又称为Binary模式,这种模式不会转换文件中的字符序列,更适合传输程序,图片等非纯文本字符文件。

 

 

2FTP用户类型:

使用FTP客户端软件访问服务器时,通常要用到一类特殊的用户账号,其用户名为ftp或anonymous,提供任意密码(包括空密码)都可以通过服务器的验证,这样的用户成为“匿名用户”。匿名用户一般用于提供公共文件的下载,如提供一些免费软件、学习资料下载的站点。

除了不需要密码验证的匿名用户意外,FTP服务器还可以直接使用本机的系统用户账号来进行验证,这些用户通常称为“本地用户”。在RHEL6.5系统中,匿名用户也有对应的本地系统用户账号“ftp”,但对于vsftpd服务来说,本地用户指的除了匿名用户意外的其他系统用户。

有些FTP服务器软件还可以维护一份独立的用户数据库文件,而不是直接使用系统用户账户,这些誉为独立数据库文件中的FTP用户账号,通常被称为“虚拟用户”,通过使用虚拟用户,将FTP账户与Linux系统账户的关联性降至最,可以为系统提供更好的安全性。

备注:Linuxvsftpd的本地用户就是ftp

 

3FTP服务器软件的种类:

在Windows系统中,常见的FTP服务器软件包括FileZilla Sener、Serv-U等,而在Linux系统中,vsftpd是目前在Linux/UNIX领域应用十分广泛的一款FTP服务软件。本课程将以vsftpd进行讲解。

Vsftpd服务的名称来源于“Very Secure FTP Daemon”该软件针对安全特性方面做了大量的设计,除了安全意外,vsftpd在速度和稳定性方面的表现也相当突出,根据ftp.redhat.com服务器反应的数据,vsftpd可以支持15000个用户并发连接

 

 

4FTP客户端工具的种类:

最简单的FTP客户端工具莫过于ftp命令程序了,Windows系统和Linux系统默认都自带有ftp命令程序,可以连接到ftp服务器进行交互式的上传、下载通信。

除此之外,还有大量的图形化FTP客户端工具,windows中较常用的包括CuteFTP、FlashFXP、LeapFTP、Filezilla等,在图形化的客户端程序中,用户通过鼠标和菜单即可访问,管理FTP资源。而不需要掌握FTP交互命令,因此使用户的操作更加简单、易于使用。

  还有一些下载工具软件,如FlashGET、Wget等,包括大多数网页浏览器程序,都支持通过FTP协议下载文件,但因为不具备FTP上传等管理功能,通常不称为FTP客户端工具。

 

 

二、vsftpd的配置文件:

 

本章中将以Centos7系统中RPM方式安装vsftpd-3.0.2-21.el7.x86_64.rpm软件包为例,来学习ftp服务器的构建过程。Vsftpd的官方网站位于http://vsftpd.beasts.org。若希望获取最新的源码安装版本。用户可以从该站点中下载。

通过RPM方式安装的vsftpd软件包,将会自动添加名为vsftpd的系统服务,因此启动、停止vsftpd服务变得非常方便,构建vsftpd服务器的关键在于熟悉相关配置文件。Vsftpd服务的配置文件位于/etc/vsftpd目录下,包括用户列表文件(ftpusersuser_list)和主配置文件(vsftpd.conf等。

 

1、用户列表文件ftpusersuser_list

在ftpusers、user_list文件中,各自记录了若干个ftp用户账号名称,两个列表文件都用于ftp登陆控制,但是控制方式存在一些差别。

 

ftpusers文件:此文件中列出的用户将禁止登陆vsftpd服务器,不管该用户是否在user_list文件中出现。默认已包括root、bin、daemon等用于系统运行的特殊用户。

 

user_list文件:此文件中包含的用户可能被禁止登陆,也可能被允许登陆,具体取决于主配置文件vsftpd.conf中的设置,当存在“userlist_enable=YES”的配置项时,user_list列表文件方可生效;若指定“userlist_deny=YES”,则仅禁止此列表中的用户登陆;若指定“userlist_deny=NO”,则仅允许列表中的用户登陆。

Ftpusers文件相当于黑名单,为vsftpd服务器提供了一份禁止登陆用户列表,而user_list文件提供了一份可以灵活控制的用户列表。二者相互结合,为FTP账号的登陆控制提供了便捷的途径。

 

 

2、主配置文件vsftpd.conf

 

在vsftpd的配置文件中,配置行采用“配置项=参数”的格式。下面列出最常见的一些配置项及其含义说明。

 

Vsftpd.conf常见配置项及含义:

 

匿名用户:

 

anonymous_enable=YES               是否允许匿名访问

anon_umask=022                             设置匿名用户所上传文件的默认权限掩码值

anon_root=/var/ftp                         设置匿名用户的FTP根目录

anon_upload_enable=YES            是否允许匿名用户上传文件

anon_mkdir_write_enable=YES 是否允许匿名用户创建目录的写入权限

anon_other_write_enable=YES 是否允许匿名用户有其他写入权限,如对文件改名、覆盖及删除文件等

 anon_max_rate=0                限制匿名用户的最大传输速率(0为无限制),单位为字节/

 

 

本地用户:

local_enable=YES                              是否允许本地系统用户访问

local_umask=022                               设置本地用户所上传文件的默认权限掩码值

local_root=/var/ftp                          设置本地用户FTP根目录(默认为用户的宿主目录)

chroot_local_user=YES                   是否将FTP本地用户禁锢在宿主目录中

local_max_rate=0                             限制本地用户的最大传输速率(0为无限制),单位为字节/

 

全局配置:

listen=YES                                             是否以独立运行的方式监听服务

listen_address=0.0.0.0                    设置监听FTP服务的IP地址

listen_port=21                                    设置监听FTP服务的端口号

write_enable=YES 启用任何形式的写入权限(如上传、删除文件等)都需要开启此项

download_enable=YES                            是否允许下载文件(建立仅限于浏览、上传的FTP服务器时可将其设为NO

dirmessage_enable=YES      用户切换进入目录时显示.message文件(如果存在)的内容

xferlog_enable=YES                         启用xferlog日志,默认记录到/var/log/xferlog

xferlog_std_format=YES                启用标准的xferlog日志格式,若禁用此项,将使用vsftpd自己的日志格式

connect_from_port_20=YES                 允许服务器主动模式(从20端口建立数据连接)

pasv_enable=YES                              允许被动模式连接

pasv_max_port=24600                   设置用于被动模式的服务器最大端口号

pasv_min_port=24500                    设置用于被动模式的服务器最小端口号

pam_service_name=vsftpd                   设置用于用户认证的PAM文件位置(/etc/pam.d/目录中对应的文件名)

userlist_enable=YES                        是否启用user_list用户列表文件

userlist_deny=YES                                     是否禁用user_list列表文件中的用户账号

max_clients=0                                    最多允许多少个客户端同时连接(0为无限制)

max_per_ip=0  对来自同一个IP地址的客户端,最多允许多少个并发连接(0为无限制)

tcp_wrappers=YES                                     是否启用TCP_Wrappers主机访问控制(TCP Wrappers的应用将在后续课程中讲解)

 

 

 

3、搭建FTP

实验环境:本地YUM的两台Centos虚拟机

实验步骤

 

搭建FTP文件传输服务

 

  1. 搭建匿名访问FTP文件传输服务

 

服务器安装Vsftpd并配置相关参数:

[root@localhost ~]# cd /media/dvd/Packages/                进入rpm库目录

[root@localhost Packages]# rpm -ivh vsftpd-3.0.2-21.el7.x86_64.rpm         安装vsftpd

warning: vsftpd-3.0.2-21.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY

Preparing...                          ################################# [100%]

Updating / installing...

   1:vsftpd-3.0.2-21.el7              ################################# [100%]

 

[root@localhost ~]# tar zcf /var/ftp/vsftpconf.tar.gz  /etc/vsftpd/      创建压缩文件以测试

[root@localhost Packages]# chown ftp /var/ftp/pub/                       设置属主

[root@localhost Packages]# vim /etc/vsftpd/vsftpd.conf       配置

12 anonymous_enable=YES                       允许匿名用户访问

16 local_enable=YES                                    允许启用本地用户访问

19 write_enable=YES                                   开放服务器的写权限

29 anon_upload_enable=YES                     允许匿名上传文件

30 anon_umask=022                                    设置匿名用户上传数据的权限掩码(手动输入)

34 anon_mkdir_write_enable=YES          允许匿名用户创建目录

38 dirmessage_enable=YES

41 xferlog_enable=YES

115 listen=NO

126 pam_service_name=vsftpd

127 userlist_enable=YES                  

128 tcp_wrappers=YES

[root@localhost Packages]# systemctl restart vsftpd             重启vsftpd

[root@localhost Packages]# netstat -anpt | grep vsftpd        查看vsftpd启动情况

tcp6       0      0 :::21                   :::*                    LISTEN      14016/vsftpd    

[root@localhost Packages]# systemctl stop firewalld             关闭防火墙

[root@localhost Packages]# setenforce 0                                  关闭沙盒

 

 

客户端安装ftp,连接并测试:

[root@localhost ~]# cd /media/dvd/Packages/                         进入rpm库目录

[root@localhost Packages]# rpm -ivh ftp-0.17-67.el7.x86_64.rpm                安装ftp

warning: ftp-0.17-67.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY

Preparing...                          ################################# [100%]

Updating / installing...

   1:ftp-0.17-67.el7                  ################################# [100%]

[root@localhost Packages]# ftp 192.168.0.20                 连接vsftpd服务器

Connected to 192.168.0.20 (192.168.0.20).

220 (vsFTPd 3.0.2)

Name (192.168.0.20:root): ftp

331 Please specify the password.

Password:                                    这里直接回车

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> ls                查看服务器内容

227 Entering Passive Mode (192,168,0,20,65,57).

150 Here comes the directory listing.

drwxr-xr-x    2 14       0               6 Nov 05  2016 pub

-rw-r--r--    1 0        0            2792 Apr 10 08:03 vsftpconf.tar.gz

226 Directory send OK.

ftp> lcd /opt/           进入本地opt目录

Local directory now /opt

ftp> get vsftpconf.tar.gz                  安装压缩包到本地opt目录下

local: vsftpconf.tar.gz remote: vsftpconf.tar.gz

227 Entering Passive Mode (192,168,0,20,113,192).

150 Opening BINARY mode data connection for vsftpconf.tar.gz (2792 bytes).

226 Transfer complete.

2792 bytes received in 3.5e-05 secs (79771.42 Kbytes/sec)

ftp> lcd /root/                  进入本地root目录

Local directory now /root

 

ftp> cd pub               进入服务器pub目录

250 Directory successfully changed.

 

开启个新的终端在root目录下创建一个a.txt

 

ftp> put a.txt           上传a.txt

local: a.txt remote: a.txt

227 Entering Passive Mode (192,168,0,20,84,75).

150 Ok to send data.

226 Transfer complete.

ftp> ls                查看服务器内容

227 Entering Passive Mode (192,168,0,20,237,237).

150 Here comes the directory listing.

-rw-r--r--    1 14       50              0 Apr 10 08:12 a.txt

226 Directory send OK.

ftp> quit           退出

221 Goodbye.

[root@localhost Packages]# ls /opt/                查看本地opt目录下载下来的文件

rh  vsftpconf.tar.gz

 

在已经知道要下载文件的完整URL地址的情况下,用户也可以使用wget命令工具直接下载文件,省去了交互式登录过程。

 

[root@localhost ~]# wget ftp://192.168.0.20/vsftpconf.tar.gz

--2020-04-10 16:16:14--  ftp://192.168.0.20/vsftpconf.tar.gz

           => ‘vsftpconf.tar.gz’

Connecting to 192.168.0.20:21... connected.

Logging in as anonymous ... Logged in!

==> SYST ... done.    ==> PWD ... done.

==> TYPE I ... done.  ==> CWD not needed.

==> SIZE vsftpconf.tar.gz ... 2792

==> PASV ... done.    ==> RETR vsftpconf.tar.gz ... done.

Length: 2792 (2.7K) (unauthoritative)

 

100%[======================================>] 2,792       --.-K/s   in 0s     

 

2020-04-10 16:16:14 (69.9 MB/s) - ‘vsftpconf.tar.gz’ saved [2792]

[root@localhost ~]# ls              查看当前目录

anaconda-ks.cfg  a.txt  initial-setup-ks.cfg  vsftpconf.tar.gz

 

 

 

 

  1. 搭建指定用户访问FTP文件传输服务

 

服务器配置相关参数:

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf                      配置

12 anonymous_enable=YES

16 local_enable=YES

17 allow_writeable_chroot=YES               增加

19 write_enable=YES

23 local_umask=077

101 chroot_local_user=YES

[root@localhost ~]# useradd zs                创建用户

[root@localhost ~]# passwd zs                 设置密码

Changing password for user zs.

New password:

BAD PASSWORD: The password is shorter than 8 characters

Retype new password:

passwd: all authentication tokens updated successfully.

[root@localhost ~]# systemctl restart vsftpd                            重启服务器

[root@localhost ~]# netstat -anpt | grep vsftpd              查看服务启动情况

tcp6       0      0 :::21                   :::*                    LISTEN      47264/vsftpd 

 

客户机:

[root@localhost ~]# ls > abc.txt                         创建一个读取ls命令的文件

[root@localhost ~]# ftp 192.168.0.20              连接服务器

Connected to 192.168.0.20 (192.168.0.20).

220 (vsFTPd 3.0.2)

Name (192.168.0.20:root): zs                    输入服务器创建的zs用户

331 Please specify the password.

Password:                           输入设置的密码

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> put abc.txt                上传本地文件

local: abc.txt remote: abc.txt

227 Entering Passive Mode (192,168,0,20,148,138).

150 Ok to send data.

226 Transfer complete.

68 bytes sent in 0.0001 secs (680.00 Kbytes/sec)

ftp> ls                查看一下

227 Entering Passive Mode (192,168,0,20,174,72).

150 Here comes the directory listing.

-rw-------    1 1001     1001           68 Apr 10 08:25 abc.txt

226 Directory send OK.

  1. 搭建虚拟用户访问FTP文件传输服务,这里需要恢复快照

 

服务器安装vsftpd并且配置相关参数:

[root@localhost ~]# cd /media/dvd/Packages/                         进入rpm库目录

[root@localhost Packages]# rpm -ivh vsftpd-3.0.2-21.el7.x86_64.rpm         安装vsftpd服务

warning: vsftpd-3.0.2-21.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY

Preparing...                          ################################# [100%]

Updating / installing...

   1:vsftpd-3.0.2-21.el7              ################################# [100%]

[root@localhost Packages]# vim /etc/vsftpd/user.list             编辑用户文件

zs               用户名

123            密码

lisi

456

[root@localhost Packages]# cd /etc/vsftpd/           进入vsftpd的安装目录

[root@localhost vsftpd]# db_load -T -t hash -f user.list user.db              创建db格式的数据库文件

[root@localhost vsftpd]# file user.db               查看文件类型

user.db: Berkeley DB (Hash, version 9, native byte-order)

[root@localhost vsftpd]# chmod 600 /etc/vsftpd/user.*                 为了提高安全性,设置权限

[root@localhost vsftpd]# ls -lh /etc/vsftpd/user.*

-rw-------. 1 root root 12K Apr 10 16:35 /etc/vsftpd/user.db

-rw-------. 1 root root  22 Apr 10 16:35 /etc/vsftpd/user.list

[root@localhost vsftpd]# useradd zs                         创建用户zs

[root@localhost vsftpd]# vim /etc/passwd              修改zs用户的Shell环境和家目录

zs:x:501:501::/var/ftp:/sbin/nologin

[root@localhost vsftpd]# chmod 777 /var/ftp/       加权限

[root@localhost vsftpd]# cd /etc/pam.d/                 进入vsftpd的认证文件所在目录

[root@localhost pam.d]# cp vsftpd vsftpd.user      复制一份新的配置文件

[root@localhost pam.d]# vim vsftpd.user                配置

#%PAM-1.0

auth      required        pam_userdb.so   db=/etc/vsftpd/user

account   required        pam_userdb.so   db=/etc/vsftpd/user

[root@localhost pam.d]# vim /etc/vsftpd/vsftpd.conf            配置vsftpd

12 anonymous_enable=NO                        关闭匿名访问FTP服务

13 allow_writeable_chroot=YES               添加

17 local_enable=YES

20 write_enable=YES

24 local_umask=022

38 dirmessage_enable=YES

41 xferlog_enable=YES

44 connect_from_port_20=YES

58 xferlog_std_format=YES

115 listen=NO

124 listen_ipv6=YES

126 pam_service_name=vsftpd.user               修改——指定新的PAM认证文件

127 guest_enable=YES                                增加——启动映射功能

128 guest_username=zs                            增加——制定映射系统用户名

129 user_config_dir=/etc/vsftpd/users                     增加——为不同的用户建立独立的配置文件

[root@localhost pam.d]# cd /etc/vsftpd/        进入vsftpd安装目录

[root@localhost vsftpd]# mkdir users              创建用户配置目录

[root@localhost vsftpd]# ls

ftpusers  user_list  users        vsftpd_conf_migrate.sh

user.db   user.list  vsftpd.conf

[root@localhost vsftpd]# cd users/                   进入用户配置目录

[root@localhost users]# vim zs                编辑用户配置文件

anon_upload_enable=YES                          下载权限

anon_mkdir_write_enable=YES         上传写入权限

local_root=/var/ftp

write_enable=YES

anon_world_readable_only=YES

[root@localhost users]# systemctl restart vsftpd           重启vsftpd服务

[root@localhost users]# netstat -anpt | grep vsftpd      查看vsftpd服务的启动情况

tcp6       0      0 :::21                   :::*                    LISTEN      14194/vsftpd    

[root@localhost users]# systemctl stop firewalld           关闭防火墙

[root@localhost users]# setenforce 0                                关闭沙盒

 

客户端安装ftp,连接并且验证:

[root@localhost ~]# cd /media/dvd/Packages/                进入rpm库目录

[root@localhost Packages]# rpm -ivh ftp-0.17-67.el7.x86_64.rpm                安装ftp

warning: ftp-0.17-67.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY

Preparing...                          ################################# [100%]

Updating / installing...

   1:ftp-0.17-67.el7                  ################################# [100%]

[root@localhost Packages]# ftp 192.168.0.20                 连接服务器

Connected to 192.168.0.20 (192.168.0.20).

220 (vsFTPd 3.0.2)

Name (192.168.0.20:root): zs                   输入zs用户

331 Please specify the password.

Password:                           输入密码

230 Login successful.

Remote system type is UNIX.

Using binary mode to transfer files.

ftp> mkdir wenjian                   创建一个目录

257 "/wenjian" created

ftp> ls                查看目录所在

227 Entering Passive Mode (192,168,0,20,131,66).

150 Here comes the directory listing.

drwxr-xr-x    2 0        0               6 Nov 05  2016 pub

drwx------    2 501      501             6 Apr 10 09:04 wenjian

226 Directory send OK.

ftp> quit

221 Goodbye.

 

你可能感兴趣的:(基础服务)