浅谈网络共享之FTP服务

FTP协议简介

1️⃣特点

  • 基于C/S架构

  • 双通道协议:数据和命令连接

  • 数据传输格式:二进制(默认)和文本

    • 注意:传输非文本时使用文本格式可能因操作系统不同导致文件内容变化,故应慎用

2️⃣两种模式:从服务器角度

  • 从建立数据连接时服务器的角色,分为主动模式(PORT Style) 和被动模式(PASV Style)

  • 无论主动模式还是被动模式,命令连接都是相同的,服务器端口为21

  • 被动(PASV style):客户端主动连接

    • 命令(控制):客户端:随机port —> 服务器:21/tcp
    • 数据:客户端:随机port —> 服务器:随机port /tcp
      在这里插入图片描述
  • 主动(PORT style):服务器主动连接

    • 命令(控制):客户端:随机port —> 服务器:21/tcp
    • 数据:客户端:随机port <—服务器:20/tcp
      在这里插入图片描述

FTP软件介绍

1️⃣FTP服务器端软件

  • Wu-ftpd,Proftpd,Pureftpd,Filezilla Server,Serv-U,Wing FTP Server,IIS
  • vsftpd:Very Secure FTP Daemon,CentOS 默认FTP服务器
    • 高速,稳定,下载速度是WU-FTP的两倍
    • ftp.redhat.com数据:单机最多可支持15000个并发

2️⃣客户端软件

  • 命令行工具
    ftp, lftp, lftpget, wget, curl
    ftp -A ftpserver port -A主动模式 -p 被动模式
    lftp -u username ftpserver
    lftp username@ftpserver
    lftpget ftp://ftpserver/pub/file

  • 图形界面工具
    filezilla, CuteFtp, FlashFXP, LeapFtp
    浏览器 ftp://username:password@ftpserver

3️⃣FTP服务状态码:

1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录

4️⃣用户认证:三种方式

  • 匿名用户:ftp, anonymous, 对应Linux用户ftp

  • 系统用户:Linux用户, 用户/etc/passwd, 密码/etc/shadow

  • 虚拟用户:特定服务的专用用户,独立的用户/密码文件,需要配合的组件

    • nsswitch: network service switch名称解析框架
    • pam: pluggable authentication module 用户认证
      • /lib64/security
      • /etc/pam.d/
      • /etc/pam.conf

vsftpd服务简介

  • 用户认证配置文件:/etc/pam.d/vsftpd

  • 服务脚本:
    CentOS 7:/usr/lib/systemd/system/vsftpd.service
    CentOS 6:/etc/rc.d/init.d/vsftpd

  • 配置文件:/etc/vsftpd/vsftpd.conf

  • 查询帮助:man 5 vsftpd.conf

    • 格式:option=value
    • 注意:= 前后不要有空格
  • 共享文件位置:

    • 匿名用户(映射为系统用户ftp)共享文件位置:ftp用户家目录/var/ftp
    • 系统用户共享文件位置:用户家目录
    • 虚拟用户共享文件位置:为其映射的系统用户的家目录

vsftpd配置

端口设置

1️⃣命令端口
listen_port=21
2️⃣主动模式端口

  • 配置文件
connect_from_port_20=YES     // 主动模式端口为20
// 注意即使指定其他端口此时值仍是YES,不可修改为NO

ftp_data_port=20           // 指定主动模式的端口
  • 示例:将主动模式的端口修改为2020
// vsftp服务器配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
ftp_data_port=2020

systemctl restart vsftpd

// 制作共享内容大文件
cd /var/ftp/pub
[root@Centos7 pub]# dd if=/dev/zero of=file1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.20398 s, 335 MB/s

