Skip to content

FTP 服务

Linux FTP服务是基于FTP协议(File Transfer Protocol)的文件传输服务,支持客户端与服务器之间的文件上传、下载和管理。

FTP基础概念

协议特性

基于TCP/IP,采用C/S架构,默认使用21端口(控制连接)和20端口(主动模式数据连接)。

传输模式

主动模式(PORT)

  1. 客户端连接服务器的 21端口(控制连接)。
  2. 客户端发送 PORT 命令,告知服务器自己的IP。
  3. 服务器从 20端口 主动连接到客户端建立数据连接。

被动模式(PASV)

  1. 客户端连接服务器的 21端口(控制连接)。
  2. 客户端发送 PASV 命令,服务器回复一个端口(如 50001)。
  3. 客户端主动连接到服务器的 50001 端口建立数据连接。

核心功能

  • 文件传输(上传/下载)、目录管理、权限控制

FTP用户类型

  • 匿名模式 :所有人登录用的都是ftp或者anonymous,密码是空
  • 本地用户模式: 本地是指服务端的,用户使用的是服务端的系统用户,风险比较高,一旦信息泄露,泄露的是系统用户
  • 虚拟用户模式:借助于本地数据库技术,和acl 访问技术,创建虚拟用户,登录ftp

三种存储架构

DAS(直连附属存储)

  • 工作原理:存储设备通过SCSI或光纤通道直接连接到服务器,由服务器操作系统管理存储资源。
  • FTP应用:
    • FTP服务运行在直连存储的服务器上,文件访问受限于单台服务器性能。
    • 优点:传输速度快(低延迟),适合小型FTP站点或单一服务器环境。
    • 缺点:无法共享存储,扩展性差,故障风险高。
  • 典型场景:本地FTP服务器、小型企业单机文件共享

NAS(网络附属存储)

  • 工作原理:专用存储设备通过以太网(TCP/IP)提供文件级共享,支持NFS、CIFS、FTP等协议。
  • FTP应用:
    • 内置FTP服务:如群晖NAS可直接启用FTP功能,通过局域网或公网访问文件。
    • 优点:跨平台共享、易于管理,适合多用户FTP访问(如企业文件服务器)。
    • 缺点:性能受网络带宽限制,不适合高并发或低延迟需求。
  • 典型场景:家庭影音库、企业文档共享FTP站点。

SAN(存储区域网络)

  • 工作原理:通过高速专用网络(如光纤通道或iSCSI)连接存储阵列与服务器,提供块级存储。
  • FTP应用:
    • 间接支持FTP:SAN本身不直接提供FTP服务,但可为运行FTP服务的服务器提供高性能后端存储。
    • 优点:高吞吐量、低延迟,适合大型FTP站点(如视频流媒体服务器)。
    • 缺点:成本高,需专业运维。
  • 典型场景:数据库备份、云计算平台的后端存储。

对比总结

特性DASNASSAN
连接方式直连服务器以太网(TCP/IP)光纤通道/iSCSI
协议支持依赖服务器OSFTP/NFS/CIFS等块级(SCSI/FC)
FTP适用性单机简单FTP多用户共享文件高性能FTP后端存储
扩展性中等
成本中等

FTP 客户端工具种类

  • Windows:ftp 命令、CuteFTP、FlashFXP、LeapFTP、Filezilla 等。还有一些下载工具 软件,如 FlashGet、Wget 等,但不具备上传功能,通常不称为 FTP 客户端工具。

  • Linux/Unix:ftp 命令

ftp重点文件路径

  • 配置文件:/etc/vsftp
  • 数据存储:/var/ftp
  • 日志文件:/var/log/xferlog

ftpusers 与 user_list 解析

  • ftpusers:FTP 服务器中的黑名单,优先级高于 user_list 文件

  • user_list:此用户列表默认情况下也是黑名单,即在此用户列表中的用户不 可访问 FTP 服务器,但可以通过vsftpd.conf 主配置文件的修改将此名单改为白名单,且仅此 名单中的用户可以访问。

    ini
    userlist_deny=NO

vsftpd.conf配置详解

基础连接配置

