查看原文
其他

Linux环境下FTP文件传输服务

Jake Tian 杰哥的IT之旅 2022-06-06


概述


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]#



【推荐阅读】



【关于投稿】


如果大家有原创好文投稿,请直接给公号发送留言。


① 留言格式:
【投稿】+《 文章标题》+ 文章链接

② 最后请附上您的个人简介哈~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存