// 客户端匿名下载文件 用主动模式
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
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> ls
227 Entering Passive Mode (172,20,54,1,140,170).
150 Here comes the directory listing.
-rw-r--r--    1 0        0        1073741824 Dec 17 12:15 file1
-rw-r--r--    1 0        0               0 Dec 17 11:54 text1.txtr
226 Directory send OK.
ftp> passive             //关闭被动模式,开启主动模式
Passive mode off.
ftp> get file1
local: file1 remote: file1
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for file1 (1073741824 bytes).
226 Transfer complete.
1073741824 bytes received in 61 secs (17591.85 Kbytes/sec)

// 在服务端查看端口情况
[root@Centos7 pub]# ss -ntp
State      Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
ESTAB      0      36                         172.20.54.1:22                                     172.20.3.69:52665               users:(("sshd",pid=2095,fd=3))
ESTAB      0      6992              [::ffff:172.20.54.1]:2020                          [::ffff:172.20.54.2]:33552               users:(("vsftpd",pid=3294,fd=7))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.2]:60504               users:(("vsftpd",pid=3294,fd=2),("vsftpd",pid=3294,fd=1),("vsftpd",pid=3294,fd=0),("vsftpd",pid=3292,fd=2),("vsftpd",pid=3292,fd=1),("vsftpd",pid=3292,fd=0))

3️⃣被动模式端口范围

  • 配置文件
linux 客户端默认使用被动模式
windows 客户端默认使用主动模式
pasv_min_port=6000     // 端口起始范围,0为随机分配
pasv_max_port=6010     // 端口结束范围
  • 示例:设置被动模式的端口范围为6000-6010
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES
pasv_min_port=6000
pasv_max_port=6010

systemctl restart vsftpd

/ 制作共享文件
cd /var/ftp/pub
dd if=/dev/zero of=file1 bs=1M count=1024
dd if=/dev/zero of=file2 bs=1M count=1024
dd if=/dev/zero of=file3 bs=1M count=1024

/ 分别在三个服务端用匿名账户下载文件
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp       
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> get file1|file2|file3     


/ 在服务器端查看端口,数据传输时打开了3个端口
[root@Centos7 pub]# ss -ntp
State      Recv-Q Send-Q                   Local Address:Port                                  Peer Address:Port              
ESTAB      0      36                         172.20.54.1:22                                     172.20.3.69:52665               users:(("sshd",pid=2095,fd=3))
ESTAB      0      6992              [::ffff:172.20.54.1]:6006                          [::ffff:172.20.54.2]:53726               users:(("vsftpd",pid=3339,fd=7))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.3]:45388               users:(("vsftpd",pid=3342,fd=2),("vsftpd",pid=3342,fd=1),("vsftpd",pid=3342,fd=0),("vsftpd",pid=3340,fd=2),("vsftpd",pid=3340,fd=1),("vsftpd",pid=3340,fd=0))
ESTAB      0      2648              [::ffff:172.20.54.1]:6000                          [::ffff:172.20.54.4]:53298               users:(("vsftpd",pid=3345,fd=7))
ESTAB      0      7944              [::ffff:172.20.54.1]:6001                          [::ffff:172.20.54.3]:59713               users:(("vsftpd",pid=3342,fd=7))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.2]:60506               users:(("vsftpd",pid=3339,fd=2),("vsftpd",pid=3339,fd=1),("vsftpd",pid=3339,fd=0),("vsftpd",pid=3337,fd=2),("vsftpd",pid=3337,fd=1),("vsftpd",pid=3337,fd=0))
ESTAB      0      0                 [::ffff:172.20.54.1]:21                            [::ffff:172.20.54.4]:36286               users:(("vsftpd",pid=3345,fd=2),("vsftpd",pid=3345,fd=1),("vsftpd",pid=3345,fd=0),("vsftpd",pid=3343,fd=2),("vsftpd",pid=3343,fd=1),("vsftpd",pid=3343,fd=0))

时间设置

use_localtime=YES:使用当地时间(默认为NO,使用GMT,但当前设置值NO为正确时间)

匿名用户登录

1️⃣配置文件条目

anonymous_enable=YES            // 支持匿名用户
no_anon_password=YES            // 匿名用户略过口令检查,默认NO
anon_world_readable_only=NO     // 只能下载所有者、所属组、其他人都有读权限的文件,默认YES
anon_upload_enable=YES          // 匿名上传,注意文件系统权限
anon_mkdir_write_enable=YES     // 匿名创建目录
anon_other_write_enable=YES     // 可删除和修改上传的文件
anon_umask=077                  // 指定匿名上传umask
// 指定上传文件的默认所有者和权限
chown_uploads=YES               //默认NO
chown_username=wang
chown_upload_mode=0644

2️⃣实验:修改vsftpd服务匿名登录配置

  • 实验2-1,输入用户名ftp后,自动登陆成功
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
no_anon_password=YES

systemctl restart vsftpd

/ 客户端登录效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
  • 实验2-2,实现匿名上传文件
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES

/ 匿名登录的根目录不能上传文件,创建子目录并赋予相应权限,实现文件上传
/ 注意匿名登录时根目录不能拥有所属组和其他人的写权限,否则会报错
mkdir -p /var/ftp/upload
setfacl -m u:ftp:rwx /var/ftp/upload
systemctl restart vsftpd

/ 客户端测试效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"
ftp> !ls
anaconda-ks.cfg  file1	mysql-createDB.sql  poweradmin-2.1.7.tgz  text1.txtr
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,116).
553 Could not create file.     / 根目录是不能上传文件,不能有读写权限
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg      / put 上传本地文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,116).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.00112 secs (1439.39 Kbytes/sec)
ftp> ls                      / 上传文件成功
227 Entering Passive Mode (172,20,54,1,23,119).
150 Here comes the directory listing.
-rw-------    1 14       50           1615 Dec 17 12:48 anaconda-ks.cfg
226 Directory send OK.
  • 实验2-3,实现匿名环境下:上传、删除、下载文件,建立目录,上传文件权限为644
/ 修改配置文件,注意上面2-2实验已经启用upload权限,所以下面没写
vim /etc/vsftpd/vsftpd.conf
anon_world_readable_only=NO
anon_mkdir_write_enable=YES
anon_other_write_enbale=YES
anon_umask=022

/ 客户端实现上传文件权限为644
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,112).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.00035 secs (4614.29 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,118).
150 Here comes the directory listing.
-rw-r--r--    1 14       50           1615 Dec 17 12:57 anaconda-ks.cfg
226 Directory send OK.

/ 客户端实现匿名下载文件
ftp> get fstab
local: fstab remote: fstab
227 Entering Passive Mode (172,20,54,1,23,115).
150 Opening BINARY mode data connection for fstab (595 bytes).
226 Transfer complete.
595 bytes received in 5.4e-05 secs (11018.52 Kbytes/sec)
ftp> !ls
fstab 

/ 客户端实现匿名删除文件
ftp> delete anaconda-ks.cfg 
250 Delete operation successful.
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,120).
150 Here comes the directory listing.
-rw-r--r--    1 0        0             595 Dec 17 12:59 fstab
226 Directory send OK.

/ 客户端实现匿名创建目录
ftp> mkdir dir1
257 "/upload/dir1" created
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,122).
150 Here comes the directory listing.
drwxr-xr-x    2 14       50              6 Dec 17 13:01 dir1
-rw-r--r--    1 0        0             595 Dec 17 12:59 fstab
226 Directory send OK.
  • 实验2-4,实现确定匿名上传文件的所有者和权限
/ 修改配置文件,上传权限上面实验配置文件已经开启
vim /etc/vsftpd/vsftpd.conf
chown_uploads=YES
chown_username=yijie             / 用户必须是服务端有的账户
chown_upload_mode=0644

systemctl restart vsftpd

/ 客户端测试效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftp     
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd upload
250 Directory successfully changed.
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,120).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000242 secs (6673.55 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,121).
150 Here comes the directory listing.
/ 在客户端查看只显示ID
-rw-r--r--    1 1000     50           1615 Dec 17 13:08 anaconda-ks.cfg
drwxr-xr-x    2 14       50              6 Dec 17 13:01 dir1
-rw-r--r--    1 0        0             595 Dec 17 12:59 fstab
226 Directory send OK.