ini
# 以独立模式运行
listen=YES/NO
# 修改控制端口
listen_port=21
# 允许匿名登录
anonymous_enable=YES/NO
# 允许本地用户登录
local_enable=YES/NO
# 允许文件修改
write_enable=YES/NO

安全增强参数

ini
# 用户限制
userlist_enable=YES          			# 启用用户名单
userlist_file=/etc/vsftpd.userlist  	# 白名单路径
userlist_deny=NO             			# YES=黑名单,NO=白名单

# 加密控制
ssl_enable=YES               			# 启用SSL(需证书)
rsa_cert_file=/etc/ssl/certs/vsftpd.pem

# 超时设置
idle_session_timeout=300     			# 会话超时(秒)
data_connection_timeout=60   			# 数据传输超时

认证权限控制

ini
# 虚拟用户使用本地用户权限
virtual_use_local_privs=YES/NO
# 允许删除/重命名文件
anon_other_write_enable=YES/NO
# 用户独立配置文件目录
user_config_dir=/etc/vsftpd/user_conf
# 指定低权限用户
nopriv_user=ftpsecure

目录与权限控制

ini
# 目录权限控制
chroot_local_user=YES           # 必须开启目录锁定
allow_writeable_chroot=YES      # 允许写入chroot环境
restrict_to_user_dir=YES        # 限制仅能访问自身目录

# 文件权限
local_umask=022              # 权限掩码(666-022=644)
file_open_mode=0666          # 文件最终权限=0666 & ~umask
anon_umask=022				 # 虚拟用户实际生效参数

# 特殊目录控制
hide_ids=YES                 # 隐藏文件属主信息
force_dot_files=YES          # 显示.开头文件

# 动态目录分配(每个用户独立目录)
local_root=/data/ftproot/$USER  # 变量需与user_sub_token配合
user_sub_token=$USER            # 启用用户名变量替换

网络与传输模式

ini
# 被动模式(PASV)
pasv_enable=YES              # 启用被动模式
pasv_min_port=50000          # 端口范围下限
pasv_max_port=51000          # 端口范围上限
pasv_address=192.168.1.100   # 服务器公网IP

# 主动模式(PORT)
port_enable=YES              # 启用主动模式
connect_from_port_20=YES     # 使用20端口传输

# 并发控制
max_clients=50                  # 最大连接数
max_per_ip=5                    # 单IP最大连接

# 带宽与文件限制
anon_max_rate=2097152            # 虚拟用户限速(2MB/s)
max_login_fails=3               # 最大登录失败次数
connect_timeout=60              # 连接超时(秒)

虚拟用户

ini
# 指定PAM认证配置文件名
pam_service_name=vsftpd.vu
# 启用虚拟用户映射
guest_enable=YES
# 指定虚拟用户映射的系统用户
guest_username=virtual

日志与监控

ini
# 详细日志记录
xferlog_enable=YES              	# 启用传输日志
xferlog_file=/var/log/vsftpd.log 	# 自定义日志路径
log_ftp_protocol=YES            	# 记录FTP协议细节
xferlog_std_format=NO     			# 使用详细日志格式

# 实时监控
dual_log_enable=YES             	# 同时生成wu-ftp格式日志
syslog_enable=YES               	# 输出到系统日志

SSL加密传输

ini
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
force_local_logins_ssl=YES

高危参数警示

ini
anon_upload_enable=YES    		# ❗允许匿名上传
anon_mkdir_write_enable=YES 	# ❗允许匿名创建目录
chmod_enable=YES          		# ❗允许客户端修改权限

搭建 FTP 服务

安装 FTP 服务

bash
dnf -y install vsftpd

修改配置文件

ini
# 允许匿名用户登录
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
# 允许匿名用户上传文件
anon_upload_enable=YES
# 指定匿名用户的权限掩码
anon_umask=022
# 允许匿名用户创建目录
anon_mkdir_write_enable=YES
# 允许匿名用户的其他写操作
anon_other_write_enable=YES
# 开启本地用户家目录锁定功能
chroot_local_user=YES
# 允许本地用户家目录写权限
allow_writeable_chroot=YES

