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 上啟用。