16.1 FTP 服务器
FTP 协议概述
FTP(File Transfer Protocol,文件传输协议)是 TCP/IP 协议栈中最早的应用层协议之一。该协议采用客户端-服务器(Client-Server)架构,通过两个独立的 TCP 连接(控制连接与数据连接)实现文件的双向传输。FTP 支持主动模式(PORT)和被动模式(PASV)两种工作方式:主动模式下服务器主动向客户端发起数据连接,被动模式下则由客户端向服务器发起数据连接。在 FreeBSD 系统中搭建 FTP 服务器,可实现局域网或互联网环境下的文件快速传输与共享。
本章将介绍三种常用的 FTP 服务器软件:
Pure-FTPd:轻量级 FTP 服务器,支持虚拟用户
ProFTPD:配置灵活,模块丰富
vsftpd:注重安全性,在 Linux 系统中广泛使用
Pure-FTPd(基于 MySQL)
Pure-FTPd 不支持中文环境
Pure-FTPd 已移除对 RFC 2640[EB/OL]. [2026-03-26]. https://www.rfc-editor.org/rfc/rfc2640 (Internationalization of the File Transfer Protocol,FTP 协议的国际化)的支持,该 RFC 定义了 FTP 的国际化框架。因此在 Windows 系统下使用 ftp 命令行访问包含非英文字符的文件时可能出现乱码,且无法修改编码。具体变更可参见 Version 1.0.48 released[EB/OL]. [2026-03-26]. https://www.pureftpd.org/project/pure-ftpd/news 版本发布公告。
尝试启用 UTF-8 编码的示例如下:
ftp> quote opts utf8 on
504 Unknown command在 FreeBSD 中使用命令行或 WinSCP 等客户端测试 Pure-FTPd 时,不会出现乱码问题。
软件安装方式
通过 pkg 安装的 Pure-FTPd 包不包含数据库支持功能,因此需要通过 ports 来安装该软件以启用 MySQL 集成。
在配置过程中选择 MYSQL,其余选项保持默认并回车确认即可。