/ 服务器器端查看文件
[root@Centos7 upload]# ll
total 8
-rw-r--r-- 1 yijie ftp  1615 Dec 17 21:09 anaconda-ks.cfg
[root@Centos7 upload]# id yijie
uid=1000(yijie) gid=1000(yijie) groups=1000(yijie)

linux系统用户

  • 配置文件条目
guest_enable=YES          // 所有系统用户都映射成guest用户
guest_username=ftp        // 配合上面选项才生效,指定guest用户
local_enable=YES          // 是否允许linux用户登录
write_enable=YES          // 允许linux用户上传文件
local_umask=022           // 指定系统用户上传文件的默认权限
local_root=/ftproot       // 非匿名用户登录所在目录
// 禁锢所有系统用户在家目录中
chroot_local_user=YES     // 禁锢系统用户,默认NO,即不禁锢
// 禁锢或不禁锢特定的系统用户在家目录中,与上面设置功能相反
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
// 当chroot_local_user=YES时,则chroot_list中用户不禁锢,白名单
// 当chroot_local_user=NO时,则chroot_list中用户禁锢,黑名单
  • 实验1:将用户test禁锢在家目录
/ 修改配置文件
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list

echo "test" >> /etc/vsftpd/chroot_list
systemctl restart vsftpd

/ 客户端测试
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
331 Please specify the password.
Password:
/ 这里报错是因为根目录不能有写权限,所以报错
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection

/ 在客户端修改test家目录权限
[root@Centos7 ~]# chmod 544 /home/test
[root@Centos7 ~]# ll ~test -d
dr-xr--r-- 2 test test 62 Dec 17 21:15 /home/test

/ 继续客户端测试
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/"                        / 已经禁锢在test自己的家目录中
ftp> quit
221 Goodbye.

/ 用test2账户登录,没有禁锢这个用户,可以随意切换目录
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/home/test2"
ftp> cd /etc/
250 Directory successfully changed.

日志

  • wu-ftp日志:默认启用
xferlog_enable=YES 启用记录上传下载日志,此为默认值
xferlog_std_format=YES 使用wu-ftp日志格式,此为默认值
xferlog_file=/var/log/xferlog 可自动生成, 此为默认值
  • vsftpd日志:默认不启用
dual_log_enable=YES 使用vsftpd日志格式,默认不启用
vsftpd_log_file=/var/log/vsftpd.log 可自动生成, 此为默认值
  • 示例:开启vsftpd.log日志文件
vim /etc/vsftpd/vsftpd.conf

systemctl restart vsftpd
/ 开启日志文件追踪,记录登录信息
[root@Centos7 upload]# tail -F /var/log/vsftpd.log 
Tue Dec 17 21:46:43 2019 [pid 3844] CONNECT: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:06 2019 [pid 3843] [test2] FAIL LOGIN: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:12 2019 [pid 3850] CONNECT: Client "::ffff:172.20.54.2"
Tue Dec 17 21:47:15 2019 [pid 3849] [ftp] OK LOGIN: Client "::ffff:172.20.54.2", anon password "<no_password>"
Tue Dec 17 21:47:36 2019 [pid 3854] CONNECT: Client "::ffff:172.20.54.3"
Tue Dec 17 21:47:42 2019 [pid 3853] [test2] OK LOGIN: Client "::ffff:172.20.54.3"
/ 记录删除 上传 下载
Tue Dec 17 21:51:10 2019 [pid 3861] [ftp] OK DELETE: Client "::ffff:172.20.54.2", "/upload/anaconda-ks.cfg"
Tue Dec 17 21:51:16 2019 [pid 3861] [ftp] OK UPLOAD: Client "::ffff:172.20.54.2", "/upload/anaconda-ks.cfg", 1615 bytes, 772.73Kbyte/sec
Tue Dec 17 21:51:45 2019 [pid 3861] [ftp] OK DOWNLOAD: Client "::ffff:172.20.54.2", "/upload/fstab", 595 bytes, 318.04Kbyte/sec

