For the complete documentation index, see llms.txt. This page is also available as Markdown.

34.3 ProFTPD(基于 MySQL)

技巧

通过 Windows 自带 FTP 客户端连接 ProFTPD 服务器时不会出现乱码。

安装 ProFTPD

注意

本节基于 MySQL 8.0。有关 MySQL 的安装和基本设置,请参见其他章节。

请自行完成 MySQL 8.x 的安装配置,需确保其版本与 proftpd-mod_sql_mysql 安装的 databases/mysql8X-client 版本一致。

安装 ProFTPD 及其 MySQL 模块:

# pkg install proftpd proftpd-mod_sql_mysql

或使用 Ports 安装:

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

ProFTPD 配置文件

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

技巧

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

ServerName "Test Ftp Server"                     # FTP 服务器名称
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 <你的数据库密码>   # 数据库连接信息(用户、主机、密码)

  # 密码认证设置
  SQLAuthTypes SHA256                             # 使用 SHA256 加密认证
  SQLPasswordEngine on                            # 启用 SQL 密码引擎

  # 用户表映射
  SQLUserInfo users username password uid gid homedir shell   # 映射 users 表字段
  SQLDefaultGID 2000                              # 默认 GID
  SQLDefaultUID 2000                              # 默认 UID
  RequireValidShell off                            # 不要求有效 Shell

  # 认证顺序
  AuthOrder mod_sql.c
  SQLAuthenticate users                            # 使用 SQL 用户表认证

  # 登录统计
  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                    # 将 RETR、STOR、DELE 操作记录到 worklog 表
</Global>

创建日志目录:

警告

如果未手动创建目录,系统将提示 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 数据库相关

创建 MySQL 数据库和用户:

创建数据库用户和密码:

创建数据表:

已创建以下内容:

项目

FTP 用户名

test

FTP 登录密码

FTPpassword_here

UID

1002

GID

1002

警告

上面的 UID 和 GID 必须与 proftpd 用户相同,否则仅有读取权限而无写入权限。

可以通过以下方式获取用户 proftpd 的 UID、GID 及所属组信息:

测试数据库连接:

创建目录和测试 FTP 用户:

服务操作

配置完成后,启动并管理 ProFTPD 服务:

以用户名 test、密码 FTPpassword_here 登录 FTP。

最后更新于