FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 从入门到追忆(第三版:草稿)
  • 编辑日志
  • 目录
  • 致谢
  • 初版序言:好望角与塔吊
  • 再版序言:回到复制粘贴,面向教程本身
  • 三版序言:且有大觉而后知此其大梦也(草稿)
  • 前言
  • 第 1 章 FreeBSD 初见
    • 第 1.1 节 操作系统的历程:UNIX、Unix-like、Linux & FreeBSD
    • 第 1.2 节 FreeBSD 简史
    • 第 1.3 节 谁在使用 FreeBSD?
    • 第 1.4 节 为什么要使用 FreeBSD?
    • 第 1.5 节 Linux 用户迁移指南
    • 第 1.6 节 FreeBSD 桌面发行版
  • 第 2 章 安装 FreeBSD
    • 第 2.1 节 安装前准备(新手入门版本)
    • 第 2.2 节 FreeBSD 安装图解(新手入门版本)
    • 第 2.3 节 UNIX 基础(新手入门版本)
    • 第 2.4 节 命令行基础(新手入门版本)
    • 第 2.5 节 安装 FreeBSD——基于 VMware Workstation Pro
    • 第 2.6 节 安装 FreeBSD——基于 Virtual Box
    • 第 2.7 节 手动安装双系统(先安装 FreeBSD)
    • 第 2.8 节 手动安装双系统(后安装 FreeBSD)
    • 第 2.9 节 安装 FreeBSD——基于 Apple M1 & Parallels Desktop 20
    • 第 2.10 节 安装 FreeBSD——基于 Apple M1 & VMware Fusion Pro
    • 第 2.11 节 Qemu 安装 RISC-V FreeBSD(基于 x86 Windows)
    • 第 2.12 节 云服务器安装 FreeBSD(基于腾讯云轻量云)
    • 第 2.13 节 安装 FreeBSD——基于 Hyper-V
  • 第 3 章 包管理器与 FreeBSD 系统更新
    • 第 3.1 节 FreeBSD 镜像站现状
    • 第 3.2 节 FreeBSD 换源方式
    • 第 3.3 节 gitup 的用法
    • 第 3.4 节 通过 pkg 包管理器安装二进制包
    • 第 3.5 节 通过 Ports 以源代码方式安装软件
    • 第 3.6 节 通过 DVD 安装软件
    • 第 3.7 节 通过 freebsd-update 更新 FreeBSD
    • 第 3.8 节 通过源代码更新 FreeBSD
    • 第 3.9 节 使用 pkgbase 更新 FreeBSD
  • 第 4 章 桌面环境
    • 第 4.1 节 显卡驱动(英特尔、AMD)
    • 第 4.2 节 显卡驱动(NVIDIA)
    • 第 4.3 节 GNOME
    • 第 4.4 节 Mate
    • 第 4.5 节 Xfce
    • 第 4.6 节 Cinnamon
    • 第 4.7 节 Lumina
    • 第 4.8 节 LXQt
    • 第 4.9 节 bspwm
    • 第 4.10 节 IceWM
    • 第 4.11 节 Budgie
    • 第 4.12 节 i3wm
    • 第 4.13 节 CDE
    • 第 4.14 节 Hyprland
    • 第 4.15 节 LXDE
    • 第 4.16 节 Window Maker
    • 第 4.17 节 Fluxbox
    • 第 4.18 节 KDE6
    • 第 4.19 节 主题美化
    • 第 4.20 节 远程桌面
    • 第 4.21 节 root 登录桌面
  • 第 5 章 中文环境配置
    • 第 5.1 节 本地化环境变量
    • 第 5.2 节 Fcitx 输入法框架
    • 第 5.3 节 IBus 输入法框架
    • 第 5.4 节 五笔输入法
    • 第 5.5 节 Firefox 与 Chromium
    • 第 5.6 节 QQ(Linux 版)
    • 第 5.7 节 更换字体
    • 第 5.8 节 金山 WPS(Linux 版)
    • 第 5.9 节 压缩与解压
    • 第 5.10 节 微信(Linux 版)
  • 第 6 章 多媒体与外设
    • 第 6.1 节 声卡
    • 第 6.2 节 蓝牙
    • 第 6.3 节 打印机
    • 第 6.4 节 触摸板
    • 第 6.5 节 音频播放器
    • 第 6.6 节 视频播放器
    • 第 6.7 节 音频图形图像处理
  • 第 7 章 代理服务器
    • 第 7.1 节 HTTP 代理
    • 第 7.2 节 V2ray
    • 第 7.3 节 Mihomo(原 Clash)
    • 第 7.4 节 OpenVPN
  • 第 8 章 账户与权限
    • 第 8.1 节 sudo 与 doas
    • 第 8.2 节 用户与组
    • 第 8.3 节 用户权限
  • 第 9 章 Jail
    • 第 9.1 节 Jail 配置
    • 第 9.2 节 Jail 更新
    • 第 9.3 节 使用 Qjail 管理 Jail
  • 第 10 章 虚拟化
    • 第 10.1 节 通过 BVCP 以网页管理 BHyve
    • 第 10.2 节 使用 bhyve 安装 Windows 11(vm-bhyve)
  • 第 11 章 计算机概论
    • 第 11.1 节 存储卡参数简介与测试
    • 第 11.2 节 总线接口与协议
    • 第 11.3 节 网络基础
    • 第 11.4 节 操作系统
    • 第 11.5 节 MySQL 数据库
  • 第 12 章 引导恢复与 TTY 配置
    • 第 12.1 节 单用户模式与密码重置
    • 第 12.2 节 配置 rEFInd(双系统用)
    • 第 12.3 节 FreeBSD 中文 TTY 控制台
    • 第 12.4 节 引导界面与控制台界面
    • 第 12.5 节 Grub & UEFI 与 efibootmgr
  • 第 13 章 FreeBSD 系统管理
    • 第 13.1 节 FreeBSD src 源码概览
    • 第 13.2 节 FreeBSD 系统概览
    • 第 13.3 节 bsdconfig 系统配置工具
    • 第 13.4 节 SSH 配置与相关工具
    • 第 13.5 节 BSD init 管理服务
    • 第 13.6 节 利用脚本自动生成 BSDlibc 库文本
  • 第 14 章 网络管理
    • 第 14.1 节 TCP 堆栈
    • 第 14.2 节 WiFi
    • 第 14.3 节 USB 网络共享(USB tethering)
    • 第 14.4 节 USB 网卡 & 以太网卡
  • 第 15 章 FreeBSD 防火墙
    • 第 15.1 节 网络参数配置命令
    • 第 15.2 节 Packet Filter(PF)
    • 第 15.3 节 IPFilter(IPF)
    • 第 15.4 节 ipfirewall(IPFW)
    • 第 15.5 节 Fail2Ban(基于 IPFW、PF、IPF)
  • 第 16 章 服务器
    • 第 16.1 节 FTP 服务器
    • 第 16.2 节 MinIO 对象存储服务
    • 第 16.3 节 Gitlab-EE
    • 第 16.4 节 时间服务
    • 第 16.5 节 WildFly
    • 第 16.6 节 Rsync 同步服务
    • 第 16.7 节 Samba 服务器
    • 第 16.8 节 NFS 服务器
    • 第 16.9 节 Webmin
  • 第 17 章 网络服务器
    • 第 17.1 节 Apache
    • 第 17.2 节 Nginx
    • 第 17.3 节 PHP 8.X
    • 第 17.4 节 MySQL 5.X
    • 第 17.5 节 MySQL 8.X
    • 第 17.6 节 NextCloud——基于 PostgreSQL
    • 第 17.7 节 Telegraf+InfluxDB+Grafana 监控平台
    • 第 17.8 节 PostgreSQL 与 pgAdmin4
    • 第 17.9 节 AList
    • 第 17.10 节 prometheus 监控部署
    • 第 17.11 节 MongoDB 80
    • 第 17.12 节 Tomcat
    • 第 17.13 节 Caddy
    • 第 17.14 节 OnlyOffice(基于 PostgreSQL)
    • 第 17.15 节 Zabbix 监控(基于 PostgreSQL)
  • 第 18 章 嵌入式(树莓派、RISCV)
    • 第 18.1 节 树莓派简介与配件选用
    • 第 18.2 节 树莓派安装 FreeBSD
    • 第 18.3 节 树莓派 FreeBSD 配置
    • 第 18.4 节 树莓派与 Linux 兼容层
    • 第 18.5 节 树莓派与 OpenBSD
    • 第 18.6 节 在 RISCV 开发板上安装 OpenBSD
    • 第 18.7 节 Radxa X4(x86)
  • 第 19 章 文学故事
    • 第 19.1 节 BSD 与哲学家 George Berkeley(乔治·贝克莱)
    • 第 19.2 节 加州大学伯克利分校与“Fiat Lux”(要有光)
  • 第 20 章 游戏与科学
    • 第 20.1 节 游戏
    • 第 20.5 节 科研与专业工具
    • 第 20.6 节 我的世界(Minecraft)
  • 第 21 章 Linux 兼容层
    • 第 21.1 节 Linux 兼容层实现
    • 第 21.2 节 Linux 兼容层——基于 CentOS(FreeBSD Port)
    • 第 21.3 节 Linux 兼容层——基于 Ubuntu/Debian
    • 第 21.4 节 Linux 兼容层——基于 ArchLinux bootstrap
    • 第 21.5 节 Linux 兼容层——基于 archlinux-pacman
    • 第 21.6 节 Linux 兼容层——基于 OpenSUSE
    • 第 21.7 节 Linux 兼容层——基于 Gentoo Linux
    • 第 21.8 节 Linux 兼容层——基于 Rocky Linux
    • 第 21.9 节 Linux 兼容层——基于 Slackware Linux
    • 第 21.10 节 RockyLinux 兼容层(FreeBSD Port)
    • 第 21.11 节 Linux 兼容层——基于 Deepin
    • 第 21.12 节 Linux 兼容层与 Jail
    • 第 21.13 节 Linux 兼容层故障排除与未竟事宜
  • 第 22 章 编程环境与软件开发
    • 第 22.1 节 如何报告 Bug
    • 第 22.2 节 如何开发一个 Port
    • 第 22.3 节 如何参与 FreeBSD 开发
    • 第 22.4 节 C/C++ 环境的配置
    • 第 22.5 节 Java 环境的配置
    • 第 22.6 节 QT 环境的配置
    • 第 22.7 节 Python 与 VS Code
    • 第 22.8 节 Rust/Go 环境的配置
    • 第 22.9 节 Shell
    • 第 22.10 节 通过 IDA 7 调试 FreeBSD
    • 第 22.11 节 如何订阅 FreeBSD 的邮件列表
    • 第 22.12 节 code-server 和 clangd
    • 第 22.13 节 Node.js
  • 第 23 章 文件系统与磁盘管理
    • 第 23.1 节 自动挂载文件系统
    • 第 23.2 节 ZFS
    • 第 23.3 节 磁盘扩容
    • 第 23.4 节 NTFS & Fat32
    • 第 23.5 节 Swap 交换分区的设置
    • 第 23.6 节 Linux 文件系统
    • 第 23.7 节 ZFS 磁盘加解密
  • 第 24 章 DragonFly BSD
    • 第 24.1 节 DragonFly BSD 概述
    • 第 24.2 节 安装 DragonFly BSD
    • 第 24.3 节 配置 DragonFly BSD
  • 第 25 章 TwinCAT/BSD
    • 第 25.1 节 TwinCAT/BSD 系统安装与基本配置
    • 第 25.2 节 TwinCAT/BSD 开发环境配置
  • 第 26 章 OpenBSD
    • 第 26.1 节 OpenBSD 概述
    • 第 26.2 节 安装 OpenBSD
    • 第 26.3 节 配置 OpenBSD
    • 第 26.4 节 OpenBSD 包管理器
    • 第 26.5 节 桌面与其他软件
  • 第 27 章 NetBSD
    • 第 27.1 节 NetBSD 概述
    • 第 27.2 节 NetBSD 安装图解
    • 第 27.3 节 NetBSD 换源与包管理器
    • 第 27.4 节 桌面与中文环境常用软件
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • Pure-FTPd(基于 MySQL)
  • 安装
  • 配置 /usr/local/etc/pure-ftpd.conf 文件
  • 配置 mysql
  • 配置 /usr/local/etc/pureftpd-mysql.conf
  • 添加 ftp 组和用户
  • 服务操作
  • 参考文献
  • 故障排除与未竟事宜
  • ProFTPD(基于 MySQL)
  • 安装 ProFTPD
  • ProFTPD 配置文件 /usr/local/etc/proftpd.conf
  • 创建用户
  • 数据库相关
  • 服务操作
  • vsftpd
  • 安装 vsftpd
  • 创建虚拟用户
  • 配置 pam_pwdfile
  • 配置 vsftpd.conf
  • vsftpd.chroot_list
  • 创建路径
  • 服务管理
  • 参考文献
  • 连接到 FTP 服务器
