FTP服务
FTP是一个非常古老并且应用十分广泛的文件传输协议,FTP协议是现今使用最为广泛的网络文件共享协议之一,我们现在也一直有在用着FTP协议来进行各种文件的传输,FTP为我们提供了一种可靠的方式在网络上进行文件的共享。
FTP原理
FTP是C/S架构的服务,拥有一个服务器端和一个客户端,FTP底层通过TCP协议来作为传输协议,所以FTP协议是一种可靠的文件传输方式,FTP提供了两个端口号,20和21号端口,20号是数据接口,提供数据之间的传输,21号是命令接口,提供命令之间的传输。
FTP服务端与客户端连接一般有两种模式:主动模式(Active Mode)和被动模式(Passive Mode)
- 主动模式:
FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送FTP用户名和密码,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令,告诉服务端客户端采用主动模式并开放了端口。FTP服务器接收到PORT命令后,会用其本地的FTP数据端口(通常是20)来连接客户端指定的端口N+1,进行数据传输。
- 被动模式:
FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆,同时会开启N+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P(端口P的范围是可以设置的,后面会说到这个是很重要的)进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。
FTP状态码
1xx为肯定的初步答复,这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。
- 110 重新启动标记答复。
- 120 服务已就绪,在 nnn 分钟后开始。
- 125 数据连接已打开,正在开始传输。
- 150 文件状态正常,准备打开数据连接。
2xx为肯定的完成答复,一项操作已经成功完成。客户端可以执行新命令。
- 200 命令确定。
- 202 未执行命令,站点上的命令过多。
- 211 系统状态,或系统帮助答复。
- 212 目录状态。
- 213 文件状态。
- 214 帮助消息。
- 215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。
- 220 服务就绪,可以执行新用户的请求。
- 221 服务关闭控制连接。如果适当,请注销。
- 225 数据连接打开,没有进行中的传输。
- 226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。
- 227 进入被动模式 (h1,h2,h3,h4,p1,p2)。
- 230 用户已登录,继续进行。
- 250 请求的文件操作正确,已完成。
- 257 已创建“PATHNAME”。
3xx为肯定的中间答复,该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。
- 331 用户名正确,需要密码。
- 332 需要登录帐户。
- 350 请求的文件操作正在等待进一步的信息。
4xx为瞬态否定的完成答复,该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。
- 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。
- 425 无法打开数据连接。
- 426 Connection closed; transfer aborted.
- 450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。
- 451 请求的操作异常终止:正在处理本地错误。
- 452 未执行请求的操作。系统存储空间不够。
5xx为永久性否定的完成答复,该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。
- 500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。
- 501 在参数中有语法错误。
- 502 未执行命令。
- 503 错误的命令序列。
- 504 未执行该参数的命令。
- 530 未登录。
- 532 存储文件需要帐户。
- 550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。
- 551 请求的操作异常终止:未知的页面类型。
- 552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。
- 553 未执行请求的操作。不允许的文件名。
常见FTP状态代码及原因
- 150 – FTP 使用两个端口:21 用于发送命令,20 用于发送数据。状态代码 150 表示服务器准备在端口 20 上打开新连接,发送一些数据。
- 226 – 命令在端口 20 上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。
- 230 – 客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。
- 331 – 客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。
- 426 – 命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。
- 530 – 该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS 的配置可能拒绝匿名访问。
- 550 – 命令未被执行,因为指定的文件不可用。例如,要 GET 的文件并不存在,或试图将文件 PUT 到您没有写入权限的目录
FTP客户端
ftp命令程序:是最简单的FTP客户端工具,Windows和Linux都拥有ftp命令程序,可以连接到FTP服务器进行交互式的上传、下载通信。
图形化FTP客户端工具:CuteFTP、FlashFXP、LeapFTP、Filezilla等,
Filezilla官方网站:https://filezilla-project.org/download.php?show_all=1
VSFTP部署安装
1、通过yum源安装vsftp
[root@antong ~]# yum install -y vsftpd
[root@antong ~]# systemctl restart vsftpd
2、了解常用的配置文件配置
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
常用的全局配置项:
- listen=YES:是否以独立运行的方式监听服务
- listen_address=192.168.x.x:设置监听的 IP 地址
- listen_port=21:设置监听 FTP 服务的端口号
- write_enable=YES:是否启用写入权限
- download_enable=YES:是否允许下载文件
- userlist_enable=YES:是否启用 user_list 列表文件
- userlist_deny=YES:是否禁用 user_list 中的用户
- max_clients=0:限制并发客户端连接数
- max_per_ip=0:限制同一 IP 地址的并发连接数
- guest_enable=YES:启用虚拟用户
- user_config_dir=/etc/vsftpd/vsftpd_user_conf :虚拟用户使用的配置文件目录
- allow_writeable_chroot=YES:允许写入用户主目录
常用的匿名 FTP 配置项:
-
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:限制最大传输速率(字节/秒)
常用的本地用户 FTP 配置项: -
local_enable=YES:是否启用本地系统用户
-
local_umask=022:本地用户所上传文件的权限掩码
-
local_root=/var/ftp:设置本地用户的 FTP 根目录
-
chroot_local_user=YES:是否将用户禁锢在主目录
3、配置虚拟用户
(1)创建账号数据
创建文本格式的用户名、密码列表。奇数行:账号名,偶数行:密码(即上一行中账号的密码)
[root@antong ~]# cd /etc/vsftpd/
[root@antong vsftpd]# cat users.conf //自己创建密码文件
antong
zhelishiantong
zhangsan
nifanfale
[root@antong vsftpd]# db_load -T -t hash -f user.conf users.db //转化格式
[root@antong vsftpd]# ls
ftpusers user.conf user_list users.db vsftpd.conf vsftpd_conf_migrate.s
[root@antong vsftpd]# chmod 600 user* //修改权限,防止泄露,保障安全性
[root@antong vsftpd]# ll
total 36
-rw-------. 1 root root 125 Jun 9 12:15 ftpusers
-rw-------. 1 root root 41 Sep 21 23:46 user.conf
-rw-------. 1 root root 361 Jun 9 12:15 user_list
-rw-------. 1 root root 12288 Sep 21 23:48 users_db
-rw-------. 1 root root 5116 Jun 9 12:15 vsftpd.conf
-rwxr--r--. 1 root root 338 Jun 9 12:15 vsftpd_conf_migrate.sh
(2)创建FTP根目录及虚拟用户映射的系统用户
[root@antong vsftpd]# useradd vsftpd -d /home/vsftpd -s /sbin/nologin
[root@antong vsftpd]# mkdir -p /home/vsftpd/antong
[root@antong vsftpd]# chmod -R 755 /home/vsftpd/
(3)建立支持虚拟用户的PAM认证文件
创建好虚拟用户的账号数据文件后,还需要对vsftpd服务的配置做相应的调整,以便识别并读取新的用户信息。在vsftpd中,用户认证是通过PAM机制来实现的,该机制包含灵活的选择认证方式。
Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd
[root@ftp ~]# vi /etc/pam.d/vsftpd //添加以下内容
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users
(4)添加虚拟用户支持
为不同的虚拟用户建立独立的配置文件,为每个虚拟用户建立单独的配置文件来实现。为FTP用户启用独立配置文件,需要修改vsftpd.conf配置文件,添加“user_config_dir”配置项
[root@antong vsftpd]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #禁止匿名用户登录
增加下面配置参数:
chroot_local_user=YES #禁止用户访问除主目录以外的目录
guest_enable=YES #启用虚拟用户
allow_writeable_chroot=YES # 允许写入用户主目录
user_config_dir=/etc/vsftpd/vsftpd_user_conf #虚拟用户使用的配置文件目录
有了上述配置以后,就可以在/etc/vsftpd/vsftpd_user_conf 目录中为每个虚拟用户分别建立配置文件了。
[root@antong vsftpd]# mkdir vsftpd_user_conf
[root@antong vsftpd]# cd vsftpd_user_conf/
[root@antong vsftpd_user_conf]# vim antong
local_root=/home/vsftpd/xmcsxy # 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。
anon_upload_enable=YES # 是否允许登陆用户有上传权限。
write_enable=YES # 是否允许登陆用户有写权限。
在vsftpd.conf文件中启用了“user_config_dir”配置项以后,应该为每一个虚拟用户都建立一个单独的配置文件(可以是空文件),否则该用户可能无法登录。在每个用户的独立配置文件中,可以添加新的配置项来限制访问权限、下载速率等。
4、重启服务并测试
[root@antong ~]# systemctl restart vsftpd
[root@antong ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
在家目录写入一个文件:
[root@antong ~]# cat /home/vsftpd/antong/a.txt
this is a vsftp server
使用电脑CRT访问:
访问限制黑白名单
设置ftp黑白名单:(系统账号FTP登录限制文件)
ftpusers和user_list两个文件用途和区别:
ftpusers
ftpusers它不受任何配置项影响,总是有效,是黑名单!
创建2个测试账号:test1和test2
[root@antong ~]# useradd test1
[root@antong ~]# useradd test2
[root@antong ~]# passwd test1
Changing password for user test1.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@antong ~]# passwd test2
Changing password for user test2.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@antong ~]# vim /etc/vsftpd/ftpusers //将test1加入黑名单
test1
使用test1用户无法访问,返回状态码530,test2为200,可以访问
user_list
user_list 则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!
userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。
为了说明这个问题,我们来建立两个测试用户:
test1: 在user_list中
test2:不在user_list中
然后我们分别给两个配置项取不同的值,分4种Case进行测试:
Case 1: userlist_enable=YES, userlist_deny=YES
test1: 拒绝登入
test2: 允许登录
Case 2: userlist_enable=YES, userlist_deny=NO
test1: 允许登录
test2:拒绝登录(如user_list文件开头的注释所述,甚至不会提示输入密码,即无登入提示框,直接拒绝连接)
Case 3: userlist_enable=NO,userlist_deny=NO
test1: 允许登录
test2: 允许登录
Case 4: userlist_enable=NO,userlist_deny=YES
test1: 允许登录
test2: 允许登录
当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous