我试图通过HaProxy引导FTP流量到IIS服务器。我也试图设置一个FileZilla FTP服务器,但问题类似-被动模式不能工作。
这是我的haproxy.cfg
listen FTP
mode tcp
bind <HAPROXY_SERVER_IP>:21 transparent
bind <HAPROXY_SERVER_IP>:50000-55000 transparent
server ftp01 <IIS_FTP_SERVER_IP>IIS上的被动端口配置:

我看过一个类似的问题-- ftp连接槽 --但是这个提议的答案(基于这篇博客文章)对我不起作用。FTP登录工作,但目录列表命令(ls)错误:
425 Cannot open data connection.我还查看了这个要旨,同时寻找将客户端IP转发到FTP服务器的选项。由于FTP连接是基于TCP的,所以我不能使用(1) X-Forwarded-For HTTP头.AFAIK、FileZilla和IIS服务不支持(2) proxyprotocol。这只剩下备选案文(3):
source 0.0.0.0 usesrc clientip看上去像配置相当复杂!
我在这里错过了什么?当然,这不是一项困难的任务!
OS:Ubuntu 20.04.4 LTS
HaProxy版本:HAProxy version 2.4.14-1ppa1~focal 2022/02/25
操作系统: Windows 2019
IIS版本:10.0.17763.1
VM连接到同一个本地网络。
我包括失败会话的客户端和服务器日志
# Note: h1, h2, h3, h4 make up the <IIS_FTP_SERVER_IP>
ftp -p <HAPROXY_SERVER_IP>
Connected to <HAPROXY_SERVER_IP>.
220 Microsoft FTP Service
Name (<HAPROXY_SERVER_IP>:<LOCAL_PC_USERNAME>): <FTP_USERNAME>
331 Password required
Password:
230 User logged in.
Remote system type is Windows_NT.
ftp> ls
227 Entering Passive Mode (h1,h2,h3,h4,195,80).
150 Opening ASCII mode data connection.
425 Cannot open data connection.
ftp> bye
221 Goodbye.#Software: Microsoft Internet Information Services 10.0
#Version: 1.0
#Date: 2022-07-12 23:01:15
#Fields: date time c-ip cs-username s-ip s-port cs-method cs-uri-stem sc-status sc-win32-status sc-substatus x-session x-fullpath
2022-07-12 23:01:15 <HAPROXY_SERVER_IP> - <IIS_FTP_SERVER_IP> 21 ControlChannelOpened - - 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:01:29 <HAPROXY_SERVER_IP> - <IIS_FTP_SERVER_IP> 21 USER <FTP_USERNAME> 331 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:01:52 <HAPROXY_SERVER_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 21 PASS *** 230 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 /
2022-07-12 23:01:52 <HAPROXY_SERVER_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 21 SYST - 215 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:01:54 <HAPROXY_SERVER_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 21 PASV - 227 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:01:54 <FTP_CLIENT_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 50000 DataChannelOpened - - 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:01:54 <FTP_CLIENT_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 50000 DataChannelClosed - - 1236 38 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:01:54 <HAPROXY_SERVER_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 21 LIST - 425 1236 38 a46aa445-e3be-46ba-9da2-3f5520e3c419 /
2022-07-12 23:02:06 <HAPROXY_SERVER_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 21 QUIT - 221 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -
2022-07-12 23:02:06 <HAPROXY_SERVER_IP> <IIS_SERVER_MACHINE_NAME>\<FTP_USERNAME> <IIS_FTP_SERVER_IP> 21 ControlChannelClosed - - 0 0 a46aa445-e3be-46ba-9da2-3f5520e3c419 -发布于 2022-07-12 12:55:54
FTP是一个糟糕的协议,需要两个连接:
当FTP客户端请求与PASV控制字的被动ftp连接时,FTP服务器选择一个“随机可用的临时端口”,即非默认端口,并宣布该端口具有端口响应。
PORT响应通常包含6个八进制,例如PORT h1,h2,h3,h4,p1,p2,其中h1.h2.h3.h4是服务器的IPv4 IP地址,TCP端口号为(p1*256) + p2,即xxx,x,xxx,xxx,196,107表示端口(196 * 256) + 107 = 50283。
为了更好地处理防火墙,而不是允许FTP服务器为数据连接选择任何“随机可用的临时”端口,管理员通常会建立一个固定的端口范围。
看起来您确实修复了该端口范围,但是您是否也打开了所需的防火墙端口?
现在第二件事是PORT响应包含服务器的IP地址。您需要确保FTP客户端在那里接收他们连接到的HAProxy服务器的IP地址,而不是IIS服务器的IP地址。
屏幕截图显示IIS提供了这样一个选项,“防火墙的外部IP地址”允许管理员调整端口响应中将要使用的IP地址。而不是绑定到服务器的实际IP地址,而将在PORT响应中使用自定义IP地址。这通常是由端口转发引起的问题的解决方案,因此也是名称,但也是您的HAProxy的解决方案。
或者,执行端口转发的设备(在本例中为HAProxy)将需要用自己的端口响应重写端口响应中的IP地址。
AFAIK HAProxy并没有为您提供一种标准的方法。
检查: FTP客户端接收的端口响应是什么?
https://serverfault.com/questions/1105383
复制相似问题