Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

3.5. 配置 FTP

FTP(檔案傳輸通訊協定,File Transport Protocol)是較老舊且複雜的多通訊埠通訊協定,對 Load Balancer 的環境來說,是項挑戰。要了解這項挑戰的本質,我們必須先了解 FTP 運作時的幾項關鍵要素。

3.5.1. FTP 如何運作

大部分伺服器與用戶端之間的關係,是用戶端機器會在特定連接埠上,開啟與伺服器之間的連線,然後伺服器會在該連接埠上回應用戶端。當 FTP 用戶端連上 FTP 伺服器時,會透過連接埠 21 開啟連線。然後「用戶端」會告訴 FTP 的「伺服器」端,要以「主動」(active)或「被動」(passive)方式來連接。此處用戶端選擇的連接方式會決定伺服器回應的方式、以及接下來要使用哪些連接埠。
兩種資料連線方式是:
主動連線
建立主動連線後,「伺服器」會開啟通往用戶端的資料連線,連接埠從 20 改為用戶端上的高端連接埠。所有來自伺服器的資料都會通過此連線傳遞。
被動連線
建立被動連線後,「用戶端」會要求 FTP 伺服器建立一個被動連線通訊埠,這可以是 10,000 以上的任何連接埠。伺服器接下來會綁定這個高端連接埠給這個特定的 session 使用,並將這連接埠號傳回給用戶端。然後用戶端會開啟新的綁定連接埠用以傳遞資料。用戶端要求的每個資料都會開啟新的資料連線。現今從伺服器要求資料時,FTP 用戶端多半採取被動連線。

注意

用戶端」— 而非伺服器端 — 會決定連線類型。這表示要有效地將 FTP 叢集化,您必須配置 LVS 路由器處理主動與被動連線。
FTP 這種用戶端與伺服器之間的關係可能會開啟大量 Keepalived 所不知道的連接埠。

3.5.2. 對 Load Balancer 路由的影響

IPVS 封包轉送只會根據能辨識的連接埠號或防火牆標記,允許連線進出叢集。如果叢集外的用戶端試圖開啟 IPVS 並未配置的連接埠,IPVS 就會中斷此連線。同樣地,如果真實伺服器試著開啟 IPVS 所不知道的連線,向外連至網際網路,IPVS 也會中斷此連線。這表示「所有」來自網際網路的 FTP 連線都「必須」擁有同樣的防火牆標記,同時所有來自 FTP 伺服器的連線都「必須」使用網路封包篩選規則,適當地轉送到網際網路上。

注意

要啟用被動 FTP 連線,請確定您已經載入了 ip_vs_ftp kernel 模組,方法是在命令列中以 root 身份執行 modprobe ip_vs_ftp

3.5.3. 建立網路封包篩選規則

在為 FTP 指定任何 iptables 規則之前,請查閱〈節 3.4.1, “指定防火牆標記”〉中關於多連接埠服務、以及檢查現有網路封包篩選規則的技巧。
以下為會將防火牆標記 21 指定至 FTP 流量的規則。

3.5.3.1. 主動連線的規則

主動連線的規則會通知 kernel 接受來自「內部」浮動 IP 位址的 20 號連接埠(FTP 資料埠)的連線,並加以轉送。
以下 iptables 指令能允許 LVS 路由器接受來自真實伺服器、且 IPVS 所不知道的向外連線:
/usr/sbin/iptables -t nat -A POSTROUTING -p tcp -s n.n.n.0/24 --sport 20 -j MASQUERADE
iptables 指令中,請以定義於 keepalived.conf 檔案的 virtual_server 部分中的 NAT 介面卡之內部網路介面卡的浮動 IP 前三碼來替換 n.n.n

3.5.3.2. 被動連線的規則

被動連線的規則會指定正確的防火牆標記給來自網際網路、連往服務的浮動 IP 之連線到高端連接埠 — 10,000 到 20,000 之間。

警告

如果您想限制被動連線的連接埠範圍,就必須配置 VSFTP 伺服器使用相對應的範圍。這可以透過加入以下幾行到 /etc/vsftpd.conf 檔案中來達成:
pasv_min_port=10000
pasv_max_port=20000
請勿設定 pasv_address 來覆寫真實 FTP 伺服器位址,因為這會由 LVS 更新為虛擬 IP 位址。
欲知如何配置其它 FTP 伺服器,請查閱該產品的文件。
這範圍應該適用大部分情況,然而,您可以擴大這範圍,納入所有可用的非安全性連接埠,方法是將下述指令的 10000:20000 改為 1024:65535
以下 iptables 指令可以指定任何送往浮動 IP、且擁有防火牆標記 21 的網路流量,接下來會由 IPVS 辨識、轉送。
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 --dport 21 -j MARK --set-mark 21
/usr/sbin/iptables -t mangle -A PREROUTING -p tcp -d n.n.n.n/32 --dport 10000:20000 -j MARK --set-mark 21
iptables 指令中,n.n.n.n 應替換為 keepalived.conf 檔案的 virutal_server 部分中所定義的 FTP 虛擬伺服器浮動 IP。

警告

以上指令會即刻生效,不過將無法在系統重新開機時維持永續性。
最後,您將需要確保正確的服務將在正確的 runlevel 上啟用。