FTP文件服务器
了解FTP服务
什么是FTP服务?
FTP的全名是,主要用于文件传输的经典TCP协议。
常用端口:
- 21端口:用于发送FTP命令信息
- 20端口:不一定使用,用于上传下载数据
FTPS和SFTP
FTPS = FTP over TLS/SSL(也叫 FTPES/implicit/explicit TLS),在 FTP 基础上加密控制/数据通道。
SFTP ≠ FTP:它是 SSH 的子系统(使用端口 22),安全、易管理,通常比 FTPS 更推荐用于需要加密的场景。
FTP的两种连接模式
Active(主动)模式:
- 客户端在高端口上监听,向服务器 21 发起控制连接;当需要传输数据时,服务器从其端口 20 连接回客户端指定端口。
- 客户端后面的防火墙/NAT 常常阻止服务器回连,导致问题。
Passive(被动)模式: - 客户端和服务器均由客户端发起连接:客户端向服务器 21 建立控制连接,服务器在一组被动端口(可配置)上监听数据连接,返回端口给客户端,客户端再连接该端口。
- 在 NAT/防火墙环境下需要在服务器放行这些被动端口并在 NAT 上做映射(pasv_address)。
现在基本都是使用被动模式。
常见FTP服务器软件对比
- vsftpd:轻量、安全,默认配置较严格(Debian/Ubuntu 常用)。
- proftpd:类似 Apache 配置风格,功能强大,适合复杂需求。
- pure-ftpd:易于使用,支持虚拟用户、TLS、限速等。
FTP服务搭建
软件安装
CentOS系统安装
yum -y install vsftpd
Ubuntu系统安装
apt -y install vsftpd
创建用户和工作目录
useradd -m ftpuser
passwd ftpuser
mkdir -p /home/ftpuser/files
chown root:root /home/ftpuser/files # chroot根目录必须属于root
chmod 755 /home/ftpuser/files
chown ftpuser:ftpuser /home/ftpuser/files
一个简单的配置示例
修改配置文件:/etc/vsftpd.conf
# 基础配置
listen=YES
listen_ipv6=NO
anonymous_enable=NO
local_enable=YES # 默认指定用户home目录 local_root=/data/ftp
write_enable=YES
local_umask=022
# chroot 安全
chroot_local_user=YES
# 日志
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
use_localtime=YES
# 文件上传下载
allow_writeable_chroot=YES # 允许在 chroot 可写目录上传(简单方案)
# 被动模式(方便客户端穿透 NAT)
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100
启动FTP服务
# 启动ftp服务
systemctl start vsftpd
# 设置自启动ftp服务
systemctl enable vsftpd
# 查看ftp服务状态
systemctl status vsftpd
配置文件详解
监听与模式
| 配置项 | 默认值 | 功能说明 | 建议设置 / 注意事项 |
|---|---|---|---|
| listen | NO | 是否启用独立 IPv4 监听(standalone 模式) | YES |
| listen_ipv6 | YES | 是否启用独立 IPv6 监听 | NO(如果只用 IPv4) |
| 用户认证 | |||
| anonymous_enable | YES | 是否允许匿名登录 | NO(生产环境禁用匿名) |
| local_enable | NO | 是否允许本地系统用户登录 | YES |
| userlist_enable | NO | 是否启用用户白/黑名单 | YES |
| userlist_file | /etc/vsftpd.userlist | 白/黑名单文件路径 | 配合 userlist_deny 使用 |
| userlist_deny | YES | YES=文件列出用户禁止登录,NO=文件列出用户允许登录 | NO 作为白名单,YES 作为黑名单 |
| pam_service_name | vsftpd | PAM 配置文件名 | 一般保持默认 |
权限与写操作
| 配置项 | 默认值 | 功能说明 | 建议设置 / 注意事项 |
|---|---|---|---|
| write_enable | NO | 是否允许写操作(上传/删除/改名) | YES |
| local_umask | 077 | 新建文件掩码 | 022 常用 |
| chroot_local_user | NO | 是否将本地用户限制到 home 目录 | YES(安全) |
| allow_writeable_chroot | NO | 允许用户写可写 chroot 目录(vsftpd 默认安全限制) | NO 推荐,必要时 YES |
| chroot_list_enable | NO | 是否启用 chroot 白名单 | YES/NO 根据需求 |
| chroot_list_file | /etc/vsftpd.chroot_list | 白名单路径 | 配合 chroot_list_enable 使用 |
传输模式与端口
| 配置项 | 默认值 | 功能说明 | 建议设置 / 注意事项 |
|---|---|---|---|
| connect_from_port_20 | NO | 主动模式使用端口 20 | YES(主动模式) |
| pasv_enable | NO | 是否启用被动模式 | YES(现代客户端通常用) |
| pasv_min_port | 0 | 被动模式端口段最小值 | 10000 |
| pasv_max_port | 0 | 被动模式端口段最大值 | 10100 |
| pasv_address | (空) | 公网 IP,用于 NAT 后被动模式 | 填公网 IP |
日志相关
| 配置项 | 默认值 | 功能说明 | 建议设置 / 注意事项 |
|---|---|---|---|
| xferlog_enable | YES | 是否启用传输日志 | YES |
| xferlog_file | /var/log/xferlog | 日志文件路径 | 默认即可 |
| log_ftp_protocol | NO | 是否记录详细 FTP 协议 | 调试可用 YES |
| dual_log_enable | NO | 是否同时记录 xferlog 和协议日志 | YES |
TLS / FTPS
| 配置项 | 默认值 | 功能说明 | 建议设置 / 注意事项 |
|---|---|---|---|
| ssl_enable | NO | 是否启用 TLS/FTPS | YES(生产环境推荐) |
| rsa_cert_file | 空 | TLS 证书文件路径 | 指向 .pem 文件 |
| rsa_private_key_file | 空 | TLS 私钥路径 | 指向 .pem 文件 |
| force_local_logins_ssl | NO | 是否强制本地用户使用 TLS 登录 | YES(生产环境) |
| force_local_data_ssl | NO | 是否强制数据通道加密 | YES |
| allow_anon_ssl | YES | 匿名是否允许使用 TLS | NO(禁止匿名写) |
| require_ssl_reuse | YES | 是否要求 TLS session reuse | 可因客户端兼容设置 NO |
| ssl_ciphers | HIGH | TLS 加密套件 | HIGH(安全) |
其他安全
| 配置项 | 默认值 | 功能说明 | 建议设置 / 注意事项 |
|---|---|---|---|
| secure_chroot_dir | /var/run/vsftpd/empty | vsftpd 用于 chroot 的安全空目录 | 必须存在 |
| dirmessage_enable | NO | 是否显示目录消息 | YES 可选 |
| use_localtime | NO | 是否使用本地时间 | YES |
| xferlog_std_format | YES | 日志格式 | YES |