FTP

ftp简介

网络文件共享服务主流的主要有三种,分别是ftp、nfs、samba。

FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输。

FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。

在FTP的使用当中,用户经常遇到两种概念:下载和上传

下载(Download)上传(Upload)
从远程主机拷贝文件至自己的计算机上 将文件从自己的计算机上拷贝至远程主机上

ftp架构

FTP工作于应用层,监听于tcp的21号端口,是一种C/S架构的应用程序。其有多种客户端和服务端的应用程序,下面来简单介绍一下

客户端工具服务端软件
ftp
lftp,lftpget
wget,curl
filezilla
gftp(Linux GUI)
商业软件(flashfxp,cuteftp)
wu-ftpd
proftpd(提供web接口的一种ftp服务端程序)
pureftp
vsftpd(Very Secure)
ServU(windows平台的一种强大ftp服务端程序)

ftp数据连接模式

ftp有2种数据连接模式:命令连接和数据连接

  • 命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
  • 数据连接:是指数据传输,按需创建及关闭的连接

其中数据连接需要关注的有2点,一是数据传输格式,二是数据传输模式

数据传输格式有以下两种:

  • 文件传输
  • 二进制传输

数据传输模式也有2种:

  • 主动模式:由服务器端创建数据连接
  • 被动模式:由客户端创建数据连接

两种数据传输模式的建立过程:

传输模式建立过程
主动模式 命令连接:
Client(1025)--> Server(21)
客户端以一个随机端口(大于1023)来连服务器端的21号端口
数据连接:
Server(20/tcp) --> Client(1025+1)
服务器端以自己的20号端口去连客户端创建命令连接时使用的随机端口+1的端口号
被动模式 命令连接:
Client(1110) --> Server(21)
客户端以一个随机端口来连成服务器端的21号端口
数据连接:
Client(1110+1) --> Server(随机端口)
客户端以创建命令连接的端口+1的端口号去连服务器端通过命令连接告知自己的一个随机端口号来创建数据连接

主动模式有个弊端,因为客户端的端口是随机的,客户端如果开了防火墙,
则服务器端去连客户端创建数据连接时可能会被拒绝

用户认证

ftp的用户主要有三种:

  • 虚拟用户:仅用于访问某特定服务中的资源
  • 系统用户:可以登录系统的真实用户
  • 匿名用户

vsftpd

此处我们要说的ftp应用程序是vsftpd,这也是在公司中用得最多的一款ftp软件。

vsftpd安装

[root@cb ~]# yum -y install vsftpd
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Repository base is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
上次元数据过期检查:14:30:12 前,执行于 2021年04月08日 星期四 00时50分09秒。
软件包 vsftpd-3.0.3-28.el8.x86_64 已安装。
依赖关系解决。
=============================================================================================
 软件包             架构               版本                      仓库                   大小
=============================================================================================
升级:
 vsftpd             x86_64             3.0.3-32.el8              AppStream             180 k

事务概要
=============================================================================================
升级  1 软件包

总下载:180 k
下载软件包:
vsftpd-3.0.3-32.el8.x86_64.rpm                               439 kB/s | 180 kB     00:00    
---------------------------------------------------------------------------------------------
总计                                                         437 kB/s | 180 kB     00:00     
运行事务检查
事务检查成功。
运行事务测试
事务测试成功。
运行事务
  准备中  :                                                                              1/1 
  运行脚本: vsftpd-3.0.3-32.el8.x86_64                                                   1/1 
  升级    : vsftpd-3.0.3-32.el8.x86_64                                                   1/2 
  运行脚本: vsftpd-3.0.3-32.el8.x86_64                                                   1/2 
  运行脚本: vsftpd-3.0.3-28.el8.x86_64                                                   2/2 
  清理    : vsftpd-3.0.3-28.el8.x86_64                                                   2/2 
  运行脚本: vsftpd-3.0.3-28.el8.x86_64                                                   2/2 
  验证    : vsftpd-3.0.3-32.el8.x86_64                                                   1/2 
  验证    : vsftpd-3.0.3-28.el8.x86_64                                                   2/2 
Installed products updated.

已升级:
  vsftpd-3.0.3-32.el8.x86_64                                                                 

完毕!

vsftpd配置

/etc/pam.d/vsftpd       //vsftpd用户认证配置文件
/etc/vsftpd/            //配置文件目录
/etc/vsftpd/vsftpd.conf     //主配置文件

//匿名用户(映射为ftp用户)的共享资源位置是/var/ftp
//系统用户通过ftp访问的资源位置为用户的家目录
//虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录

vsftpd常见的配置参数:

 

