HAproxy中FTP连接异常咨询:首次使用需修改客户机配置吗?
搞定HAproxy转发FTP连接的问题
嘿,刚看到你的问题,作为折腾过不少HAproxy和FTP部署的老玩家,我一眼就瞅出核心问题——你当前的HAproxy默认配置是mode http,而FTP是基于TCP协议的应用,HTTP模式根本没法正确处理FTP的控制连接和数据连接!下面一步步帮你解决:
1. 给HAproxy加专门的FTP转发规则
你需要在HAproxy配置里新增一套针对FTP的frontend和backend,必须用mode tcp模式,还要考虑FTP的主动/被动模式特性:
示例配置片段(直接加到你的现有配置里就行):
# 监听FTP控制连接(默认端口21) frontend ftp_control bind *:21 mode tcp option tcplog default_backend ftp_servers # 后端FTP服务器组,替换成你的pure-ftpd服务器IP backend ftp_servers mode tcp balance roundrobin # 负载均衡策略,按需调整,比如用source绑定固定客户端到固定服务器 server ftp_node1 192.168.1.10:21 check # 第一个pure-ftpd服务器 server ftp_node2 192.168.1.11:21 check # 第二个,有多台就继续加 # 关键!处理FTP被动模式的数据连接端口 frontend ftp_passive_data bind *:30000-30100 # 这个端口范围要和后面pure-ftpd的配置完全一致 mode tcp option tcplog default_backend ftp_servers
为什么要这么配?因为FTP有两个连接:
- 控制连接:用端口21,负责发送命令(比如登录、列出文件)
- 数据连接:主动模式下由服务器发起,被动模式下由客户端发起,所以必须把被动端口范围也交给HAproxy转发,不然客户端连不上数据通道。
另外别忘了给HAproxy所在服务器的防火墙开放21端口和30000-30100这个范围!
2. 调整pure-ftpd的配置,固定被动端口
默认pure-ftpd会用随机被动端口,HAproxy没法提前转发这些随机端口,所以得让它用固定范围:
操作步骤:
- 找到pure-ftpd的配置文件,通常在
/etc/pure-ftpd.conf或者/etc/pure-ftpd/pure-ftpd.conf - 修改或添加这两行:
PassivePortRange 30000 30100 # 和HAproxy里的被动端口范围完全匹配 ForcePassiveIP 你的HAproxy公网IP # 让pure-ftpd告诉客户端去连HAproxy的IP,而不是服务器自己的内网IP
- 重启pure-ftpd服务:
systemctl restart pure-ftpd
3. 验证配置是否生效
- 先重启HAproxy:
systemctl restart haproxy - 在客户端用FTP工具(比如FileZilla或者命令行
ftp)测试连接,分别试试主动和被动模式,看能不能正常列出文件、上传下载。
踩坑排查点
如果还是不行,先查这些:
- 看HAproxy日志(默认在
/var/log/haproxy.log),有没有FTP连接的报错信息 - 确认pure-ftpd服务器的防火墙也开放了21和30000-30100端口
- 如果你用的是云服务器,还要检查云服务商的安全组有没有开放这些端口
内容的提问来源于stack exchange,提问作者KızlarGelsin
相关产品推荐
相关产品推荐

