FTP 协议以原理
ftp 文件传输协议
是C/S结构应用,FTP使用了两个并行的tcp来传输文件:一个是控制端口(port:21),一个是数据端口(port:20)
控制端口用于在两个主机之间传输控制信息,如口令,用户标识,存放、获取文件等命令。
数据端口用于实际发送一个文件,发送完文件之后数据连接后会关闭。
ftp 连接模式
主动模式
服务端21号端口主动发起数据连接,客户端使用大于1023号端口响应,建立连接后,使用20号端口传输数据,适用于客户端未开启防火墙的环境。
被动模式
服务端21号端口被动等待数据连接,客户端使用大于1023号端口进行请求,建立连接后,使用服务器提供被动模式的非20号端口大于1023号端口进行传输数据,适用于客户端开启防火墙的环境。比较常用的模式
ftp传输方式
ftp客户端自动选择,无需设置
- 文本模式:ASCII,没过信息交换标准码,用于纯文本传输
- 二进制模式:binary,传输效率搞,常用来传输非文本文件。
vsftpd 服务
vsftpd 登录方式
-
匿名开放模式
一种最不安全的认证模式,任何人都可以无需密码验证而直接登录FTP服务器器
-
本地用户模式
通过linux系统本地的账号密码信息进行认证的默认,相较于匿名开放模式更安全,而且配置起来也相对简单。
-
虚拟用户模式
这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独建立用户数据库文件,虚拟出来进行口令验证的账号信息,而这些用户信息在服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。
vsftpd 服务常用参数及作用

