FTP 服务

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

测试

image.png

虚拟用户模式

创建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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容