服务理论:
1、FTP连接及传输模式:
FTP服务器默认使用TCP协议的20、21端口与客户端进行通信。20端口用于建立数据连接,并传输文件数据。21端口用于建立控制连接。并传输FTP控制命令。根据FTP服务器在建立数据连接过程中的主、被动关系。FTP数据连接分为主动模式和被动模式。两者的含义及主要区别如下。
主动模式:服务器主动发起数据连接。首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,客户端以PORT命令告知服务器“我打开了某端口,你过来连接我”,于是服务器从20端口向客户端的该端口发送请求并建立数据连接。
被动模式:服务器被动等待数据连接,如果客户机所在网络的防火墙禁止主动模式连接,通常会使用被动模式,首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,服务器以PASV命令告知客户端“我打开了某端口,你过来连接我”,于是客户端向服务器的该端口(非20)发送请求并建立连接
客户端与服务器建立好数据连接以后,就可以根据从控制连接中发送ftp命令上传或下载文件了,在创数文件时,根据是否进行字符转换,分为文本模式和二进制模式。
文本模式:又称为ASCII(American Standard Code for Information Interchange,美国信息交换标准码)模式,这种模式在传输文件时使用ASCII标准字符序列,一般只用于纯文件传输。
二进制模式:又称为Binary模式,这种模式不会转换文件中的字符序列,更适合传输程序,图片等非纯文本字符文件。
2、FTP用户类型:
使用FTP客户端软件访问服务器时,通常要用到一类特殊的用户账号,其用户名为ftp或anonymous,提供任意密码(包括空密码)都可以通过服务器的验证,这样的用户成为“匿名用户”。匿名用户一般用于提供公共文件的下载,如提供一些免费软件、学习资料下载的站点。
除了不需要密码验证的匿名用户意外,FTP服务器还可以直接使用本机的系统用户账号来进行验证,这些用户通常称为“本地用户”。在RHEL6.5系统中,匿名用户也有对应的本地系统用户账号“ftp”,但对于vsftpd服务来说,本地用户指的除了匿名用户意外的其他系统用户。
有些FTP服务器软件还可以维护一份独立的用户数据库文件,而不是直接使用系统用户账户,这些誉为独立数据库文件中的FTP用户账号,通常被称为“虚拟用户”,通过使用虚拟用户,将FTP账户与Linux系统账户的关联性降至最,可以为系统提供更好的安全性。
备注:Linux中vsftpd的本地用户就是ftp。
3、FTP服务器软件的种类:
在Windows系统中,常见的FTP服务器软件包括FileZilla Sener、Serv-U等,而在Linux系统中,vsftpd是目前在Linux/UNIX领域应用十分广泛的一款FTP服务软件。本课程将以vsftpd进行讲解。
Vsftpd服务的名称来源于“Very Secure FTP Daemon”该软件针对安全特性方面做了大量的设计,除了安全意外,vsftpd在速度和稳定性方面的表现也相当突出,根据ftp.redhat.com服务器反应的数据,vsftpd可以支持15000个用户并发连接。
4、FTP客户端工具的种类:
最简单的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目录下,包括用户列表文件(ftpusers、user_list)和主配置文件(vsftpd.conf)等。
1、用户列表文件ftpusers和user_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文件传输服务
服务器安装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
服务器配置相关参数:
[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.
服务器安装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.