FTP服务

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

posted @ 2021-09-22 13:30  殇黯瞳  阅读(507)  评论(0编辑  收藏  举报