能否通过NGINX将FTP请求转发至其他IP实现文件上传?
可行性结论
该需求完全可以实现,但注意不能用NGINX默认的HTTP七层代理逻辑配置,需要通过stream四层代理模块实现,同时适配FTP协议的双连接特性。
前置准备
- 检查VM1上的NGINX是否已包含stream模块:执行
nginx -V 2>&1 | grep stream,输出带--with-stream参数即为支持,否则需要重新编译NGINX添加该模块,或安装带stream模块的NGINX发行包。 - 调整VM2上的FTP服务配置(以常用的vsftpd为例):
- 固定被动模式端口范围,例如设置
pasv_min_port=50000、pasv_max_port=50100 - 将被动模式通告IP改为VM1的地址:
pasv_address=192.168.1.10 - 保存配置后重启FTP服务生效
- 固定被动模式端口范围,例如设置
- 放开VM1本地防火墙的21端口、50000-50100端口段的入站规则。
可用配置参考
注意stream配置块属于NGINX顶层配置,和http{}块平级,不要写入http块内部:
stream { upstream ftp_server { server 192.168.1.11:21 fail_timeout=0; } # 转发FTP控制连接 server { listen 21; proxy_pass ftp_server; proxy_connect_timeout 5s; proxy_timeout 300s; } # 转发固定范围的被动模式数据连接 server { listen 50000-50100; proxy_pass 192.168.1.11:50000-50100; } }
配置生效与验证
- 将上述配置写入NGINX配置文件(可以单独写在
/etc/nginx/stream-conf.d/目录下的.conf文件,只要主配置包含该目录加载规则即可) - 执行
nginx -t检查配置语法,确认无报错后执行nginx -s reload重载配置 - 直接通过FTP客户端连接
192.168.1.10:21,即可正常完成认证、文件上传操作,流量会全部经过VM1转发到后端VM2的FTP服务。
补充说明
- 如果你使用的是商业版NGINX Plus,自带FTP协议感知的动态代理能力,不需要手动固定被动端口范围,模块会自动解析控制连接里的端口协商信息,动态转发数据端口流量,配置更简单。
- 不要尝试在HTTP server块里配置FTP代理,HTTP和FTP是完全不同的应用层协议,七层HTTP代理无法处理FTP的握手、认证、传输逻辑。
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

