vsftpd@ftp主动 vs 被动模式

FTP 的 主动模式(Active Mode)被动模式(Passive Mode) 在容器环境中配置略有不同,尤其是端口暴露策略。


1.主动模式 FTP 简要说明

主动模式 下:

  • 客户端连接服务器的端口 21(控制连接)
  • 服务器再反向连接客户端的 20 端口(数据连接)
1
2
客户端 → 服务器:21  # 控制连接
服务器 → 客户端:20 # 数据连接(主动发起)

2.主动模式的问题(特别是在容器或 NAT 环境)

主动模式对 客户端的网络开放性 要求高:

  • 客户端必须 监听自己的高位端口
  • 服务器必须能访问 客户端的开放端口
  • NAT、防火墙、容器网络常会阻止服务器回连客户端

💡 结论:主动模式在 Docker 容器中通常不推荐用(客户端容易连接失败)


3.在 Docker 中启用主动模式

虽然 被动模式更推荐,但你仍可配置主动模式:

3.1. 显式设置 FTP 模式为主动(client 端)

  • 客户端必须手动设置为主动模式:
1
ftp -A ftp.example.com

或在 lftp 中:

1
lftp -e "set ftp:passive-mode no" -u user,pass ftp://host

3.2. Docker 容器端的配置并不需要额外设置主动模式

主动模式对服务器端来说,其实就是:

  • 监听 21 端口
  • 在数据连接时用本地端口 20 发起连接到客户端

服务器默认即支持主动模式,你无需特别开启。但你的容器网络需要满足以下条件:


4.确保容器网络支持主动模式

方法一:使用 --network host(避免 NAT 问题)

1
docker run --network host ...

但这种方法 只适用于 Linux 主机(非 Windows/macOS),因为只有 Linux 支持 Host 模式。

方法二:调整客户端网络策略

你可以使用 FTP 客户端(如 FileZilla、lftp)强制启用主动模式,并开启客户端的 NAT/端口转发配置。


5.改用被动模式

大多数现代 FTP 服务在容器中推荐使用 被动模式,只需服务器端明确开放数据端口(如 30000-30009),客户端无需对外监听端口,成功率高。

示例:

1
2
3
4
5
6
docker run -d \
-p 21:21 \
-p 30000-30009:30000-30009 \
-e FTP_PASSIVE_PORTS=30000:30009 \
-e PUBLICHOST=你的IP \
stilliard/pure-ftpd:hardened

6.总结

模式 优点 缺点
主动模式 服务端实现简单 客户端需暴露端口,防火墙容易拦截
被动模式 客户端兼容性强,容器友好 服务端需显式开放被动端口范围