FTP服务

FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文件传输协议,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,进行数据传输。

centos系统ftp服务端口号 centos ftp 客户端_服务器


在被动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,发送用户名和密码进行登陆,同时会开启N+1端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。服务器收到命令后,会开放一个大于1024的端口P(端口P的范围是可以设置的,后面会说到这个是很重要的)进行监听,然后用PORT P命令通知客户端,自己的数据端口是P。客户端收到命令后,会通过N+1号端口连接服务器的端口P,然后在两个端口之间进行数据传输。

centos系统ftp服务端口号 centos ftp 客户端_网络_02

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 到您没有写入权限的目录。

安装部署vsftp

通过yum源安装vsftp:

[root@server ~]# yum install -y vsftpd

主配置文件:/etc/vsftpd/vsftpd.conf
主程序:/usr/sbin/vsftpd
常用的全局配置项:
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:是否将用户禁锢在主目录

启动服务和开机自启

[root@server ~]# systemctl start vsftpd
[root@server ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

安装net-tools工具查看端口信息

[root@server ~]# yum install -y net-tools

[root@server ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1065/master         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      934/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1065/master         
tcp6       0      0 :::21                   :::*                    LISTEN      10063/vsftpd        
tcp6       0      0 :::22                   :::*                    LISTEN      934/sshd

虚拟用户配置

在vsftpd服务器中,使用虚拟用户的主要好处在与:可以将FTP登录的账号与系统登录账号区分开,用户名、密码都不相同,从而进一步增强了FTP服务器的安全性。

基本步骤如下图:

centos系统ftp服务端口号 centos ftp 客户端_服务器_03

创建账号数据

vsftpd服务使用Berkeley DB格式的数据库文件来存放虚拟用户账号。建立这种数据库文件需要用到db_load工具,db_load工具由db4-utils软件包提供,默认已安装。

① 创建文本格式的用户名、密码列表。
奇数行:账号名,偶数行:密码(即上一行中账号的密码)
② 转化为 Berkeley DB 格式的数据文件
需要db_load 转换工具,默认已安装。

-f用于指定数据源文件
-T表示允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件
-t hash用于指定读取数据文件的基本方法

③ 为了提高虚拟用户账号文件的安全性,应将文件权限设置为600,以免数据外泄。

[root@server ~]# cd /etc/vsftpd/
[root@server vsftpd]# ll
总用量 20
-rw------- 1 root root  125 6月  10 2021 ftpusers
-rw------- 1 root root  361 6月  10 2021 user_list
-rw------- 1 root root 5116 6月  10 2021 vsftpd.conf
-rwxr--r-- 1 root root  338 6月  10 2021 vsftpd_conf_migrate.sh
[root@server vsftpd]# vi users.conf
zhangsan
1234
zhaogao
5678
[root@server vsftpd]# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db
[root@server vsftpd]# ll
总用量 36
-rw------- 1 root root   125 6月  10 2021 ftpusers
-rw------- 1 root root   361 6月  10 2021 user_list
-rw-r--r-- 1 root root    27 5月  27 10:23 users.conf
-rw-r--r-- 1 root root 12288 5月  27 10:26 users.db
-rw------- 1 root root  5116 6月  10 2021 vsftpd.conf
-rwxr--r-- 1 root root   338 6月  10 2021 vsftpd_conf_migrate.sh
[root@server vsftpd]# chmod 600 /etc/vsftpd/users.*
[root@server vsftpd]# ll
总用量 36
-rw------- 1 root root   125 6月  10 2021 ftpusers
-rw------- 1 root root   361 6月  10 2021 user_list
-rw------- 1 root root    27 5月  27 10:23 users.conf
-rw------- 1 root root 12288 5月  27 10:26 users.db
-rw------- 1 root root  5116 6月  10 2021 vsftpd.conf
-rwxr--r-- 1 root root   338 6月  10 2021 vsftpd_conf_migrate.sh

④ 创建 FTP 根目录及虚拟用户映射的系统用户(此账号无需设置密码及登录shell)。

[root@server vsftpd]# useradd vsftpd -d /home/vsftpd -s /sbin/nologin 
[root@server vsftpd]# mkdir -p /home/vsftpd/xmcsxy

⑤ 建立支持虚拟用户的PAM认证文件

创建好虚拟用户的账号数据文件后,还需要对vsftpd服务的配置做相应的调整,以便识别并读取新的用户信息。在vsftpd服务器中,用户认证是通过PAM(Pluggable Authentication Module,可插拔认证模块)机制来实现的,该机制包含灵活的选择认证方式。Vsftpd服务默认的PAM认证文件位于/etc/pam.d/vsftpd,该文件适用于以Linux主机的系统用户账号进行认证。若要读取虚拟用户的账号数据文件,则需要创建新的PAM认证配置。

[root@server pam.d]# cat vsftpd 
#%PAM-1.0
auth       sufficient   /lib64/security/pam_userdb.so   db=/etc/vsftpd/users
account    sufficient   /lib64/security/pam_userdb.so   db=/etc/vsftpd/users
[root@server pam.d]# pwd
/etc/pam.d

添加虚拟用户支持

① 在 vsftpd.conf 文件中添加虚拟用户支持配置。

[root@server vsftpd]# vi /etc/vsftpd/vsftpd.conf 
anonymous_enable=NO        #禁止匿名用户登录
增加下面配置参数:
chroot_local_user=YES        #禁止用户访问除主目录以外的目录
guest_enable=YES           #启用虚拟用户
allow_writeable_chroot=YES        # 允许写入用户主目录

② 为不同的虚拟用户建立独立的配置文件
通过前面的几个步骤,实际上已经可以重新加载vsftpd并提供服务了,使用任一个虚拟用户账号都可以登录FTP服务器并下载文件。但因为所有的虚拟用户都映射到同一个系统用户账号,因此FTP访问权限也是相同的,要么只能下载,要么只能上传。

若要为不同的虚拟用户账号设置不同的访问权限,可以通过为每个虚拟用户建立单独的配置文件来实现。为FTP用户启用独立配置文件,需要修改vsftpd.conf配置文件,添加“user_config_dir”配置项。

vi /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vsftpd_user_conf 	#虚拟用户使用的配置文件目录
mkdir -p /etc/vsftpd/vsftpd_user_conf
cd /etc/vsftpd/vsftpd_user_conf/

[root@server vsftpd_user_conf]# cat zhangsan 
local_root=/home/vsftpd/xmcsxy		# 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。 
anon_upload_enable=YES		# 是否允许登陆用户有上传权限。
write_enable=YES 			# 是否允许登陆用户有写权限。

在vsftpd.conf文件中启用了“user_config_dir”配置项以后,应该为每一个虚拟用户都建立一个单独的配置文件(可以是空文件),否则该用户可能无法登录。在每个用户的独立配置文件中,可以添加新的配置项来限制访问权限、下载速率等。

重启服务并测试

重启服务生效配置文件,做FTP登录测试时关闭防火墙和selinux安全规则。

[root@server ~]# systemctl restart vsftpd
[root@server ~]# getenforce 
Disabled
[root@server ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

在家目录写入一个测试文件

[root@server ~]# cd /home/vsftpd/xmcsxy/
[root@server xmcsxy]# touch a.txt
[root@server xmcsxy]# ls
a.txt

在windows系统使用ftp://192.168.200.128访问ftp服务

zhangsan/1234登录(也可运用windows图形化FTP工具(Filezilla))

centos系统ftp服务端口号 centos ftp 客户端_网络_04


centos系统ftp服务端口号 centos ftp 客户端_网络_05

[root@server xmcsxy]# tail -f /var/log/secure
May 27 11:09:38 server vsftpd[10431]: pam_userdb(vsftpd:auth): user 'zhangsan' granted access
May 27 11:09:39 server vsftpd[10434]: pam_userdb(vsftpd:auth): user 'zhangsan' granted access
May 27 11:11:25 server vsftpd[10439]: pam_userdb(vsftpd:auth): user 'zhangsan' granted access
May 27 11:11:26 server vsftpd[10442]: pam_userdb(vsftpd:auth): user 'zhangsan' granted access

黑白名单说明

在/etc/vsftpd/目录下:

[root@server vsftpd]# ll
总用量 36
-rw------- 1 root root   125 6月  10 2021 ftpusers
-rw------- 1 root root   361 6月  10 2021 user_list
-rw------- 1 root root    27 5月  27 10:23 users.conf
-rw------- 1 root root 12288 5月  27 10:26 users.db
-rw------- 1 root root  5203 5月  27 13:27 vsftpd.conf
-rwxr--r-- 1 root root   338 6月  10 2021 vsftpd_conf_migrate.sh
drwxr-xr-x 2 root root    22 5月  27 13:32 vsftpd_user_conf

两个文件ftpusersuser_list
ftpusers 黑名单,ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!
该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。

user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!那么是什么的设置决定了它的作用呢?这就是问题二要解释的。

所以简单总结就是:ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于userlist_enable和userlist_deny两项配置。

结论:
当且仅当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

参考