FTP 服务
Linux FTP服务是基于FTP协议(File Transfer Protocol)的文件传输服务,支持客户端与服务器之间的文件上传、下载和管理。
FTP基础概念
协议特性
基于TCP/IP,采用C/S架构,默认使用21端口(控制连接)和20端口(主动模式数据连接)。
传输模式
主动模式(PORT)
- 客户端连接服务器的 21端口(控制连接)。
- 客户端发送
PORT命令,告知服务器自己的IP。 - 服务器从 20端口 主动连接到客户端建立数据连接。
被动模式(PASV)
- 客户端连接服务器的 21端口(控制连接)。
- 客户端发送
PASV命令,服务器回复一个端口(如50001)。 - 客户端主动连接到服务器的
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站点(如视频流媒体服务器)。
- 缺点:成本高,需专业运维。
- 典型场景:数据库备份、云计算平台的后端存储。
对比总结
| 特性 | DAS | NAS | SAN |
|---|---|---|---|
| 连接方式 | 直连服务器 | 以太网(TCP/IP) | 光纤通道/iSCSI |
| 协议支持 | 依赖服务器OS | FTP/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主配置文件的修改将此名单改为白名单,且仅此 名单中的用户可以访问。iniuserlist_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=YESFTP 数据目录
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/configFTP操作
客户端安装
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=022FTP客户端验证
bash
ftp ftp-server
虚拟用户
passwd:虚拟用户密码分用户管理模式
注册虚拟用户到ftp数据库
bash
gdbmtool /etc/vsftpd/vusers.pag store ftpuser 123456gdbmtool选项
| 命令 | 作用 | 示例 |
|---|---|---|
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 Forbidden | SELinux限制 | setsebool -P ftpd_full_access on |
| 超时无响应 | 客户端NAT问题 | 改用被动模式 |
