Linux 环境下 FTP 文件传输服务

2,702 阅读8分钟

这是我参与更文挑战的第 9 天,活动详情查看:更文挑战


概述

FTP(File Transfer Protocol,文件传输协议)是典型的C/S结构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。

FTP连接及传输模式

FTP服务器默认使用TCP协议的20、21端口与客户端进行通信。20端口用于建立数据连接并传输文件数据;21端口用于建立控制连接,并传输FTP控制命令。

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

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

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

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

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

FTP用户类型

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

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

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

FTP服务器软件的种类

在windows系统中,常见的FTP服务器软件包括FileZilla Sener、Serv-U等,而在Linux系统中,vsftpd是目前在Linux/UNIX领域应用十分广泛的一款FTP服务软件。该软件针对安全特性方面做了大量的设计。除了安全性以外,vsftpd在速度和稳定性方面的表现也相当突出。可以支持15000个用户并发连接。

FTP客户端工具的种类

windows和Linux系统默认都自带有ftp命令程序,可以连接到FTP服务器进行交互式的上传,下载通信。除此以外,还有大量的图形化FTP客户端工具。windows中常用的包括CuteFTP、FlashFXP、LeapFTP、Filezilla等;

环境准备工作

挂载光盘,搭建YUM仓库。

[root@localhost ~]# cd /
[root@localhost /]# ls
bin   cgroup  etc   lib    lost+found  misc  net  proc  sbin     srv  tmp  var
boot  dev     home  lib64  media       mnt   opt  root  selinux  sys  usr
[root@localhost /]# mkdir /181201
[root@localhost /]# mount /dev/cdrom /181201/
mount: block device /dev/sr0 is write-protected, mounting read-only
[root@localhost /]# alias vi='/usr/bin/vim'
[root@localhost /]# which -a vi vim
alias vi='/usr/bin/vim'
 /usr/bin/vim
/bin/vi
/usr/bin/vim
[root@localhost /]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo  CentOS-Vault.repo
[root@localhost yum.repos.d]# mkdir a
[root@localhost yum.repos.d]# mv C* a
[root@localhost yum.repos.d]# ls
a
[root@localhost yum.repos.d]# mv a/CentOS-Debuginfo.repo .
[root@localhost yum.repos.d]# ls
a  CentOS-Debuginfo.repo
[root@localhost yum.repos.d]# cp CentOS-Debuginfo.repo yum.back
[root@localhost yum.repos.d]# ls
a  CentOS-Debuginfo.repo  yum.back
[root@localhost yum.repos.d]# vi CentOS-Debuginfo.repo
[debug]
name=CentOS-6 - Debuginfo
baseurl=file:///181201
gpgcheck=0
enabled=1

安装vsftpd服务

[root@localhost yum.repos.d]# yum -y install vsftpd*
Loaded plugins: fastestmirror, refresh-packagekit, security
debug                                                     | 4.0 kB     00:00 ...
debug/primary_db                                          | 4.4 MB     00:00 ...
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package vsftpd.x86_64 0:2.2.2-11.el6_4.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

==========================================================================================
Package           Arch              Version                       Repository        Size
==========================================================================================
Installing:
vsftpd            x86_64            2.2.2-11.el6_4.1              debug            151 k

Transaction Summary
==========================================================================================
Install       1 Package(s)

Total download size: 151 k
Installed size: 331 k
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
 Installing : vsftpd-2.2.2-11.el6_4.1.x86_64                                         1/1
 Verifying  : vsftpd-2.2.2-11.el6_4.1.x86_64                                         1/1

Installed:
 vsftpd.x86_64 0:2.2.2-11.el6_4.1                                                        

Complete!
[root@localhost yum.repos.d]#

安装db_load工具并创建用户(字母行为账户,偶数行为密码);

[root@localhost yum.repos.d]# rpm -ivh /181201/Packages/db4-utils-4.7.25-18.el6_4.x86_64.rpm
warning: /181201/Packages/db4-utils-4.7.25-18.el6_4.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
 package db4-utils-4.7.25-18.el6_4.x86_64 is already installed