提示信息

  • 登录提示信息
ftpd_banner=“welcometo test ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt     //本条记录优先生效
  • 目录访问提示信息
dirmessage_enable=YES     // (默认)
message_file=.message     // (默认)信息存放在指定目录下.message
  • 示例:设置欢迎信息,登录时显示:“this is test ftp service”, 进入pub子目录时显示"public directory",进入upload子目录时显示"upload directory"
vim /etc/vsftpd/vsftpd.conf
banner_file=/etc/vsftpd/ftpbanner.txt
/ 生成欢迎信息
[root@Centos7 upload]# echo "this is test ftp service" > /etc/vsftpd/ftpbanner.txt
[root@Centos7 upload]# echo "pubilc directory"> /var/ftp/pub/.message
[root@Centos7 upload]# echo "upload directory"> /var/ftp/upload/.message

systemctl restart vsftpd
/ 客户端测试
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220-this is test ftp service       / 欢迎信息
220 
Name (172.20.54.1:root): ftp
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250-pubilc directory             / 目录提示信息
250 Directory successfully changed.
ftp> cd ../upload
250-upload directory            / 目录说明信息
250 Directory successfully changed.

登录控制

  • 使用pam完成用户认证

    • 在/etc/vsfptd/vsftpd.conf配置文件中:
    • pam_service_name=vsftpd:指明引用的pam配置文件路径
    • pam配置文件路径:/etc/pam.d/vsftpd,格式如下
    auth    required    pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    / 当sense=deny时,拒绝/etc/vsftpd/ftpusers文件中用户登录
    / 当sense=allow时,允许/etc/vsftpd/ftpusers文件中用户登录
    
  • 启用控制用户登录的列表文件

userlist_enable=YES    / 默认有此设置
userlist_deny=YES      / 黑名单,默认值,不提供输入口令的机会,NO为白名单
userlist_file=/etc/vsftpd/users_list     / 用户列表文件,此为默认值
  • 连接限制
max_clients=0     / 最大并发连接数,0为无限制
max_per_ip=0      / 每个IP同时发起的最大连接数,0为无限制
  • vsftpd服务指定用户身份运行:nopriv_user=nobody 此为默认值
  • 实验:实现用户登录控制
  • 实验1-1:使用pam禁止用户test2登录ftp服务
vim /etc/pam.d/vsftpd    / 保证sense=deny
auth  required  pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers  onerr=succeed

echo "test2">> /etc/vsftpd/ftpusers

/ 客户端测试效果
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test2
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
ftp> 
  • 实验1-2:使用用户列表禁止用户test登录ftp服务
/ 因为userlist_deny=YES (default),所以userlist 是禁止登录用户列表
echo "test" >> /etc/vsftpd/user_list

/ 客户端测试
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): test
530 Permission denied.           / 直接拒绝 不会让你输入密码
Login failed.
  • 实验1-3:限制最大并发连接数为2,相同IP同时连接数为2
vim /etc/vsftpd/vsftpd.conf
max_clients=5
max_per_ip=2
systemctl restart vsftpd

/ 客户端测试效果,用同一个IP去连接ftp
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
421 There are too many connections from your internet address.
ftp> 

传输控制

  • 传输速率:字节/秒
anon_max_rate=0      / 匿名用户的最大传输速率
local_max_rate=0     / 本地用户的最大传输速率
  • 连接时间:秒为单位
connect_timeout=60              / 主动模式数据连接超时时长
accept_timeout=60               / 被动模式数据连接超时时长
data_connection_timeout=300     / 数据连接无数据传输超时时长
idle_session_timeout=60         / 无命令操作超时时长
  • 优先以文本方式传输