配置 /usr/local/etc/pure-ftpd.conf 文件
/usr/local/etc/pure-ftpd.conf 文件配置文件需要先生成,再进行编辑。
生成配置文件
复制示例配置文件为实际使用的配置文件:
配置文件结构如下:
MySQL 集成配置
编辑 /usr/local/etc/pure-ftpd.conf 文件,修改相关配置项以启用 MySQL 认证:
配置 MySQL
本文以 MySQL 8.x 为基础。有关 MySQL 的安装和基本配置,请参见其他章节。请自行安装配置 MySQL 8.x。
创建数据库
创建 Pure-FTPd 使用的数据库和用户表:
创建登录数据库用户及设置密码
创建 Pure-FTPd 用于连接数据库的专用用户:
测试数据库连接:
配置文件 /usr/local/etc/pureftpd-mysql.conf
/usr/local/etc/pureftpd-mysql.conf/usr/local/etc/pureftpd-mysql.conf 文件完整示例:
添加 ftp 组和用户
警告
使用数据库后,
pure-pw命令就不生效了。
创建系统用户和组,供虚拟 FTP 用户继承权限:
添加 FTP 登录用户,必须手动写入 MySQL 数据库。以下示例创建用户 test,密码为 test2:
注意
写入表中的
Uid和Gid必须与之前通过pw useradd创建的用户保持一致。
技巧
基本思路是数据库中的虚拟用户将继承
pw useradd创建的用户的权限及 GID/UID,然后通过数据库中的用户进行 FTP 操作。
实际操作示例:
配置 FTP 目录:
参考文献
Linux 环境下 FTP 权限设置详解与操作步骤全攻略[EB/OL]. [2026-03-25]. https://my.oschina.net/emacs_8748786/blog/17171107.
服务操作
配置完成后,启动并管理 Pure-FTPd 服务:
参考文献
Virtual Hosting With PureFTPd And MySQL (Incl. Quota And Bandwidth Management)[EB/OL]. [2026-03-25]. https://archive.org/download/pdfbackup_18_aout-2014/Virtual_Hosting_With_PureFTPd_And_MySQL__Incl._Quota_And_Ban.pdf.
故障排除与未竟事宜
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 版本相一致。
安装 ProFTPD 及其 MySQL 模块:
或使用 ports 安装:
ProFTPD 配置文件 /usr/local/etc/proftpd.conf
/usr/local/etc/proftpd.conf编辑 ProFTPD 的配置文件 /usr/local/etc/proftpd.conf:
技巧
示例文件参见
/usr/local/etc/proftpd.conf.sample。
创建日志目录:
警告
如果不 手动 创建目录(即使系统已自动创建,也建议再次手动创建),会提示
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 防火墙,这是通过以下规则完成的。
允许从外部接口 $ext_if(需要替换成实际网络接口)到本机端口 21 及 50000-60000 的 TCP 入站流量:
创建用户
出于安全目的,以非 root 用户身份运行 ProFTPD。添加新用户:
数据库相关
创建 MySQL 数据库和用户:
创建数据库用户和密码:
创建数据表:
创建了:
FTP 用户名
testFTP 登录密码
FTPpassword_hereUID
1002GID
1002
警告
上面的 UID GID 必须与 proftpd 用户相同!否则只能读不能写!
可以通过以下方式确定用户 proftpd 的 UID、GID 及所属组信息:
测试数据库连接:
创建目录和测试 FTP 用户:
服务操作
配置完成后,启动并管理 ProFTPD 服务:
使用用户 test,密码 FTPpassword_here 登录 FTP 即可。
vsftpd
vsftpd(Very Secure FTP Daemon,非常安全的 FTP 守护进程)注重安全性设计,在 Linux 系统中较为流行。经过测试,在 Windows 上的 FTP 客户端中也不会出现乱码问题。
安装 vsftpd
通过 pkg 安装:
安装包说明:
vsftpd-ssl
带 SSL 支持的 vsftpd 包
pam_pwdfile
一个 PAM 模块,允许使用纯文本密码文件进行用户身份验证
apache24
提供 htpasswd 命令
技巧
在 FreeBSD 系统中,
/etc/passwd仅用于兼容性目的,实际认证使用的是相应的数据库文件。
通过 Ports 安装:
观察安装输出:
vsftpd 会创建一个用户叫 ftp,查看用户 ftp 的 UID、GID 及所属组信息:
创建虚拟用户
添加系统用户:
创建了:
用户名
ftptest密码
z组
ftp
配置 pam_pwdfile
创建 PAM 配置文件 /etc/pam.d/vsftpd:
创建密码数据库:
向 vsftpd 登录数据库添加用户 ftptest 并设置密码。
后续添加新用户:
配置 vsftpd.conf
vsftpd.confvsftpd 的主配置文件位于 /usr/local/etc/vsftpd.conf,可直接进行修改;同时还提供了一个备用模板文件 /usr/local/etc/vsftpd.conf.sample。
将 /usr/local/etc/vsftpd.conf 配置修改为如下内容:
官网文档在此 VSFTPD.CONF,中文翻译在金步国的 vsftpd.conf 中文版。
vsftpd.chroot_list
vsftpd.chroot_list创建并编辑 /usr/local/etc/vsftpd.chroot_list,加入用户 ftptest。
创建路径
创建 FTP 目录并设置权限:
服务管理
配置完成后,启动并管理 vsftpd 服务:
使用用户 ftptest,密码 z 登录 FTP 即可。
vsftpd 日志在 /var/log/vsftpd.log
参考文献
angeloma. How to set up vsftpd on FreeBSD 12?[EB/OL]. (2020-02-13)[2026-03-25]. https://www.osradar.com/how-to-set-up-vsftpd-on-freebsd-12/.
连接到 FTP 服务器
使用 telnet 测试 FTP 服务:
上述命令用于测试本地主机 FTP 服务是否在端口 21 上可用。
使用 ftp 命令可以快速连接到 FTP 服务器。其基本用法如下:
FTP 命令:
操作示例:
FTP 默认下载路径是用户主目录。
课后习题
在 FreeBSD 上通过 ports 编译安装 Pure-FTPd 并启用 PostgreSQL 支持,创建测试数据库表,验证虚拟用户可以正常登录并上传下载文件。
选取 vsftpd 的 chroot 机制,分析其如何在用户隔离与系统复杂性之间做权衡,尝试修改默认配置使 chroot 目录可写并验证其安全风险。
修改 ProFTPD 的默认端口配置,从 21 改为 2121,同时调整被动端口范围,验证服务可用性并分析该修改对系统安全性的影响。
最后更新于