一世贪欢的私域

一世贪欢的私域

FTP-文件传输协议

2025-10-10
FTP-文件传输协议

title: "FTP-文件传输协议"
date: 2025-10-09 00:00:00
updated: 2025-09-28 00:00:00
tags: []
categories: []
draft: true


FTP-文件传输协议

一文彻底搞清楚FTP。

一、介绍

FTP(File Transfer Protocol),文件传输协议,诞生于1971年,用于在网络间交换文件。主要又两种工作模式。

1.1 主动模式

最开始只有主动模式,工作模式如下,

  • 客户端随机端口 --->>> 服务器 21 控制端口
  • 客户端开启高位随机端口,告诉服务器,并等待服务器连接
  • 服务器 20 数据端口 --->>> 客户端高位随机端口,使用此连接进行数据传输

主动模式的 主动 就是指 服务器主动去连接客户端,进行数据传输。

问题

刚开始计算机都有公网IP,这种模式运行良好;但是,随着时代的发展,公网IP越来越少,人们开始使用内网IP、NAT技术、防火墙等,导致服务器无法成功连接客户端,此时添加了一种模式,被动模式。

1.2 被动模式

被动模式的工作模式如下,

  • 客户端随机端口 --->>> 服务器 21 控制端口
  • 服务器开启高位随机端口,告诉客户端,并等待客户端连接
  • 客户端随机端口 --->>> 服务器的高位随机端口,使用此链接进行数据传输

被动模式的 被动 就是指 服务器 被动等待客户端来连接,进行数据传输。

二、服务器端

这里不想搞得太复杂,把SELinux关了,不然权限很繁琐。

setenforce 0
vim /etc/selinux/config
SELINUX=disabled

2.1 vsftpd

vsftpd (Very Secure),在Linux系统上,一款非常安全的 ftp 服务端软件,用于部署 FTP服务器

2.1.1 安装

  1. 安装
yum install -y vsftpd
  1. 启动
systemctl enable --now vsftpd
  1. 验证
ss -tnlp
[root@centos9 ~]# ss -tnlp
State	Recv-Q	Send-Q	Local Address:Port	Peer Address:Port	Process                                   
LISTEN	0		128		0.0.0.0:22			0.0.0.0:*			users:(("sshd",pid=819,fd=3))            
LISTEN	0		32		*:21				*:*					users:(("vsftpd",pid=11092,fd=3))        
LISTEN	0		128		[::]:22				[::]:*				users:(("sshd",pid=819,fd=4))            
[root@centos9 ~]# 
  1. 防火墙放行FTP
firewall-cmd --permanent --add-service=ftp
firewall-cmd --permanent --add-port=20/tcp
firewall-cmd --reload

2.1.2 配置

不同版本间默认配置不一样,需要自行查看修改。配置文件在 /etc/vsftpd/vsftpd.conf 中,修改配置后需要重载配置。

2.1.2.1 匿名用户配置

匿名用户 anonymous 会映射成 ftp。默认用户在

# 全局可写配置
write_enable=YES

# 是否启用匿名用户
anonymous_enable=YES

# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
# When SELinux is enforcing check for SE bool allow_ftpd_anon_write, allow_ftpd_full_access
# 需要全局可写激活,需要目录被ftp用户可写,需要selinux 权限通过
# 匿名用户是否可上传文件
anon_upload_enable=YES

# Uncomment this if you want the anonymous FTP user to be able to create new directories.
# 允许匿名用户创建文件夹
# 匿名用户是否可创建文件夹
anon_mkdir_write_enable=YES
[root@centos9 ~]# mkdir /var/ftp/upload
[root@centos9 ~]# chown ftp.ftp /var/ftp/upload/
[root@centos9 ~]# 

这样就可以匿名用户上传或者下载文件,在upload 目录下。

默认文件权限为600,默认文件夹权限为 700

2.1.2.2 本地用户配置
# Uncomment this to allow local users to log in.
# 是否启用本地用户
local_enable=YES
#

# 全局写权限
# Uncomment this to enable any form of FTP write command.
write_enable=YES
#

# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
# 默认去掉的权限
local_umask=022

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# (Warning! chroot'ing can be very dangerous. If using chroot, make sure that
# the user does not have write access to the top level directory within the
# chroot)
# 限制用户只能访问自己的家目录,从2.3.5版本开始,出于安全考虑,默认禁止用户在其 chroot 目录(即 FTP 根目录)拥有写权限。
chroot_local_user=YES

限制用户只能访问自己的家目录,从2.3.5版本开始,出于安全考虑,默认禁止用户在其 chroot 目录(即 FTP 根目录)拥有写权限。

lftp [email protected]:~> ls
ls: Login failed: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

两种解决方案

方案一,对限制的家目录,u-w,家目录下创建文件夹,作为ftp的上传目录。

注意ubuntu 新建用户需要 -m 参数才能创建用户家目录

useradd ftptest
mkdir /home/ftptest/dir1
passwd ftptest

chmod u-w /home/ftptest

mkdir /home/ftptest/dir1
chown ftptest.ftptest /home/ftptest/dir1

客户端就可以在 /home/ftptest/dir1 目录下上传文件。

上传的文件夹权限为755,文件权限为644

方案二,直接允许根目录可写,跳过检查,但是这种方式不安全。

allow_writeable_chroot=YES

:这两种解决方案感觉都不好,方案一、用户失去对家目录的写权限;方案二,不安全。

方案三

最佳实践

  1. 在用户目录下创建 ftp 目录作为ftp根目录
  2. ftp 目录所有者改为nobody:nogroup ,去掉 ftp 所有者的写权限。
  3. ftp 目录下创建files 目录作为登录ftp后,可写的目录
  4. 修改配置。
# 启用本地用户
local_enable=YES

# 启用写权限
write_enable=YES

# 限制根目录
chroot_local_user=YES

# 当某个用户登录时,把配置文件里所有出现 $USER 的地方自动替换成该登录用户名。
user_sub_token=$USER

# 设置根目录
local_root=/home/$USER/ftp
2.1.2.3 额外易混淆配置
# vsftpd 用户列表
# 如果 userlist_deny=NO,则仅允许此文件中的用户访问。
# 如果 userlist_deny=YES(默认),则绝不允许此文件中的用户访问,并且
# 甚至不提示输入密码。
# 请注意,默认的 vsftpd pam 配置还会检查 /etc/vsftpd/ftpusers
# 中被拒绝的用户。
/etc/vsftpd/user_list

# Users that are not allowed to login via ftp
# 不允许通过 ftp 登录的用户
/etc/vsftpd/ftpusers
# 启用用户列表
userlist_enable=YES

# 用户列表的位置,ubuntu、centos位置不一样。
userlist_file=/etc/vsftpd.userlist

# 逻辑标识,不拒绝,就是允许,在列表中允许的用户才能连接ftp。
userlist_deny=NO

2.1.3 被动模式

被动模式FTP的数据端口不是20,默认是随机。
为了配合防火墙开放相应的端口,建议限制数据端为一个范围。

pasv_enable=YES              # 启用被动模式
pasv_min_port=30000          # 被动模式最小端口
pasv_max_port=31000          # 被动模式最大端口
# 服务器防火墙配置(被动模式)
firewall-cmd --permanent --add-service=ftp						# 开放控制端口21
firewall-cmd --permanent --add-port=20/tcp						# 开放控制端口20
firewall-cmd --permanent --add-port=30000-31000/tcp				# 开放被动模式限定的端口
firewall-cmd --reload

2.1.4 禁用shell登录

这个好玩,简单几行。

vim /bin/ftponly
#!/bin/sh
echo "This account is limited to FTP access only."
chmod a+x /bin/ftponly
echo "/bin/ftponly" >> /etc/shells
usermod ftptest -s /bin/ftponly

2.2 File-Mozilla

这款软件用server版,也有客户端版。之后补充。

官网

三 、客户端

File-Mozilla,跨平台的连接工具,常用于Windows。

lftp,Linux连接工具,

# 连接
lftp 用户名:密码@主机

# 下载
get 文件

# 上传
put 文件 目标名称

# 切换
cd

# 创建文件夹
mkdir

# 列出文件
ls

四、封面图

封面图