参数作用
anonymous_enable=YES 启用匿名用户登录
anon_upload_enable=YES 允许匿名用户上传
anon_mkdir_write_enable=YES 允许匿名用户创建目录,但是不能删除
anon_other_write_enable=YES 允许匿名用户创建和删除目录
local_enable=YES 启用本地用户登录
write_enable=YES 允许本地用户有写权限
local_umask=022 通过ftp上传文件的默认遮罩码
chroot_local_user=YES 禁锢所有的ftp本地用户于其家目录中
chroot_list_enable=YES 开启禁锢文件列表
需要与chroot_list_file参数一起使用
chroot_list_file=/etc/vsftpd/chroot_list 指定禁锢列表文件路径
在此文件里面的用户将被禁锢在其家目录中
allow_writeable_chroot=YES 允许被禁锢的用户家目录有写权限
xferlog_enable=YES 是否启用传输日志,记录ftp传输过程
xferlog_std_format=YES 传输日志是否使用标准格式
xferlog_file=/var/log/xferlog 指定传输日志存储的位置
chown_uploads=YES 是否启用改变上传文件属主的功能
chown_username=whoever 指定要将上传的文件的属主改为哪个用户
此用户必须在系统中存在
pam_service_name=vsftpd 指定vsftpd使用/etc/pam.d下的
哪个pam配置文件进行用户认证
userlist_enable=YES 是否启用控制用户登录的列表文件:
默认为/etc/vsftpd/user_list文件
userlist_deny=YES 是否拒绝userlist指定的列表文件中存在的用户登录ftp
max_clients=# 最大并发连接数
max_per_ip=# 每个IP可同时发起的并发请求数
anon_max_rate 匿名用户的最大传输速率,单位是“字节/秒”
local_max_rate 本地用户的最大传输速率,单位是“字节/秒”
dirmessage_enable=YES 启用某目录下的.message描述信息
假定有一个目录为/upload,在其下创建一个文件名为.message,
在文件内写入一些描述信息,则当用户切换至/upload目录下时会自动显示.message文件中的内容
message_file 设置访问一个目录时获得的目录信息文件的文件名,默认是.message
idle_session_timeout=600 设置默认的断开不活跃session的时间
data_connection_timeout=120 设置数据传输超时时间
ftpd_banner="Welcome to chenlf FTP service." 定制欢迎信息,登录ftp时自动显示
//虚拟用户的配置:
    //所有的虚拟用户会被统一映射为一个指定的系统帐号,访问的共享位置即为此系统帐号的家目录
    //各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

    //虚拟用户帐号的存储方式:
    1.文件:编辑文件,此文件需要被编码为hash格式。
        奇数行为用户名
        偶数行为密码
    2.关系型数据库的表中:
        通过即时查询数据库完成用户认证
        mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装

vsftpd虚拟用户配置

vsftpd虚拟用户的配置步骤如下:

服务端 cb 192.168.122.143
客服端 cxx 192.168.122.148

 

匿名用户访问模式

[root@cb ~]# cat > /etc/vsftpd/vsftpd.conf <<EOF
> anonymous_enable=yes
> local_enable=YES
> write_enable=YES
> local_umask=022
> anon_upload_enable=YES
> anon_mkdir_write_enable=YES
> anon_other_write_enable=YES
> EOF

[root@cxx ~]# ftp 192.168.122.143
Connected to 192.168.122.143 (192.168.122.143).
220 (vsFTPd 3.0.3)
Name (192.168.122.143:root): anonymous
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,122,143,47,149).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Apr 27  2020 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir cb
550 Create directory operation failed.
ftp> ls
227 Entering Passive Mode (192,168,122,143,21,150).
150 Here comes the directory listing.
226 Directory send OK.
ftp> exit
221 Goodbye.


[root@cb ~]# ll /var/ftp/
总用量 0
drwxr-xr-x. 2 root root 6 8月  13 2018 pub
[root@cb ~]# chown ftp /var/ftp/pub/
[root@cb ~]# ll /var/ftp/
总用量 0
drwxr-xr-x. 2 ftp root 6 8月  13 2018 pub
//修改所有者后,在用客户端尝试

