Iis

如何將流量從 HaProxy 轉發到 IIS FTP 伺服器?

  • July 12, 2022

我正在嘗試通過 HaProxy 將 FTP 流量引導到 IIS FTP 伺服器。我也嘗試過設置 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 connexion trough haproxy - 但是建議的答案(基於this blog post)對我不起作用。FTP 登錄有效,但目錄列表命令 ( ls) 錯誤:

425 Cannot open data connection.

在尋找將客戶端 IP 轉發到 FTP 伺服器的選項時,我還查看了這個要點。由於 FTP 連接是基於 TCP 的,我不能使用**(1)** X-Forwarded-For HTTP 標頭。AFAIK、FileZilla 和 IIS FTP 服務不支持**(2)代理協議。這只留下選項(3)**:

source 0.0.0.0 usesrc clientip

配置起來看起來很複雜


我在這裡想念什麼?當然,這不是一項艱鉅的任務!


我的系統

HaProxy 虛擬機

作業系統:Ubuntu 20.04.4 LTS

HaProxy 版本:HAProxy version 2.4.14-1ppa1~focal 2022/02/25

FTP 伺服器虛擬機

作業系統:Windows Server 2019

IIS 版本:10.0.17763.1

虛擬機連接到同一個本地網路。

更新

我包括失敗的會話的客戶端和伺服器日誌

客戶

# 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.

IIS FTP 伺服器

#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 -

FTP 是一個蹩腳的協議,需要兩個連接:

  1. 對於最初是一個連接的被動 FTP,控制連接。該連接由客戶端建立,通常連接到預設埠 TCP 21。
  2. 要實際傳輸數據(獲取目錄列表是數據傳輸),客戶端需要建立第二個 TCP 連接,即數據連接。

當 FTP 客戶端使用PASV控製字請求被動 ftp 連接時,FTP 伺服器選擇一個“隨機可用的臨時”非預設埠,並使用 PORT 響應宣布該埠。

PORT響應通常包含 6 個八位字節,例如伺服器的 IPv4 IP 地址和 TCP 埠號在PORT h1,h2,h3,h4,p1,p2哪裡,即表示埠h1.h2.h3.h4``(p1*256) + p2``xxx,x,xxx,xxx,196,107``(196 * 256) + 107 = 50283

為了更好地使用防火牆,管理員通常會建立一個固定的埠範圍,而不是只允許 FTP 伺服器選擇任何“隨機可用的臨時”埠進行數據連接。

看起來您確實修復了該埠範圍,但您是否還打開了所需的防火牆埠?

現在第二件事是PORT響應包含伺服器的 IP 地址。您需要確保 FTP 客戶端在那裡接收到他們正在連接的 HAProxy 伺服器的 IP 地址,而不是 IIS 伺服器的 IP 地址。

您的螢幕截圖顯示 IIS 提供了這樣一個選項,“防火牆的外部 IP 地址”允許管理員調整將在 PORT 響應中使用的 IP 地址。而不是綁定到伺服器的實際 IP 地址,將在PORT響應中使用自定義 IP 地址。這通常是由埠轉發引起的問題的解決方案,因此得名,但這也是您的 HAProxy 的解決方案。

或者,進行埠轉發的設備(在本例中為 HAProxy)將需要用自己的 PORT 響應重寫 IP 地址。

AFAIK HAProxy 不提供為您執行此操作的標準方法。

檢查:您的 FTP 客戶端收到的 PORT 響應是什麼?

引用自:https://serverfault.com/questions/1105383