如何配置Pure-Ftpd FTP服务器以实现被动连接支持?
- 内容介绍
- 文章标签
- 相关推荐
一、问题概述
在实际使用 Pure‑FTPd 时常见的阻碍点包括:
- 客户端只能使用主动模式,而在 NAT/防火墙环境下经常连接失败。按理说,
-
开启被动模式后出现
425 Can't open data connection导致目录读取失败文件上传/下载中断。 - Pure‑FTPd 默认不启用被动端口范围导致 PASV 命令没有返回可用端口。
- 防火墙或云安全组未放行被动端口,使得即使配置正确也仍然超时。
- MySQL 关联配置错误时虚拟使用者无法登录或权限异常。
二、准备工作
1. 环境要求
- Linux
- root 或 sudo 权限
- 已安装 gcc、make、libssl-dev、libpam0g-dev
2. 下载 Pure‑FTPd 源码
步骤 1:获取最新稳定版压缩包
wget https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.50.tar.gz
3. 解压与编译安装
步骤 2:解压源码
步骤 3:编译并安装
三、创建虚拟使用者
a) 本地 PureDB 使用者:
# 创建数据库文件
pure-pw mkdb /etc/pure-ftpd/pureftpd.pdb
# 添加使用者
pure-pw useradd ftpuser -u ftp -d /home/ftpusers/ftpuser
pure-pw mkdb /etc/pure-ftpd/pureftpd.pdb
b) MySQL 虚拟使用者
# 编辑 MySQL 配置文件
vim /etc/pure-ftpd/pureftpd-mysql.conf
# 示例内容
MYSQLServer 127.0.0.1
MYSQLPort 3306
MYSQLUser ftpmysql
MYSQLPassword yourpassword
MYSQLDatabase ftpmysql
# …其它查询语句,
# 去除 pure‑ftpd.conf 中对应行前的 #
四、主要:开启并配置被动模式支持
a) 指定被动端口范围
Pain Point:若未设置此项,客户端发送 PASV 时服务器根本不返回端口,引发 425 Can't open data connection
# 编辑主配置文件
vim /etc/pure-ftpd/pure-ftpd.conf
# 添加或取消注释以下两行
PassivePortRange 45000 50000 # 推荐范围:45000‑50000
ForcePassiveIP your.server.ip # 替换为实际公网 IP
b) 必要的兼容性开关
# 在同一配置文件中加入:
BrokenClientsCompatibility yes # 对部分老旧 FTP 客户端兼容性提高
DontResolve yes # 禁止 DNS 反向解析。加快连接速度
VerboseLog yes # 开启详细日志,便于排查问题
MaxIdleTime 15 # 空闲超时时间,可自行调整
ChrootEveryone yes # 强制所有使用者进入 chroot 环境,提高安全性
五、防火墙与云安全组放行端口
a) 本地 iptables / firewalld 配置示例
# 放行 FTP 控制端口 21
firewall-cmd --permanent --add-service=ftp
# 放行被动数据端口段
firewall-cmd --permanent --add-port=45000-50000/tcp
# 重载防火墙规则
firewall-cmd --reload
b) 云主机安全组设置要点
- ECS 实例 → 网络与安全 → 安全组 → 入方向规则 → 添加 TCP 协议;端口范围填写 45000‑50000** 和 **21**。
-
CIDR 建议设为
0.0.0.0/0或根据业务需求限制 IP 段。 - 保存后确认状态为 “已生效”。
六、使用宝塔较快完成配置
a) 安装 Pure‑FTPd 插件:
- 登录宝塔 → 应用商店 → 搜索 “Pure‑FTPd” → 点击安装。
- 安装完成后在左侧菜单找到 “Pure‑FTPd 设置”。
b) 在面板中打开被动模式设置:
-
Select “设置” → 找到 “PassivePortRange”。填入
45000-50000. - Select “ForcePassiveIP”,填入服务器公网 IP. .
- SE 并重新启动按钮。
- PaaS 防火墙 → 放通相同端口段。 .
七、测试连接与排错技巧
a) 使用 FileZilla 验证
- *站点管理* → 新建站点 → 协议选择 *FTP - 文件传输协议*。
- *加密* 选 *仅使用明文 FTP*。
- *传输模式* 切换为 *被动*。
- *主机* 填写服务器 IP,*使用者名/密码* 填写上一步创建的虚拟使用者。
- /var/log/pureftpd.log 或 /var/log/messages .
b) 常见错误对应方法
| Pain Point | 可能原因 | 解决办法 |
|---|---|---|
| `425 Can't open data connection` | - 被动端口未放行 - 防火墙阻拦 - ForcePassiveIP 配置错误 | - 确认 PassivePortRange 已启用并放行 - 检查云安全组和本地防火墙规则 - 确保 ForcePassiveIP 为外网可达 IP |
| `530 Login auntication failed` | - MySQL 配置错误或密码错误 - PureDB 文件未更新 | - 检查 pureftpd-mysql.conf 中字段对应表名/列名是否匹配 - 执行 `pure-pw mkdb` 更新本地数据库 |
| `Directory listing failed` | - chroot 权限不足 - 使用者根目录权限错误 | - 确认使用者拥有根目录读写权限 - 若开启 ChrootEveryone,确保根目录下只有该使用者拥有访问权 |
| `Connection timed out` | - 防火墙只打开了 21 而未打开被动段 - NAT 路由未转发 PASV IP/端口 | - 同时放行 PassivePortRange 所在段 - 如在路由器后请做 DNAT 转发或使用 ForcePassiveIP 指定公网 IP |
| `Pure‑FTPd not starting` | - 配置文件语法错误 - 缺少必要依赖库 - 查看 `systemctl status pure-ftpd` 与日志;修正冲突项 - 确保 libssl、pam 等依赖已安装 |
八、完整流程回顾
-
下载 & 编译 pure‑ftpd;确认二进制已安装到
/usr/local/sbin/pure‑ftpd*. - Create 虚拟使用者,并生成对应数据库文件。
-
Edit
/etc/pure-ftpd/pure-ftpd.conf:
- `PassivePortRange 45000 50000`。
- `ForcePassiveIP your.public.ip`。老实说,
- `BrokenClientsCompatibility yes` 、`DontResolve yes` 等推荐项。
.
systemctl enable pure-ftpd && systemctl restart pure-ftpd.九、参考资源 & 常用命令速查表
-
pure-config.pl –list: 查看当前运行时参数。 -
pure-pw list: 列出所有 PureDB 虚拟使用者。不过, -
systemctl status pure-ftpd: 检查服务状态。 -
tail -f /var/log/pureftpd.log: 实时看日志,定位 PASV/EPRT 错误信息。li>官方文档:https://download.pureftpd.org/pub/pure-ft pd/doc/ li>宝塔社区讨论帖:Pure‑FTPd 被动模式配置详解。li>常见防火墙命令示例:
iptables -A INPUT -p tcp --dport 45000:50000 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
service iptables save
firewall-cmd --add-port=45000-50000/tcp --permanent
firewall-cmd --reload
code>
li>
li>如需更改监听地址,可在启动参数加入 -i your.ip.address。li>若使用 SELinux,需要添加策略: setsebool -P ftpd_full_access on
li>
li>祝您顺利实现 Pure‑FTPd 被动模式连通!
一、问题概述
在实际使用 Pure‑FTPd 时常见的阻碍点包括:
- 客户端只能使用主动模式,而在 NAT/防火墙环境下经常连接失败。按理说,
-
开启被动模式后出现
425 Can't open data connection导致目录读取失败文件上传/下载中断。 - Pure‑FTPd 默认不启用被动端口范围导致 PASV 命令没有返回可用端口。
- 防火墙或云安全组未放行被动端口,使得即使配置正确也仍然超时。
- MySQL 关联配置错误时虚拟使用者无法登录或权限异常。
二、准备工作
1. 环境要求
- Linux
- root 或 sudo 权限
- 已安装 gcc、make、libssl-dev、libpam0g-dev
2. 下载 Pure‑FTPd 源码
步骤 1:获取最新稳定版压缩包
wget https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.50.tar.gz
3. 解压与编译安装
步骤 2:解压源码
步骤 3:编译并安装
三、创建虚拟使用者
a) 本地 PureDB 使用者:
# 创建数据库文件
pure-pw mkdb /etc/pure-ftpd/pureftpd.pdb
# 添加使用者
pure-pw useradd ftpuser -u ftp -d /home/ftpusers/ftpuser
pure-pw mkdb /etc/pure-ftpd/pureftpd.pdb
b) MySQL 虚拟使用者
# 编辑 MySQL 配置文件
vim /etc/pure-ftpd/pureftpd-mysql.conf
# 示例内容
MYSQLServer 127.0.0.1
MYSQLPort 3306
MYSQLUser ftpmysql
MYSQLPassword yourpassword
MYSQLDatabase ftpmysql
# …其它查询语句,
# 去除 pure‑ftpd.conf 中对应行前的 #
四、主要:开启并配置被动模式支持
a) 指定被动端口范围
Pain Point:若未设置此项,客户端发送 PASV 时服务器根本不返回端口,引发 425 Can't open data connection
# 编辑主配置文件
vim /etc/pure-ftpd/pure-ftpd.conf
# 添加或取消注释以下两行
PassivePortRange 45000 50000 # 推荐范围:45000‑50000
ForcePassiveIP your.server.ip # 替换为实际公网 IP
b) 必要的兼容性开关
# 在同一配置文件中加入:
BrokenClientsCompatibility yes # 对部分老旧 FTP 客户端兼容性提高
DontResolve yes # 禁止 DNS 反向解析。加快连接速度
VerboseLog yes # 开启详细日志,便于排查问题
MaxIdleTime 15 # 空闲超时时间,可自行调整
ChrootEveryone yes # 强制所有使用者进入 chroot 环境,提高安全性
五、防火墙与云安全组放行端口
a) 本地 iptables / firewalld 配置示例
# 放行 FTP 控制端口 21
firewall-cmd --permanent --add-service=ftp
# 放行被动数据端口段
firewall-cmd --permanent --add-port=45000-50000/tcp
# 重载防火墙规则
firewall-cmd --reload
b) 云主机安全组设置要点
- ECS 实例 → 网络与安全 → 安全组 → 入方向规则 → 添加 TCP 协议;端口范围填写 45000‑50000** 和 **21**。
-
CIDR 建议设为
0.0.0.0/0或根据业务需求限制 IP 段。 - 保存后确认状态为 “已生效”。
六、使用宝塔较快完成配置
a) 安装 Pure‑FTPd 插件:
- 登录宝塔 → 应用商店 → 搜索 “Pure‑FTPd” → 点击安装。
- 安装完成后在左侧菜单找到 “Pure‑FTPd 设置”。
b) 在面板中打开被动模式设置:
-
Select “设置” → 找到 “PassivePortRange”。填入
45000-50000. - Select “ForcePassiveIP”,填入服务器公网 IP. .
- SE 并重新启动按钮。
- PaaS 防火墙 → 放通相同端口段。 .
七、测试连接与排错技巧
a) 使用 FileZilla 验证
- *站点管理* → 新建站点 → 协议选择 *FTP - 文件传输协议*。
- *加密* 选 *仅使用明文 FTP*。
- *传输模式* 切换为 *被动*。
- *主机* 填写服务器 IP,*使用者名/密码* 填写上一步创建的虚拟使用者。
- /var/log/pureftpd.log 或 /var/log/messages .
b) 常见错误对应方法
| Pain Point | 可能原因 | 解决办法 |
|---|---|---|
| `425 Can't open data connection` | - 被动端口未放行 - 防火墙阻拦 - ForcePassiveIP 配置错误 | - 确认 PassivePortRange 已启用并放行 - 检查云安全组和本地防火墙规则 - 确保 ForcePassiveIP 为外网可达 IP |
| `530 Login auntication failed` | - MySQL 配置错误或密码错误 - PureDB 文件未更新 | - 检查 pureftpd-mysql.conf 中字段对应表名/列名是否匹配 - 执行 `pure-pw mkdb` 更新本地数据库 |
| `Directory listing failed` | - chroot 权限不足 - 使用者根目录权限错误 | - 确认使用者拥有根目录读写权限 - 若开启 ChrootEveryone,确保根目录下只有该使用者拥有访问权 |
| `Connection timed out` | - 防火墙只打开了 21 而未打开被动段 - NAT 路由未转发 PASV IP/端口 | - 同时放行 PassivePortRange 所在段 - 如在路由器后请做 DNAT 转发或使用 ForcePassiveIP 指定公网 IP |
| `Pure‑FTPd not starting` | - 配置文件语法错误 - 缺少必要依赖库 - 查看 `systemctl status pure-ftpd` 与日志;修正冲突项 - 确保 libssl、pam 等依赖已安装 |
八、完整流程回顾
-
下载 & 编译 pure‑ftpd;确认二进制已安装到
/usr/local/sbin/pure‑ftpd*. - Create 虚拟使用者,并生成对应数据库文件。
-
Edit
/etc/pure-ftpd/pure-ftpd.conf:
- `PassivePortRange 45000 50000`。
- `ForcePassiveIP your.public.ip`。老实说,
- `BrokenClientsCompatibility yes` 、`DontResolve yes` 等推荐项。
.
systemctl enable pure-ftpd && systemctl restart pure-ftpd.九、参考资源 & 常用命令速查表
-
pure-config.pl –list: 查看当前运行时参数。 -
pure-pw list: 列出所有 PureDB 虚拟使用者。不过, -
systemctl status pure-ftpd: 检查服务状态。 -
tail -f /var/log/pureftpd.log: 实时看日志,定位 PASV/EPRT 错误信息。li>官方文档:https://download.pureftpd.org/pub/pure-ft pd/doc/ li>宝塔社区讨论帖:Pure‑FTPd 被动模式配置详解。li>常见防火墙命令示例:
iptables -A INPUT -p tcp --dport 45000:50000 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
service iptables save
firewall-cmd --add-port=45000-50000/tcp --permanent
firewall-cmd --reload
code>
li>
li>如需更改监听地址,可在启动参数加入 -i your.ip.address。li>若使用 SELinux,需要添加策略: setsebool -P ftpd_full_access on
li>
li>祝您顺利实现 Pure‑FTPd 被动模式连通!