FTP 数据目录

bash
chown ftp /var/ftp/pub

启动服务

bash
systemctl start vsftpd

关闭防火墙

bash
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config

FTP操作

客户端安装

bash
dnf -y install ftp

连接服务端

bash
ftp [服务器IP]  # 交互式连接
# 示例:连接192.168.1.100
ftp 192.168.1.100
# 输入用户名密码后进入ftp>提示符

常用命令

bash
ftp> ?				# 查看ftp命令			
ftp> !命令			# 命令前加!是执行当前主机的命令
ftp> ls               # 查看服务器文件列表
ftp> get filename     # 下载单个文件
ftp> put filename     # 上传单个文件
ftp> mget *.txt       # 批量下载txt文件
ftp> mput *.log       # 批量上传log文件
ftp> cd /remote_dir   # 切换服务器目录
ftp> lcd /local_dir   # 切换本地目录
ftp> binary           # 切换二进制传输模式(适合非文本文件)
ftp> ascii            # 切换ASCII模式(纯文本文件)
ftp> quit             # 退出

匿名用户模式

bash
ftp FTP服务IP
Name (192.168.148.151:root): ftp
331 Please specify the password.
Password:	# 空密码

本地用户模式

bash
useradd tom
echo "123456" | passwd tom --stdin &>/dev/null
ftp FTP服务IP
Name (192.168.148.151:root): tom
331 Please specify the password.
Password:

FTP虚拟用户模式

创建虚拟用户数据库

bash
gdbmtool -n /etc/vsftpd/vusers.pag open

数据库降权

bash
chmod 600 /etc/vsftpd/vusers.pag

创建虚拟用户

bash
gdbmtool /etc/vsftpd/vusers.pag store vuser1 123456

创建虚拟用户映射的系统用户

bash
useradd -d /var/ftproot -s /sbin/nologin virtual
chmod 755 /var/ftproot/

增加pam认证

默认的pam认证文件/etc/pam.d/vsftpd

新创建一个/etc/pam.d/vsftpd.vu,内容如下:

ini
auth 	required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

修改配置文件

ini
# 允许本地用户登录
local_enable=YES
# 允许文件修改
write_enable=YES
# 指定PAM认证配置文件名
pam_service_name=vsftpd.vu
# 启用虚拟用户映射
guest_enable=YES
# 指定虚拟用户映射的系统用户
guest_username=virtual
# 允许chroot目录可写
allow_writeable_chroot=YES
# 文件最终权限=0666 & ~umask
file_open_mode=0666
# 虚拟用户实际生效参数
anon_umask=022

FTP客户端验证

bash
ftp ftp-server
虚拟用户
passwd:虚拟用户密码

分用户管理模式

注册虚拟用户到ftp数据库

bash
gdbmtool /etc/vsftpd/vusers.pag store ftpuser 123456

gdbmtool选项

命令作用示例
store插入/更新数据store username "john_doe"
fetch查询数据fetch username → 返回 john_doe
delete删除键delete username
list列出所有键list
reorganize优化数据库reorganize
dump导出数据到文件dump > backup.txt

创建分用户配置文件存放路径

bash
mkdir -p /etc/vsftpd/auth

创建分用户配置文件

ini
# 创建 ftpuser 的配置文件,使其可以上传、建立目录、删除文件、重命名文件、最大 传输速率 1 字节/秒、根目录为/var/ftpuser
# /etc/vsftpd/auth/ftpuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_max_rate=1
local_root=/var/ftpuser

修改vsfptd.conf

ini
# 用户独立配置文件目录
user_config_dir=/etc/vsftpd/auth

创建虚拟用户工作目录

bash
# 创建
mkdir -p /var/ftpuser
# ftpuser目录归属修改为FTP映射用户
chown virtual:virtual /var/ftpuser

重启服务

bash
systemctl restart vsftpd

常见问题原因

现象可能原因解决方案
550 Failed to open file文件不可读chmod 644 文件名
426 Connection closed防火墙拦截放行数据端口范围
553 ForbiddenSELinux限制setsebool -P ftpd_full_access on
超时无响应客户端NAT问题改用被动模式