ascii_upload_enable=YES
ascii_download_enable=YES
  • 实验1-1:限制匿名登录用户传输速度为1M/s,限制系统登录用户传输速度为2M/s
vim /etc/vsftpd/vsftpd.conf
anno_max_rate=1024000
local_max_rate=2048000

systemctl restart vsftpd

/ 准备test家目录权限以及文件
mkdir /home/test/pub
setfacl -m u:test:rwx /home/test/pub
cp /var/ftp/file1 /home/test/pub/    / file1文件是前面实验留下的大文件
  • 客户端测试效果
    在这里插入图片描述
    在这里插入图片描述

实现基于SSL的ftps

  • 查看是否支持SSL,确实存在
ldd   `which vsftpd`

[root@Centos7 pub]# ldd `which vsftpd` |grep libssl
	libssl.so.10 => /lib64/libssl.so.10 (0x00007f2401ed8000)

  • 创建自签名证书
[root@Centos7 certs]# make vsftpd.pem     / 生成自签名证书
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2  ; \
cat $PEM1 >  vsftpd.pem ; \
echo ""    >> vsftpd.pem ; \
cat $PEM2 >> vsftpd.pem ; \
rm -f $PEM1 $PEM2
Generating a 2048 bit RSA private key
...........................+++
...........+++
writing new private key to '/tmp/openssl.igixLB'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:test.com
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ftp.test.com
Email Address []:
/ 查看证书内容
[root@Centos7 certs]# openssl x509 -in vsftpd.pem -noout -text 

[root@Centos7 certs]# cp vsftpd.pem /etc/vsftpd/

/ 配置vsftpd服务支持SSL:
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
ssl_enable=YES #启用SSL
allow_anon_ssl=NO #匿名不支持SSL
force_local_logins_ssl=YES #本地用户登录加密
force_local_data_ssl=YES #本地用户数据传输加密
rsa_cert_file=/etc/vsftpd/vsftpd.pem
#rsa_private_key_file /path/file #此项如果没有指定,私钥也在证书文件中

systemctl restart vsftpd
  • 使用FileZilla建立ftp连接
    在这里插入图片描述
  • 登录ftp,确认证书
    在这里插入图片描述
  • 连接成功
    在这里插入图片描述

vsftpd虚拟用户

vsftpd虚拟用户介绍

1️⃣定义

  • 所有虚拟用户会统一映射为一个指定的系统帐号

  • 访问共享位置:此系统帐号的家目录

  • 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定

2️⃣虚拟用户账号的存储方式

  • 文件:编辑文本文件,此文件需要被编码为hash格式

  • 奇数行:用户名,偶数行:密码

  • 将文本转换为berkerly db数据库格式:db_load -T -t hash -f vusers.txt vusers.db

  • 关系型数据库中的表中:
    实时查询数据库完成用户认证

vsftpd 支持mysql库:pam要依赖于pam-mysql
/lib64/security/pam_mysql.so
/usr/share/doc/pam_mysql-0.7/README

实现基于DB的FTP虚拟用户

  • 创建DB数据库文件,存放虚拟用户和密码
vim /etc/vsftpb/ftpvusers
ftpuser1
centos
ftpuser2
centos

/ 制作DB数据库文件
[root@Centos7 ~]# cd /etc/vsftpd/
[root@Centos7 vsftpd]# db_load -T -t hash -f ftpvusers ftpvusers.db
[root@Centos7 vsftpd]# file ftpvusers.db 
ftpvusers.db: Berkeley DB (Hash, version 9, native byte-order)
  • 创建系统用户和访问FTP目录
useradd -d /var/ftproot -s /sbin/nologin -r vuser
mddir -p /var/ftproot/upload
setfacl -m u:vuser:rwx /var/ftproot/uplpad/
#chmod a=rx /data/ftproot/ 如果自动创建家目录,需修改权限.跟目录不能有写权限
  • 创建pam配置文件
vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/ftpvusers
account required pam_userdb.so db=/etc/vsftpd/ftpvusers
  • 创建pam配置文件
vim /etc/vsftpd/vsftpd.conf 
pam_service_name=vsftpd.db            // 指定pam配置文件路径
guest_enable=YES
gurst_username=vuser                  // 将虚拟用户映射为系统用户vuser
user_config_dir=/etc/vsftpd/vusers.d/  //指定每个虚拟用户独立配置文件路径
  • 建立每个虚拟用户的独立配置文件
mkdir /etc/vsftpd/vusers.conf.d
cd /etc/vsftpd/vusers.conf.d/
vim ftpuser1     // 配置文件名称必须与虚拟账户名称完全相同
anon_upload_enable=YES
anon_mkdir_write_enable=YES

vim ftpuser2     // 配置文件名称必须与虚拟账户名称完全相同
local_root=/data/ftproot2    // 指定共享根目录为/data/ftproot2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
  • 配置共享根目录,重启vsftpd服务
touch /var/ftproot/ftp1file     / 用于测试登录验证时是否登入了相对应的目录
mkdir -p /data/ftproot2/upload
chmod 555 /data/ftproot2        / 根目录不能有写权限
setfacl -m u:vuser:rwx /data/ftproot2/upload/
touch /data/ftproot2/file2file  / 测试登录验证时是否登入了相对应的目录
systemctl restart vsftpd
  • 客户端测试
  • 从根目录下文件ftp1file证明ftpuser1登录到了相应的目录

[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftpuser1          / 用户ftpuser1
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 (172,20,54,1,23,113).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 03:18 ftp1file
drwxrwxr-x    2 0        0               6 Dec 18 02:58 upload
226 Directory send OK.
  • ftpuser1登录ftp服务可以在/upload子目录下建立目录,上传文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test1                     / 创建目录
257 "/upload/test1" created
ftp> pwd
257 "/upload"
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,120).
150 Here comes the directory listing.
drwxr-xr-x    2 998      996             6 Dec 18 03:31 test1
226 Directory send OK.
ftp> put anaconda-ks.cfg              / 上传文件
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,113).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000245 secs (6591.84 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,117).
150 Here comes the directory listing.
-rw-r--r--    1 1000     996          1615 Dec 18 03:31 anaconda-ks.cfg
drwxr-xr-x    2 998      996             6 Dec 18 03:31 test1
226 Directory send OK.
  • 从根目录下文件ftp2file证明ftpuser2登录到了相应的目录
[root@Centos7 ~]# ftp 172.20.54.1
Connected to 172.20.54.1 (172.20.54.1).
220 (vsFTPd 3.0.2)
Name (172.20.54.1:root): ftpuser2             / 用户ftpuser2
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 (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 03:20 ftp2file
drwxrwxr-x    2 0        0               6 Dec 18 03:19 upload
226 Directory send OK.
  • ftpuser2登录ftp服务可以在/upload子目录下建立目录,上传文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test2
257 "/upload/test2" created
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,118).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000272 secs (5937.50 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 998      996          1615 Dec 18 03:36 anaconda-ks.cfg
drwxr-xr-x    2 998      996             6 Dec 18 03:36 test2
226 Directory send OK.
,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 18 03:20 ftp2file
drwxrwxr-x    2 0        0               6 Dec 18 03:19 upload
226 Directory send OK.
  • ftpuser2登录ftp服务可以在/upload子目录下建立目录,上传文件
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir test2
257 "/upload/test2" created
ftp> put anaconda-ks.cfg 
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (172,20,54,1,23,118).
150 Ok to send data.
226 Transfer complete.
1615 bytes sent in 0.000272 secs (5937.50 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,20,54,1,23,114).
150 Here comes the directory listing.
-rw-r--r--    1 998      996          1615 Dec 18 03:36 anaconda-ks.cfg
drwxr-xr-x    2 998      996             6 Dec 18 03:36 test2
226 Directory send OK.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值