在GitHub上编辑
导出为 PDF
  1. 第 16 章 服务器

第 16.1 节 FTP 服务器

上一页第 15.5 节 Fail2Ban(基于 IPFW、PF、IPF)下一页第 16.2 节 MinIO 对象存储服务

最后更新于17天前

FTP 即 File Transfer Protocol(文件传输协议)。使用 FTP 服务搭建服务器可以快速传输文件。

Pure-FTPd(基于 MySQL)

警告

Pure-FTPD 已经移除了对 RFC 2640 的支持,所以 Windows 下使用 ftp 命令行处理 FTP 非英文相关文件会乱码,且无法修改编码。见 。

ftp> quote opts utf8 on
504 Unknown command

使用命令行(FreeBSD 中)、WinSCP 等客户端测试 Pure-FTPd 并不存在乱码问题。

安装

由于 pkg 包没有数据库支持功能,所以需要通过 ports 来安装该软件:

# cd /usr/ports/ftp/pure-ftpd
# make config

选中 MYSQL,其余保持默认选项回车即可:

# make BATCH=yes install clean

配置 /usr/local/etc/pure-ftpd.conf 文件

生成配置文件

# cp /usr/local/etc/pure-ftpd.conf.sample /usr/local/etc/pure-ftpd.conf
# cp /usr/local/etc/pureftpd-mysql.conf.sample /usr/local/etc/pureftpd-mysql.conf

