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 cleanProFTPD 配置文件
编辑 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。
最后更新于