[root@cxx ~]# ftp 192.168.122.143
Connected to 192.168.122.143 (192.168.122.143).
220 (vsFTPd 3.0.3)
Name (192.168.122.143:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir cb
257 "/pub/cb" created
ftp> ls
227 Entering Passive Mode (192,168,122,143,140,217).
150 Here comes the directory listing.
drwx------    2 14       50              6 Apr 08 08:35 cb
226 Directory send OK.
ftp> exit
221 Goodbye.
//查看一下
[root@cb ~]# ll /var/ftp/pub/
总用量 0
drwx------. 2 ftp ftp 6 4月   8 16:35 cb

本地用户模式

//写配置文件
[root@cb ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=YES

//重启服务
[root@cb ~]# systemctl restart vsftpd

[root@cb ~]# cat /etc/vsftpd/user_list 
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

[root@cb ~]# useradd cb
[root@cb ~]# echo cb | passwd --stdin cb
更改用户 cb 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@cxx ~]# ftp 192.168.122.143
Connected to 192.168.122.143 (192.168.122.143).
220 (vsFTPd 3.0.3)
Name (192.168.122.143:root): cb
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -a
227 Entering Passive Mode (192,168,122,143,246,47).
150 Here comes the directory listing.
drwx------    2 1002     1002           62 Apr 08 08:42 .
drwxr-xr-x    5 0        0              40 Apr 08 08:42 ..
-rw-r--r--    1 1002     1002           18 Jan 14  2019 .bash_logout
-rw-r--r--    1 1002     1002          141 Jan 14  2019 .bash_profile
-rw-r--r--    1 1002     1002          312 Jan 14  2019 .bashrc
226 Directory send OK.
ftp> mkdir cb1
257 "/home/cb/cb1" created
ftp> ls
227 Entering Passive Mode (192,168,122,143,81,42).
150 Here comes the directory listing.
drwxr-xr-x    2 1002     1002            6 Apr 08 08:44 cb1
226 Directory send OK.
ftp> exit
221 Goodbye.

//在服务端查看
[root@cb ~]# ll /home/cb/
总用量 0
drwxr-xr-x. 2 cb cb 6 4月   8 16:44 cb1

虚拟用户模式

虚拟用户的配置:
    所有的虚拟用户会被统一映射为一个指定的系统帐号,访问的共享位置即为此系统帐号的家目录
    各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

    虚拟用户帐号的存储方式:
    1.文件:编辑文件,此文件需要被编码为hash格式。
        奇数行为用户名
        偶数行为密码
    2.关系型数据库的表中:
        通过即时查询数据库完成用户认证
        mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装

虚拟用户模式配置流程大致如下:

  1.建立虚拟FTP用户数据库文件

  2.创建FTP根目录及虚拟用户映射的系统用户

  3.建立虚拟用户的PAM认证文件

  4.在vsftpd.conf文件中添加支持配置

  5.为虚拟用户设置不同权限

  6.重启服务

//建立虚拟FTP用户数据库文件
[root@cb ~]# cat > /etc/vsftpd/vuser.txt <<EOF
> cb
> a
> cb1
> b
> EOF
//使用db_load命令用HASH算法生成FTP用户数据库文件vuser.db
[root@cb ~]# db_load -T  -t hash -f /etc/vsftpd/vuser.txt  /etc/vsftpd/vuser.db
//提高虚拟用户帐号文件的安全性,应将文件权限设置为600,以避免数据外泄
[root@cb ~]# chmod  600 /etc/vsftpd/vuser*
//创建FTP根目录及虚拟用户映射为系统用户
[root@cb ~]# useradd -d /var/ftproot -s /sbin/nologin vuser
//修改其家目录权限保证其他用户可以访问
[root@cb ~]# chmod 755 /var/ftproot/
//建立虚拟用户的PAM认证文件
[root@cb ~]# vim /etc/pam.d/vsftpd.vu
[root@cb ~]# cat /etc/pam.d/vsftpd.vu 
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
//在vsftpd.conf文件中添加支持配置
[root@cb ~]# cat > /etc/vsftpd/vsftpd.conf <<EOF
> anonymous_enable=NO
> local_enable=YES
> write_enable=YES
> pam_service_name=vsftpd.vu
> guest_enable=YES
> guest_username=vuser
> allow_writeable_chroot=YES
> EOF
//为虚拟用户设置不同权限
[root@cb ~]# mkdir /etc/vsftpd/vuser_dir
[root@cb ~]#  echo 'user_config_dir=/etc/vsftpd/vuser_dir' >> /etc/vsftpd/vsftpd.conf
//为不同的虚拟用户配置权限,yuqinghao用户可以上传和创建目录,以及写入权限
[root@cb ~]# vim /etc/vsftpd/vuser_dir/cb
[root@cb ~]# cat /etc/vsftpd/vuser_dir/cb
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
[root@cb ~]# touch /etc/vsftpd/vuser_dir/cb1
[root@cb ~]# systemctl restart vsftpd

//在客户端测试
[root@cxx ~]# ftp 192.168.122.143
Connected to 192.168.122.143 (192.168.122.143).
220 (vsFTPd 3.0.3)
Name (192.168.122.143:root): cb
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 1
257 "/1" created
ftp> exit
221 Goodbye.
[root@cxx ~]# ftp 192.168.122.143
Connected to 192.168.122.143 (192.168.122.143).
220 (vsFTPd 3.0.3)
Name (192.168.122.143:root): cb1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 2
550 Permission denied.
ftp> exit
221 Goodbye.

 

posted @ 2021-04-08 15:24  cbcbage  阅读(264)  评论(0)    收藏  举报