vsftpd 参数详细信息:https://www.jianshu.com/p/e30e5d822e06
vsftpd 文件说明
[root@haproxy ~]# rpm -qc vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers ##黑名单文件,此文件里的用户不允许访问 FTP 服务器。
/etc/vsftpd/user_list ##白名单文件,此文件里的用户允许访问 FTP 服务器。
/etc/vsftpd/vsftpd.conf ##vsftpd的核心配置文件
vsftpd 服务部署
全局配置
安装vsftpd 服务
[root@ftp~]# yum install -y vsftpd
备份文件,去掉文件中注释行
[root@ftp ~]# mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
[root@ftp ~]# grep -v "#" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
关闭防火墙与SElinux
为了实验方便这里关闭。
如selinux未关闭需要:setsebool -P ftpd_full_access=on
匿名开放模式
修改配置文件
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES ##是否允许匿名用户登录
local_enable=YES ##是否允许本地用户登录
write_enable=YES ##本地用户写权限
local_umask=022 ##本地用户的文件umask码
dirmessage_enable=YES
xferlog_enable=YES ##是否开启上传下载日志,默认放在/var/log/vsftpd.log
connect_from_port_20=YES ##主动模式数据传输的端口
xferlog_std_format=YES ##设置日志存放路径
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_root=/data/anon ##
pasv_min_port=45000 ##PASV模式下,最大传输数据端口号,0为任意无限制
pasv_max_port=49000 ###PASV模式下,最小传输数据端口号
创建并授权匿名用户FTP根目录
mkdir -p /data/anon/pub
chown -R ftp /data/anon/pub/
启动服务
systemctl start vsftpd
systemctl enable vsftpd
测试
# 客户端操作
[root@nginx01 ~]# yum install -y lftp
[root@nginx01 ~]# lftp 10.4.7.100
[root@nginx01 ~]# lftp 10.4.7.100
lftp 10.4.7.100:/> cd pub/
lftp 10.4.7.100:/pub> ls
drwxr-xr-x 2 14 50 6 Feb 22 10:09 ceshi
lftp 10.4.7.100:/pub> mkdir ceshi
mkdir ok, `ceshi' created
#ftp服务端检查
[root@ftp ~]# ls /data/anon/pub/
ceshi
本地用户模式
修改配置文件
[root@ftp ~]# vim /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
tcp_wrappers=YES
local_root=/var/ftp/ftptest
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=45000
pasv_max_port=49000
创建一个测试账号ftptest
useradd ftptest
echo "123456" | passwd --stdin ftptest
创建一个FTP服务使用的文件目录
mkdir -p /data/ftp/ftptest
修改目录所有者为ftptest
chown ftptest:ftptest /var/ftp/ftptest
重启vsftpd 服务
systemctl restart vsftpd
测试

虚拟用户模式
创建FTP认证的用户数据库文件
[root@ftp vsftpd]# cat /etc/vsftpd/vuser.txt
onelpc
123456
xiaoming
123456
#第一行用户名,第二行密码,以此类推
将明文信息转换成数据文件
[root@ftp vsftpd]# db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
[root@ftp vsftpd]# chmod 600 /etc/vsftpd/vuser.db
[root@ftp vsftpd]# rm -f /etc/vsftpd/vuser.txt
创建虚拟用户映射的系统本地用户和FTP根目录
[root@ftp vsftpd]# useradd -d /data/ftproot -s /sbin/nologin virtual
[root@ftp vsftpd]# chmod -Rf 755 /data/ftproot/
生成PAM认证文件
[root@ftp vsftpd]# cat /etc/pam.d/vsftpd.vu
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
为两个虚拟用户设置权限,
onelpc拥有所有权限,而xiaoming只有读取权限。
[root@ftp vsftpd]# mkdir vusers_dir
##配置文件中user_config_dir配置项指定了此目录下的用户权限,若开启了此配置项,但是在这个目录下没有相应的用户文件,那么不能登陆ftp,创建以用户名为文件名的空文件,则此用户可以访问下载,不能上传;
[root@ftp vsftpd]# touch /etc/vsftpd/vusers_dir/xiaoming
[root@ftp vsftpd]# vim /etc/vsftpd/vusers_dir/onelpc
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
修改vsftpd配置文件
[root@ftp vsftpd]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
anon_umask=022
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
local_root=/data/ftproot
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir
pasv_min_port=45000
pasv_max_port=49000
重启服务
[root@ftp vsftpd]# systemctl restart vsftpd
访问测试
onelpc用户

xiaoming用户

虚拟用户验证成功之后,发现本地用户认证无法实现
配置虚拟用户及本地用户认证的方式
第一二行指定虚拟用户的认证,指定/etc/vsftpd/vusers.db虚拟用户的db数据文件,下边几行指定本地用户认证;
[root@ftp pam.d]# vi /etc/pam.d/vsftpd
#%PAM-1.0
auth sufficient pam_userdb.so db=/etc/vsftpd/vuser
account sufficient pam_userdb.so db=/etc/vsftpd/vuser
session optional pam_keyinit.so force revoke
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth required pam_shells.so
auth include password-auth
account include password-auth
session required pam_loginuid.so
session include password-auth
编辑vsftpd 主配置文件
[root@ftp vsftpd]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
anon_umask=022
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
local_root=/data/ftproot
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
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir
pasv_min_port=45000
pasv_max_port=49000
重启服务
[root@ftp vsftpd]# systemctl restart vsftpd
创建本地测试用户
[root@ftp vsftpd]# useradd u01
[root@ftp vsftpd]# echo "123" |passwd --stdin u01
本地用测试

虚拟用户测试

lftp 命令
登录ftp
#方法一,明文登录
[root@nginx01 ~]# lftp onelpc:123456@10.4.7.100
lftp onelpc@10.4.7.100:~>
#方法二
[root@nginx01 ~]# lftp 10.4.7.100 -u onelpc
Password: ==>输入密码
#方法三
[root@nginx01 ~]# lftp 10.4.7.100
lftp 10.4.7.100:~> login #后面跟用户名密码
Usage: login <user|URL> [<pass>]
#方法四
[root@nginx01 ~]# lftp
lftp :~> open 10.4.7.100
lftp 10.4.7.100:~> login onelpc 123456
基础命令
ls ##显示远端文件列表(!ls 显示本地文件列表)。
cd ##切换远端目录(lcd 切换本地目录)。
get ##下载远端文件。
mget ##下载远端文件(可以用通配符也就是 *)。
pget ##使用多个线程来下载远端文件, 预设为五个。
mirror ##下载/上传(mirror -R)/同步 整个目录。
mirror -R ##上传
put ##上传文件。
mput ##上传多个文件(支持通配符)。
mv ##移动远端文件(远端文件改名)。
rm ##删除远端文件。
mrm ##删除多个远端文件(支持通配符)。
mkdir ##建立远端目录。
rmdir ##删除远端目录。
pwd ##显示目前远端所在目录(lpwd 显示本地目录)。
du ##计算远端目录的大小
!ls ##现在本地文件列表 (由于lftp 没有 lls, 故可用 !ls 来替代)
lcd ##切换本地目录
lpwd ##显示本地目录
alias ##定义别名
bookmark ##设定书签。
lftp配置
临时生效
#设置远程端的编码格式
set ftp:charset gbk
#设置本地编码格式
set file:charset utf8
#######永久生效,写入配置文件
[root@ftp ~]# vim /etc/lftp.conf
##添加以下内容
set ftp:charset gbk
set file:charset utf8
set pget:default-n 5