Loading... 下面给出 **Debian 11 / Ubuntu 24.04 / Armbian 24** 使用 `apt install pure-ftpd` 后,开启 被动模式 的**标准做法**,覆盖安装、配置、放行端口、NAT 与验证,所有命令均附详细解释 ✅ --- ## 一、原理速读(为什么常常“连上能登录但列不了目录”?)🧠 * FTP 有主动(PORT)与 被动(PASV) 两种数据通道建立方式。 * 被动模式下:**客户端**向服务端开放的**高位端口**发起数据连接;因此必须: 1. 在 pure-ftpd 指定固定的 被动端口段; 2. 告诉客户端一个**能在公网访问**的 IP/域名; 3. 在 防火墙/NAT 上放行并正确转发这些端口。 ```mermaid sequenceDiagram Client->>Server: 连接 21 (控制通道) Client->>Server: PASV Server-->>Client: 227 Entering Passive Mode (公网IP, 高位端口) Client->>Server: 连接 “高位端口”(数据通道) Server-->>Client: 目录列表/文件数据 ``` --- ## 二、安装(3 发行版通用) ```bash sudo apt update && sudo apt install -y pure-ftpd ``` **解释**:安装纯净 FTP 服务(standalone)。`pure-ftpd` 默认读取 `/etc/pure-ftpd/conf/` 下的“单配置项文件”,由 systemd 启动。 --- ## 三、开启 被动模式 的三件套(**必须全部完成**) ### 1)指定被动端口段(例:30000–31000) ```bash echo "30000 31000" | sudo tee /etc/pure-ftpd/conf/PassivePortRange ``` **解释**:Debian/Ubuntu/Armbian 的打包约定是“**文件名=配置项**,文件内容=参数值”。这里创建 `PassivePortRange` 并写入起止端口。选择一段**未被占用且足够宽**的高位端口。 ### 2)声明向客户端汇报的公网地址(NAT/云主机必设) ```bash # 推荐:用固定公网IP;也可用能被解析的域名(pure-ftpd 启动时解析) echo "203.0.113.10" | sudo tee /etc/pure-ftpd/conf/ForcePassiveIP # 或者 # echo "ftp.example.com" | sudo tee /etc/pure-ftpd/conf/ForcePassiveIP ``` **解释**:当服务器位于 NAT/云平台后面时,服务端若把**内网IP**回给客户端,就会导致数据通道连不通。`ForcePassiveIP` 强制回报 公网IP/域名,彻底解决 “227 返回内网地址” 的经典故障。 ### 3)(可选但强烈建议)最小 UID 与目录隔离 ```bash echo "1000" | sudo tee /etc/pure-ftpd/conf/MinUID echo "yes" | sudo tee /etc/pure-ftpd/conf/ChrootEveryone ``` **解释**: * `MinUID`:限制只有 UID≥1000 的用户才能登录,避免系统账号被用作 FTP。 * `ChrootEveryone`:所有用户被 chroot 到自己的家目录,提升隔离与安全。 --- ## 四、开放防火墙 / 安全组 / NAT 转发(**与端口段一致**) ### UFW(Ubuntu/Armbian 常见) ```bash sudo ufw allow 21/tcp sudo ufw allow 30000:31000/tcp sudo ufw reload ``` **解释**:放行 FTP 控制端口 21 与 被动端口段。 ### nftables(Debian 11 常见默认) ```bash # 最简示例:直接接受入站 21 与 30000-31000 sudo nft add rule inet filter input tcp dport 21 accept sudo nft add rule inet filter input tcp dport 30000-31000 accept sudo nft list ruleset | sed -n '1,120p' ``` **解释**:向 `inet filter input` 链添加放行规则;最后一行用于**查看**规则是否生效。 ### 物理路由/NAT(家庭/机房/云厂商) * 在网关上做 端口转发:将 **21** 和 **30000–31000** 的 TCP 转发到 FTP 服务器的内网 IP。 * 云主机需同步放行**安全组**规则(入站 TCP 21 与端口段)。 --- ## 五、重启并设置开机自启 ```bash # 服务名通常为 pure-ftpd;若安装了带后端(如 mysql/ldap)的包,请以实际服务名为准 systemctl daemon-reload sudo systemctl enable --now pure-ftpd systemctl status pure-ftpd --no-pager ``` **解释**:启用并立即启动服务;用 `status` 确认没有报错(端口占用、配置文件名/内容拼写等)。 --- ## 六、连接验证(客户端必须使用 PASV) ### lftp(推荐,调试信息充分) ```bash lftp -u test,pass -e "set ftp:passive-mode true; set net:timeout 8; debug 3; ls; bye" ftp://203.0.113.10 ``` **解释**: * `set ftp:passive-mode true` 强制被动模式; * `debug 3` 打印 227 响应,确认服务端回报的是**公网 IP 与被动端口**; * `ls` 若能列目录,说明数据通道正常。 ### curl(更轻量) ```bash curl -v --ftp-pasv ftp://test:pass@203.0.113.10/ ``` **解释**:`--ftp-pasv` 指定被动模式;`-v` 输出握手详情,便于排错。 --- ## 七、常见问题自查表 🔍 | 症状 | 可能原因 | 处理要点 | | ------------------------ | ------------------------------- | ----------------------------------------------------------- | | 登录成功但列目录卡住 | 没放行 被动端口段 或 NAT 未转发 | 开放/转发 `30000–31000`,与 `PassivePortRange`严格一致 | | 227 返回内网 192.168.x.x | 未设置 ForcePassiveIP | 写入公网 IP/可解析域名,重启服务 | | 内网能用、公网不通 | 云安全组未放行 | 放行 21 与被动端口段 TCP | | 偶发失败 | 端口段太窄 | 适当增大端口段(如 30000–31050) | | 权限/越界访问 | 未 chroot 或 UID 太小 | 开启 ChrootEveryone,设置 MinUID | --- ## 八、关键配置对照(vditor/Markdown 支持) | 配置文件(/etc/pure-ftpd/conf/) | 示例内容 | 作用 | | -------------------------------- | -------------------------------------- | ------------------------------------- | | PassivePortRange | `30000 31000` | 定义被动端口段(TCP 入站需放行/转发) | | ForcePassiveIP | `203.0.113.10`或 `ftp.example.com` | 指定回报给客户端的公网地址/域名 | | MinUID | `1000` | 限制可登录的本地用户 UID 下限 | | ChrootEveryone | `yes` | 用户被限制在其家目录,提高安全 | --- ## 九、被动模式落地流程(工作流程图) ```mermaid flowchart LR A[安装 pure-ftpd] --> B[写 PassivePortRange] B --> C[写 ForcePassiveIP] C --> D[开放防火墙/云安全组] D --> E[NAT/路由做端口转发] E --> F[systemctl enable --now pure-ftpd] F --> G[lftp/curl 验证 PASV] G --> H{能列目录?} H -- 否 --> I[检查 227 是否公网IP/端口段是否放行] H -- 是 --> J[上线/交付] ``` --- ## 十、(可选)加密传输提示 🔐 ```bash # 生成一张一年期自签证书(示例路径) sudo mkdir -p /etc/ssl/private sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/pure-ftpd.pem \ -out /etc/ssl/private/pure-ftpd.pem sudo chmod 600 /etc/ssl/private/pure-ftpd.pem echo "1" | sudo tee /etc/pure-ftpd/conf/TLS sudo systemctl restart pure-ftpd ``` **解释**: * 合并私钥与证书到 `pure-ftpd.pem`(pure-ftpd 的默认读取方式); * `TLS` 文件写入 `1` 表示**允许**加密会话(客户端可协商启用);若你希望更严格,可在确认客户端均支持后再提高要求。 * 加密不影响 被动模式 的端口与 NAT 逻辑。 --- ### 结论 被动模式要点就是**三件套**:端口段、公网地址/域名、防火墙/NAT 一致放行。按本文逐步执行并用 `lftp`/`curl` 验证,Debian 11、Ubuntu 24.04 与 Armbian 24 均可一次通过。若你提供公网 IP、端口段与是否在云上,我可以帮你输出**专属命令清单**,避免环境差异踩坑。 最后修改:2025 年 09 月 13 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