[root@localhost yum.repos.d]# cd /etc/vsftpd/
[root@localhost vsftpd]# vi user
xiao
666
ming
666
hua
666

为user文件加密并建立支持虚拟用户的PAM认证文件;

[root@localhost vsftpd]# db_load -T -t hash -f user user.db
[root@localhost vsftpd]# useradd -s /sbin/nologin 181201
[root@localhost vsftpd]# vi /etc/pam.d/vsftpd.181201
auth       required     /lib64/security/pam_userdb.so db=/etc/vsftpd/user
account    required     /lib64/security/pam_userdb.so db=/etc/vsftpd/user

在vsftpd的配置文件中添加支持虚拟用户并启动vsftpd服务;

[root@localhost vsftpd]# vi vsftpd.conf
write_enable=YES         //启用任何形式的写入权限(如上传、删除文件等)都需要开启此项
anon_umask=022          //设置匿名用户所上传文件的默认权限掩码值
anonymous_enable=YES      //是否允许匿名访问
anon_upload_enable=YES    //是否允许匿名用户上传文件
anon_mkdir_write_enable=YES //是否允许匿名用户有创建目录的写入权限
anon_other_write_enable=NO  //是否允许匿名用户有其他写入权限,如对文件改名、覆盖及删除文件等
dirmessage_enable=YES     //用户切换进入目录时显示.message文件(如果存在)的内容
xferlog_enable=YES       //启用xferlog日志,默认记录到/var/log/xferlog
connect_from_port_20=YES  //允许服务器主动模式(从20端口建立数据连接)
xferlog_std_format=YES   //启用标准的xferlog日志格式,若禁用此项,将使用vsftpd自己的日志格式
listen=YES           //是否以独立运行的方式监听服务
userlist_enable=NO     //是否启用user_list用户列表文件
tcp_wrappers=YES      //是否启用TCP_Wrappers主机访问控制
guest_enable=YES      //启用用户映射功能
guest_username=181201   //指定映射的系统用户名称
pam_service_name=vsftpd.181201  //指定新的PAM认证文件
chroot_local_user=YES   //是否将FTP本地用户禁锢在宿主目录中
local_umask=077       //设置本地用户所上传文件的默认权限掩码
local_enable=YES      //是否允许本地系统用户访问
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/user_dir //查找每个用户的独立
[root@localhost vsftpd]# service vsftpd restart
关闭 vsftpd:                                              [确定]
为 vsftpd 启动 vsftpd:                                    [确定]
[root@localhost vsftpd]#

给虚拟用户建立独立的配置文件并给权限(配置文件里要有用户配置目录支持,上图启动服务上方一行就是)并指定wang用户的根目录

[root@localhost vsftpd]# mkdir /20181201
[root@localhost vsftpd]# chown 181201:181201 /20181201/
[root@localhost vsftpd]# chmod 777 /20181201/
[root@localhost vsftpd]# ls -ldh /20181201/
drwxrwxrwx. 2 181201 181201 4.0K 6月   4 08:04 /20181201/
[root@localhost vsftpd]# mkdir /etc/vsftpd//user_dir
[root@localhost vsftpd]# cd user_dir/
[root@localhost user_dir]# vi wang
local_root=/20181201

测试匿名FTP服务器:配置好vsftpd并启动服务以后,就可以使用FTP客户端工具进行验证了。windows主机中可以在“电脑”地址栏内输入URL地址访问,在Linux的字符界面中,可以使用ftp命令进行测试。

[root@localhost ~]# ftp 172.20.10.6
Connected to 172.20.10.6 (172.20.10.6).
220 (vsFTPd 2.2.2)
Name (172.20.10.6:root): xiao   //用户名
331 Please specify the password.
Password:                //密码可任意输入,或直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 201812011255      //分别创建了两个目录
257 "/201812011312" created
ftp> mkdir 201812011256
257 "/201812011313" created
ftp>                  //成功登录后的操作提示符

然后在FTP服务器的默认目录进行查看是否有刚创建的两个目录。

[root@localhost ~]# cd /home/181201/
[root@localhost 181201]# ls
201812011312  201812011313
[root@localhost 181201]#

本文完。


原创不易,如果你觉得这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!

我们下期再见!