编辑配置文件并增加 mysql 的支持

配置 /usr/local/etc/pure-ftpd.conf 文件,以下项目修改如下:

# 兼容 ie 等非正规化的 ftp 客户端

BrokenClientsCompatibility yes

# 被动连接响应的端口范围。

PassivePortRange 30000 50000

# 允许认证用户登录的最小 UID。
# 例如,值为 100 会阻止所有 UID 小于 100 的用户登录。
# 如果你希望 root 能够登录,请使用 0。

MinUID 2000

# 仅允许认证用户进行 FXP 传输。

AllowUserFXP yes

# 若不禁止或注释,日志会报错找不到 ftp 用户

# AntiWarez                    yes

# 用户主目录不存在的话,自动创建

CreateHomeDir yes

# MySQL 配置文件(参见 README.MySQL)

MySQLConfigFile /usr/local/etc/pureftpd-mysql.conf

配置 mysql

注意

本文基于 MySQL 8.x。关于 MySQL 的安装、基本设置请看其他章节。

请自行安装配置 mysql 8.x。

创建数据库

create database pureftpd;
use pureftpd;
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
   `User` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
   `Password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
   `Uid` int(11) NOT NULL DEFAULT -1 COMMENT '用户 ID',
   `Gid` int(11) NOT NULL DEFAULT -1 COMMENT '用户组 ID',
   `Dir` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
   `quotafiles` int(255) NULL DEFAULT 500,
   `quotasize` int(255) NULL DEFAULT 30,
   `ulbandwidth` int(255) NULL DEFAULT 80,
   `dlbandwidth` int(255) NULL DEFAULT 80,
   `ipaddress` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT'*',
   `comment` int(255) NULL DEFAULT NULL,
   `status` tinyint(4) NULL DEFAULT 1,
   `ulratio` int(255) NULL DEFAULT 1,
   `dlratio` int(255) NULL DEFAULT 1,
   PRIMARY KEY (`User`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

创建登录数据库用户及设置密码

CREATE USER 'pftp'@'localhost' IDENTIFIED BY 'abc123';
GRANT SELECT, INSERT, UPDATE, DELETE ON pureftpd.* TO 'pftp'@'localhost';
flush privileges;

测试数据库链接:

# mysql -u pftp -p -h localhost pureftpd

配置 /usr/local/etc/pureftpd-mysql.conf

完整示例:

##############################################
#                                            #
# 示例 Pure-FTPd 的 MySQL 配置文件。         #
# 详细说明请参阅 README.MySQL。              #
#                                            #
##############################################

# MYSQLServer 数据库服务器地址
MYSQLServer     127.0.0.1

# MYSQLServer 数据库服务器端口
MYSQLPort       3306

# 可选:如果数据库服务器运行在本机,指定 mysql.sock 的路径。
MYSQLSocket     /var/run/mysqld/mysqld.sock

# 数据库用户名
MYSQLUser       pftp

# 数据库密码
MYSQLPassword   abc123

# 数据库名
MYSQLDatabase   pureftpd

# 密码加密方式(此处为明文)
# 有效值包括:"cleartext"(明文)、"argon2"、"scrypt"、"crypt" 和 "any"
MYSQLCrypt      cleartext

# 以下设置中的字符串部分在运行时会被替换:
#
# \L 会被替换为尝试认证的用户名。
# \I 会被替换为用户连接到的 IP 地址。
# \P 会被替换为用户连接到的端口号。
# \R 会被替换为用户来源的 IP 地址。
# \D 会被替换为远程 IP 地址的长整数形式。
#
# 使用这些替换字符串可以执行非常复杂的查询,特别适用于虚拟主机设置。

# 用于获取密码的 SQL 查询语句
MYSQLGetPW      SELECT Password FROM users WHERE User='\L'

# 用于获取系统用户名或 UID 的 SQL 查询语句
MYSQLGetUID     SELECT Uid FROM users WHERE User='\L'

# 默认 UID - 设置后将覆盖 MYSQLGetUID 的查询结果
MYSQLDefaultUID 2000

# 用于获取系统用户组名或 GID 的 SQL 查询语句
MYSQLGetGID     SELECT Gid FROM users WHERE User='\L'

# 默认 GID - 设置后将覆盖 MYSQLGetGID 的查询结果
MYSQLDefaultGID 2000

# 用于获取用户主目录的 SQL 查询语句
MYSQLGetDir     SELECT Dir FROM users WHERE User='\L'

# 可选:用于获取最大文件数的查询(虚拟配额支持需开启)
MySQLGetQTAFS  SELECT QuotaFiles FROM users WHERE User='\L'

# 可选:用于获取最大磁盘使用量(单位为 MB,需要虚拟配额支持)
MySQLGetQTASZ  SELECT QuotaSize FROM users WHERE User='\L'

# 可选:上传/下载比率,服务器需支持比率功能
MySQLGetRatioUL SELECT ULRatio FROM users WHERE User='\L'
MySQLGetRatioDL SELECT DLRatio FROM users WHERE User='\L'

# 可选:带宽限制,单位为 KB/s,服务器需支持带宽限制功能
MySQLGetBandwidthUL SELECT ULBandwidth FROM users WHERE User='\L'
MySQLGetBandwidthDL SELECT DLBandwidth FROM users WHERE User='\L'

# 启用 ~ 路径扩展。**切勿盲目启用,除非满足以下条件:**
# 1) 你明确知道自己在做什么。
# 2) 实际用户与虚拟用户一致。
# MySQLForceTildeExpansion 1

# 如果你使用事务型存储引擎,可以启用 SQL 事务以避免竞态条件。
# 如果使用传统的 MyISAM 引擎,请保持此项注释。
# MySQLTransactions On

添加 ftp 组和用户

警告

使用数据库后,pure-pw 就没用了。

# pw groupadd ftpgroup -g 2000
# pw useradd ftpuser -u 2001 -g 2000 -s /sbin/nologin -w no -d /home/pureftp -c "VirtualUser Pure-FTPd" -m
  • 添加 FTP 登录用户(必须手动写入 mysql 数据库),以下命令创建的用户是 test。密码是 test2。

USE pureftpd;
INSERT INTO `users` (`User`, `Password`, `Uid`, `Gid`, `Dir`, `quotafiles`, `quotasize`, `ulbandwidth`, `dlbandwidth`, `ipaddress`, `comment`, `status`, `ulratio`, `dlratio`)
VALUES ('test', 'test2', 2001, 2000, '/home/pureftp/www', 500, 30, 80, 80, '*', NULL, 1, 1, 1);

注意

写入表的 Uid、Gid 必须和上文 pw useradd 创建的用户一致。

技巧

基本思路就是写入数据库的虚拟用户会继承 pw useradd 创建的用户的权限与 GID\UID,然后通过数据库中的用户来操作 FTP。下同。

实际操作示例:

root@localhost [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| pureftpd           |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
root@localhost [pureftpd]> USE pureftpd;
Database changed
root@localhost [pureftpd]> INSERT INTO `users` (`User`, `Password`, `Uid`, `Gid`, `Dir`, `quotafiles`, `quotasize`, `ulbandwidth`, `dlbandwidth`, `ipaddress`, `comment`, `status`, `ulratio`, `dlratio`)
    -> VALUES ('test', 'test2', 2001, 2000, '/home/pureftp/www', 500, 30, 80, 80, '*', NULL, 1,1, 1);
Query OK, 1 row affected (0.01 sec)
root@localhost [pureftpd]> select * from users;
+------+----------+------+------+-------------------+------------+-----------+-------------+-------------+-----------+---------+--------+---------+---------+
| User | Password | Uid  | Gid  | Dir               | quotafiles | quotasize | ulbandwidth | dlbandwidth | ipaddress | comment | status | ulratio | dlratio |
+------+----------+------+------+-------------------+------------+-----------+-------------+-------------+-----------+---------+--------+---------+---------+
| test | test2    | 2001 | 2000 | /home/pureftp/www |        500 |        30 |          80 |    80 | *         |    NULL |      1 |       1 |       1 |
+------+----------+------+------+-------------------+------------+-----------+-------------+-------------+-----------+---------+--------+---------+---------+
1 row in set (0.01 sec)
  • 配置 FTP 目录

# mkdir -p /home/pureftp/www 
# chown -R ftpuser:ftpgroup /home/pureftp
# chmod -R 775 /home/ftpuser # 权限要设置为 775,这样同组的才能读写

参考文献

服务操作

# service pure-ftpd enable  # 添加服务
# service pure-ftpd start   # 启动服务器
# service pure-ftpd stop    # 停止服务
# service pure-ftpd restart # 重启服务

参考文献

故障排除与未竟事宜

  • Pure-FTPd 日志在 /var/log/messages。

ProFTPD(基于 MySQL)

技巧

ProFTPD 在 Windows 自带的 FTP 链接下不会乱码。

安装 ProFTPD

注意

本文基于 MySQL 8.0。关于 MySQL 的安装、基本设置请看其他章节。

请自行安装配置 MySQL 8.x——需要与 proftpd-mod_sql_mysql 安装的 databases/mysql8X-client 版本相一致。

# pkg install proftpd proftpd-mod_sql_mysql

或

# cd /usr/ports/ftp/proftpd/ && make install clean
# cd /usr/ports/databases/proftpd-mod_sql_mysql/ && make install clean

ProFTPD 配置文件 /usr/local/etc/proftpd.conf

  • 编辑 ProFTPD 的配置文件 /usr/local/etc/proftpd.conf 如下

技巧

示例文件参见 /usr/local/etc/proftpd.conf.sample。

ServerName "Test Ftp Server"
ServerType standalone
DefaultServer on
ServerIdent on "FTP Server ready"
Port 21
Umask 022

# 超时设置
TimeoutLogin 300
TimeoutIdle 36000
TimeoutNoTransfer 36000

# 资源限制
User proftpd
Group proftpd
RLimitMemory 256M 256M
RLimitOpenFiles 1024 1024
PassivePorts 50000 60000

# 日志配置
LogFormat default "%h %l %u %t \"%r\" %s %b"
LogFormat auth "%v [%P] %h %t \"%r\" %s"
SystemLog /var/log/proftpd/proftpd.log
TransferLog /var/log/proftpd/xfer.log
ExtendedLog /var/log/proftpd/auth.log AUTH auth

# MySQL 模块加载
LoadModule mod_sql.c
LoadModule mod_sql_mysql.c
LoadModule mod_sql_passwd.c

# 只允许访问自己的目录,去掉会访问 /

DefaultRoot ~

# 运行覆盖文件

AllowOverwrite		on

<Global>
  # 数据库连接
  SQLConnectInfo proftpd@localhost proftpd 123456
  
  # 关键修正部分
  SQLAuthTypes SHA256
  SQLPasswordEngine on
  
  # 用户表映射
  SQLUserInfo users username password uid gid homedir shell
  SQLDefaultGID 2000
  SQLDefaultUID 2000
  RequireValidShell off
  
  # 认证配置
  AuthOrder mod_sql.c
  SQLAuthenticate users
  
  # 登录统计
  SQLNamedQuery getcount SELECT "CONCAT('Total logins: ', count) FROM users WHERE username='%u'"
  SQLNamedQuery updatecount UPDATE "count=count+1 WHERE username='%u'" users
  SQLShowInfo PASS "230" "%{getcount}"
  SQLLog PASS updatecount
  
  # 文件操作日志
	
  SQLNamedQuery log_work FREEFORM "INSERT INTO worklog (user_name, file_and_path, bytes, send_time, client_ip, client_name, client_command) VALUES ('%u', '%f', %b, NULLIF('%T', ''), '%a', '%h', '%m')"
  
  SQLLog RETR,STOR,DELE log_work
  
</Global>
  • 创建一个目录来存储 FTP 服务器的日志:

# mkdir /var/log/proftpd

警告

若不 主动 创建(即使自动创建了也应主动再创建一次),会提示 proftpd[3435]: warning: handling possibly truncated configuration data at line 65 of '/usr/local/etc/proftpd.conf'。

技巧

ProFTPD 配置文件 /usr/local/etc/proftpd.conf 有语法检查命令 proftpd -t -d5。

我们在设置中指定服务器将在主动模式下在端口 21 上工作,在被动模式下在 50000-60000 范围内工作。这些端口应该在防火墙中打开。对于 PF,这是通过以下规则完成的:

pass in quick on $ext_if proto tcp from any to $ext_if port { 21, 50000:60000 }

创建用户

出于安全目的,我们将以非 root 用户身份运行 Proftpd。因此,我们将创建此用户:

# adduser
Username: proftpd # 用户名
Full name: FTP User # 用户全名
Uid (Leave empty for default): 
Login group [proftpd]:
Login group is proftpd. Invite proftpd into other groups? []:
Login class [default]:
Shell (sh csh tcsh bash nologin) [sh]: nologin # 不允许登录系统
Home directory [/home/proftpd]:
Home directory permissions (Leave empty for default):
Enable ZFS encryption? (yes/no) [no]:
Use password-based authentication? [yes]: no
Lock out the account after creation? [no]:
Username    : proftpd
Password    : <disabled>
Full Name   : FTP User
Uid         : 1002
ZFS dataset : zroot/home/proftpd
Class       :
Groups      : proftpd
Home        : /home/proftpd
Home Mode   :
Shell       : /usr/sbin/nologin
Locked      : no
adduser: INFO: Successfully created ZFS dataset (zroot/home/proftpd).
adduser: INFO: Successfully added (proftpd) to the user database.
Add another user? (yes/no) [no]:
Goodbye!

数据库相关

  • 创建一个 MySQL 数据库和一个对创建的数据库具有完全访问权限的用户:

CREATE DATABASE `proftpd` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • 创建数据库用户和密码 (授权 proftpd 数据库):

CREATE USER 'proftpd'@'localhost' IDENTIFIED BY '123456';
GRANT SELECT, INSERT, UPDATE, DELETE ON proftpd.* TO 'pftp'@'localhost';
FLUSH PRIVILEGES;
  • 创建数据表:

USE proftpd;

DROP TABLE IF EXISTS users;
CREATE TABLE `users` (
   `username` VARCHAR(30) NOT NULL,
   `descr` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
   `password` VARCHAR(64) NOT NULL,
   `uid` INT(11) DEFAULT NULL,
   `gid` INT(11) DEFAULT NULL,
   `homedir` VARCHAR(255) DEFAULT NULL,
   `shell` VARCHAR(255) DEFAULT NULL,
   `count` INT(11) NOT NULL DEFAULT 0,
   PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
DROP TABLE IF EXISTS worklog;
CREATE TABLE worklog (
   id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
   date TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP(0),
   user_name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
   file_and_path VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
   bytes BIGINT UNSIGNED DEFAULT NULL,
   send_time VARCHAR(9) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
   client_ip VARCHAR(15) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
   client_name TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
   client_command VARCHAR(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
   PRIMARY KEY (id),
   UNIQUE INDEX id (id)
) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC;
INSERT INTO `proftpd`.`users` (`username`, `descr`, `password`, `uid`, `gid`, `homedir`, `shell`, `count`)
VALUES ('test', 'Test user', SHA2('FTPpassword_here', 256), '1002', '1002', '/home/www/ftp', NULL, '0');

创建了:

  • FTP 用户名 test

  • FTP 登录密码 FTPpassword_here

  • UID 1002

  • GID 1002

警告

上面的 UID GID 必须与 proftpd 用户相同!否则只能读不能写!

你可以通过以下方式确定 proftpd 用户的 UID 和 GID:

root@ykla:/home/ykla # id proftpd
uid=1002(proftpd) gid=1002(proftpd) groups=1002(proftpd)
  • 测试数据库链接:

# mysql -u proftpd -p -h localhost proftpd

proftpd@localhost [proftpd]> show data;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'data' at line 1
proftpd@localhost [proftpd]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
| proftpd            |
+--------------------+
3 rows in set (0.00 sec)

proftpd@localhost [proftpd]> use proftpd;
Database changed
proftpd@localhost [proftpd]> select * from users;
+----------+-----------+------------------------------------------------------------------+------+------+---------------+-------+-------+
| username | descr     | password                                                         | uid  | gid  | homedir       | shell | count |
+----------+-----------+------------------------------------------------------------------+------+------+---------------+-------+-------+
| test     | Test user | d1d6930fda5f964acba51ec4c35d0ddb3b36d25bfef59f1120abd2e4f9f140d9 | 1002 | 1002 | /home/www/ftp | NULL  |     0 |
+----------+-----------+------------------------------------------------------------------+------+------+---------------+-------+-------+
1 row in set (0.00 sec)

创建一个目录和一个测试 FTP 用户,将创建的目录指定为用户目录:

# mkdir -p /home/www/ftp
# chown -R proftpd:proftpd /home/www/ftp
# chmod -R 775 /home/www/ftp

服务操作

# service proftpd enable  # 加入启动
# service proftpd start   # 启动服务
# service proftpd stop    # 停止服务
# service proftpd restart # 重启服务

使用用户 test,密码 FTPpassword_here 登录 FTP 即可。

vsftpd

vsftpd 即 Very Secure FTP Daemon(非常安全的 FTP 守护进程)。在 Linux 上比较流行。经过测试在 Windows 上 FTP 客户端中也不会乱码。

安装 vsftpd

  • 通过 pkg 安装

# pkg install vsftpd-ssl pam_pwdfile apache24
名称
说明

vsftpd-ssl

带 SSL 支持的 vsftpd-ssl

pam_pwdfile

一个 PAM 模块,允许使用纯文本密码文件进行用户身份验证。

apache24

提供了 htpasswd 命令

技巧

FreeBSD 系统中的 /etc/passwd 仅起到兼容作用,并不实际使用。实际使用的是相关 db 数据库文件。

  • 通过 Ports:

# cd /usr/ports/ftp/vsftpd/ && make install clean
# cd /usr/ports/security/pam_pwdfile/ && make install clean
# cd /usr/ports/www/apache24 && make install clean

观察安装输出:

[2/2] Installing vsftpd-ssl-3.0.5_2...
===> Creating groups
Using existing group 'ftp'
===> Creating users
Creating user 'ftp' with uid '14'
===> Creating homedir(s)
[2/2] Extracting vsftpd-ssl-3.0.5_2: 100%

看到 vsftpd 会创建一个用户叫 ftp,查看该用户详情:

# id ftp
uid=14(ftp) gid=14(ftp) groups=14(ftp)

创建虚拟用户

root@ykla:/home/ykla # adduser
Username: ftptest
Full name:
Uid (Leave empty for default):
Login group [ftptest]: ftp # 注意此处
Login group is ftp. Invite ftptest into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: nologin # 注意此处
Home directory [/home/ftptest]:
Home directory permissions (Leave empty for default):
Enable ZFS encryption? (yes/no) [no]:
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password: # 注意此处,我设置密码为 z
Enter password again:
Lock out the account after creation? [no]:
Username    : ftptest
Password    : *****
Full Name   :
Uid         : 1003
ZFS dataset : zroot/home/ftptest
Class       :
Groups      : ftp
Home        : /home/ftptest
Home Mode   :
Shell       : /usr/sbin/nologin
Locked      : no
OK? (yes/no) [yes]:
adduser: INFO: Successfully created ZFS dataset (zroot/home/ftptest).
adduser: INFO: Successfully added (ftptest) to the user database.
Add another user? (yes/no) [no]:
Goodbye!

以上:

  • 用户名 ftptest

  • 密码 z

  • 组 ftp

配置 pam_pwdfile

  • 创建文件 /etc/pam.d/vsftpd,写入:

auth required /usr/local/lib/pam_pwdfile.so pwdfile /usr/local/etc/vsftpd_login.db
account required /usr/lib/pam_permit.so
  • 创建密码数据库(我上面添加了用户 ftptest,密码是 z )

# htpasswd -c -b /usr/local/etc/vsftpd_login.db ftptest z
Adding password for user virtual

后续再添加(可能需要再 adduser,未测试):

# htpasswd -b /usr/local/etc/vsftpd_login.db 新建的用户名 新建的用户密码

配置 vsftpd.conf

vsftpd 主配置数据保存在 /usr/local/etc/vsftpd.conf,可直接修改。因为还有个备用的模板在 /usr/local/etc/vsftpd.conf.sample。

我们将 /usr/local/etc/vsftpd.conf 配置如下:

# /usr/local/etc/vsftpd.conf 示例配置文件 
#
# 默认编译设置相当保守。此示例文件略微放宽了一些设置,使 FTP 守护进程更实用。
# 参阅 vsftpd.conf.5 可获取所有默认编译设置。
#
# 请注意:此示例文件不是 vsftpd 选项的详尽列表。
# 请阅读 vsftpd.conf.5 手册页,以全面了解 vsftpd 的功能。
#
# 不允许匿名 FTP 吗?
anonymous_enable=NO
#
# 允许本地用户登录。
local_enable=YES
#
# 取消注释以启用任何形式的 FTP 写命令。
write_enable=YES
#
# 本地用户的默认 umask 值为 077。你可能希望将其更改为 022,
# 如果你的用户期待这样的话(022 是大多数其他 FTP 服务的默认值)
# local_umask=022
#
# 取消注释以允许匿名 FTP 用户上传文件。仅当启用了上面的全局写入功能时,才会生效。
# 此外,你还需要为 FTP 用户创建一个可写的目录。
# anon_upload_enable=YES
#
# 如果你希望匿名 FTP 用户能够创建新目录,取消注释此项。
# anon_mkdir_write_enable=YES
#
# 启用目录消息 - 在远程用户进入某个目录时,给出相关的消息。
dirmessage_enable=YES
#
# 启用上传/下载日志记录。
xferlog_enable=YES
#
# 确保 PORT 传输连接来自端口 20 (ftp-data)。
connect_from_port_20=YES

local_root=/home/ftp
anon_root=/home/ftp
#
# 如果需要,你可以安排上传的匿名文件由不同的用户拥有。注意!不建议将上传文件归属于 "root" 用户!
# chown_uploads=YES
# chown_username=whoever
#
# 你可以覆盖日志文件的存放位置。默认路径如下。
# xferlog_file=/var/log/vsftpd.log
#
# 如果需要,你可以使用标准 ftpd xferlog 格式的日志文件。
# 注意,在这种情况下,默认的日志文件位置为 /var/log/xferlog。
# xferlog_std_format=YES
#
# 你可以更改超时闲置会话的默认值。单位秒,下同
idle_session_timeout=1800
#
# 你可以更改超时数据连接的默认值。
data_connection_timeout=1200
#
# 建议你在系统上定义一个唯一的用户,供 FTP 服务器使用,作为完全隔离且没有特权的用户。
# nopriv_user=ftpsecure
#
# 启用此选项,服务器将识别异步 ABOR 请求。由于代码较为复杂,安全性方面不推荐启用此项。
# 如果不启用,某些旧的 FTP 客户端可能会遇到问题。
# async_abor_enable=YES
#
# 在默认情况下,服务器会假装允许 ASCII 模式,但实际上会忽略该请求。
# 打开以下选项,服务器将在 ASCII 模式下对文件进行 ASCII 格式的修改。
# 注意:在某些 FTP 服务器中,ASCII 支持允许通过 "SIZE /big/file" 命令在 ASCII 模式下发起拒绝服务攻击(DoS)。vsftpd 已经预测到此攻击并始终保持安全,报告的是原始文件的大小。
# ASCII 格式修改是该协议的一项糟糕特性。
# ascii_upload_enable=YES
# ascii_download_enable=YES
#
# 你可以完全自定义登录横幅信息:
ftpd_banner=Welcome to blah FTP service.
#
# 你可以指定一个禁止匿名电子邮件地址的文件。此功能对于防范某些 DoS 攻击可能很有用。
# deny_email_enable=YES
# (默认值如下)
# banned_email_file=/etc/vsftpd.banned_emails
#
# 你可以指定一个本地用户的显式列表,将这些用户 chroot() 到他们的主目录。如果 chroot_local_user 为 YES,
# 则此列表变为不进行 chroot() 操作的用户列表。
# (警告!chroot() 可能非常危险。如果使用 chroot,请确保用户对 chroot 目录的顶级目录没有写权限)
# chroot_local_user=NO 即 chroot_list_file 文件中用户将会被限制在其家目录中
chroot_local_user=NO
chroot_list_enable=YES
# (默认值如下)
chroot_list_file=/usr/local/etc/vsftpd.chroot_list
allow_writeable_chroot=YES
#
# 你可以启用内置 ls 的 "-R" 选项。默认情况下禁用此选项,以避免远程用户在大站点上引起过多 I/O。
# 然而,一些有缺陷的 FTP 客户端(如 "ncftp" 和 "mirror")假设存在 "-R" 选项,因此启用它有一定的理由。
# ls_recurse_enable=YES
#
# 当启用 "listen" 指令时,vsftpd 以独立模式运行,并监听 IPv4 套接字。此指令不能与 listen_ipv6 指令同时使用。
listen=YES
#
# 此指令启用监听 IPv6 套接字。如果要同时监听 IPv4 和 IPv6 套接字,则必须使用两个不同的配置文件运行两个 vsftpd 实例。
# 确保其中一个 listen 选项被注释掉!!
# listen_ipv6=YES

# 此选项应该是一个空目录的路径。
# 此目录不应可写给 FTP 用户。该目录在 vsftpd 不需要文件系统访问时用作安全的 chroot() 监狱。
secure_chroot_dir=/usr/local/share/vsftpd/empty

# 如果启用后台模式,此选项才有效。
# 它会将运行中的守护进程的 PID 写入指定路径的文件中。
# 默认情况下不创建 PID 文件。
# pid_file=/var/run/vsftpd.pid

# 如果在独立模式下使用 vsftpd,请取消注释下面两行:
listen=YES
background=YES

# 使用本地时间
use_localtime=YES

vsftpd.chroot_list

创建并编辑 /usr/local/etc/vsftpd.chroot_list,加入用户 ftptest

创建路径

# mkdir -p /home/ftp
# chown -R ftp:ftp /home/ftp
# chmod -R 775 /home/ftp

服务管理

# service vsftpd enable  # 添加服务
# service vsftpd start   # 开始服务
# service vsftpd stop    # 停止服务
# service vsftpd restart # 重启服务
  • 使用用户 ftptest,密码 z 登录 FTP 即可。

  • vsftpd 日志在 /var/log/vsftpd.log

参考文献

连接到 FTP 服务器

简单示例:

# telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 FTP Server ready
quit
221 Goodbye.

使用 ftp 命令可以快速连接到 FTP 服务器。

用法:

ftp [选项] [IP 地址]

FTP 命令:

account [密码] 提交补充密码

put 上传

bell 在文件传送完后发出提示音

dir/ls 显示该目录下的文件及文件夹

cd 切换目录

delete 删除文件

features 显示该服务器支持的功能

get 远程文件 下载服务器上的远程文件

bye 结束与服务器的会话

实例:

PS C:\Users\ykla> ftp 192.168.179.150
连接到 192.168.179.150。
220 Welcome to blah FTP service.
200 Always in UTF8 mode.
用户(192.168.179.150:(none)): ftptest
331 Please specify the password.
密码:

230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东方工作室译).pdf
哲学史期末.docx
马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 288 字节,用时 0.00秒 96.00千字节/秒。
ftp> delete 哲学史期末.docx
250 Delete operation successful.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-------    1 1003     14       147170778 Mar 06 15:39 FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
-rw-------    1 1003     14       47037557 Mar 06 15:39 FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东 方工作室译).pdf
-rw-------    1 1003     14         591146 Oct 20 11:28 马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 435 字节,用时 0.01秒 54.38千字节/秒。
ftp> get 马克思主义哲学原理.doc
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 马克思主义哲学原理.doc (591146 bytes).
226 Transfer complete.
ftp: 收到 591146 字节,用时 0.01秒 42224.71千字节/秒。
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东方工作室译).pdf
马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 266 字节,用时 0.00秒 66.50千字节/秒。
ftp> lcd
目前的本地目录 C:\Users\ykla。
ftp> put UOS使用打印机.pdf
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
ftp: 发送 1269989 字节,用时 0.04秒 36285.40千字节/秒。
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-------    1 1003     14       147170778 Mar 06 15:39 FreeBSD完全攻略QA版 (冯宝坤,陈子鸿编著, 冯宝坤, 陈子鸿编著, 冯宝坤, 陈子鸿).pdf
-rw-------    1 1003     14       47037557 Mar 06 15:39 FreeBSD技术内幕 ((美) Michael Urban,(美)Brian Tiemann著 智慧东 方工作室译).pdf
-rw-------    1 1003     14        1269989 Mar 27 15:13 UOS使用打印机.pdf
-rw-------    1 1003     14         591146 Oct 20 11:28 马克思主义哲学原理.doc
226 Directory send OK.
ftp: 收到 515 字节,用时 0.01秒 46.82千字节/秒。
ftp> bye
221 Goodbye.
PS C:\Users\ykla>

FTP 默认下载路径是 C:\Users\你的用户名,我是 C:\Users\ykla。

,775 权限设置来自此处

,本文框架基于此

官网文档在此 ,中文翻译在金步国的 。

,其修改自 。本文框架基于此。

Linux 环境下 FTP 权限设置详解与操作步骤全攻略
Virtual Hosting With PureFTPd And MySQL
VSFTPD.CONF
vsftpd.conf 中文版
How to set up vsftpd on FreeBSD 12?
Installing and configuring vsftpd on FreeBSD
https://www.pureftpd.org/project/pure-ftpd/news/