概述
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]# 复制代码
本文完。