徒手打造pfSense負載平衡器
丁光立
目前光纖線路因價格下降已慢慢地被市場接受,但配置固定IP的光纖線路單價仍高,一般中小型企業較難負荷,因此負載平衡仍廣泛運用在各種網路架構上。但大多數的負載平衡設備價格昂貴,並且提供許多一般企業不會用到的功能。Linux或FreeBSD雖可以實作出負載平衡功能,但在維護及設定上較為困難。其實,利用pfSense這一款免費好用的負載平衡器就可解決以上所有的難題。
本文將使用擴充性強大且易於操作及設定的開源防火牆軟體pfSense,把速度慢但有配置固定IP以及速度快但僅提供PPPoE固定IP的兩條線路加以整合,實作出內網對外網及外網對內網的負載平衡功能。
安裝環境及測試架構pfSense的安裝相當簡單,只須連至pfSense的官方網站(
http://www.pfsense.org/)下載其ISO檔後,將之燒錄至光碟。再找一台電腦,使用該光碟開機,便會自動開始其安裝流程。筆者使用的版本為pfSense-2.0.1-RELEASE-i386.iso.gz,讀者可依自己的需求,選擇合適的版本。在安裝時有兩個事項必須注意: 1. 建議安裝至硬碟或記憶卡以便日後管理。
2. 在設定網路時無須設定VLAN(可依本身需求進行調整)。
設定完成後,記得輸入99 (Install pfSense to a hard drive, etc.),將pfSense裝進硬碟或記憶卡。pfSense在2.0之後的版本,對於負載平衡功能的支援更為強大,這也是筆者特別撰文介紹的原因之一。
除了主機板內建的網路卡(sis0)外,筆者新增了兩張網路卡(re0和re1)。sis0是用來連接內網的部分,re0則連接低速但配有固定IP的512K/64K線路,而re1連接的是使用PPPoE方式取得固定IP,速率為12M/3M的線路。
而在測試架構的部分,筆者在內網架設一台IP為192.168.1.101的FTP伺服器(Server)。希望外部的訪客在連線至內部的FTP Server時可以做到負載平衡的效果。
前置作業pfSense在2.0之後對於負載平衡提供了較完善的功能,但要實現外網至內網的負載平衡,除了pfSense本身提供的功能外,還需要在DNS上動手腳。因此先至Domain Name的註冊網頁進行相關設定,如圖1所示。
 |
▲圖1 網域名稱設定。 |
筆者將之前註冊的Domain Name名稱「honeypot.idv.tw」,設定為自行DNS代管模式(在此以Seednet為例進行操作),將低速線路的固定IP「203.70.181.248」對應到dns1.honeypot.idv.tw,並將PPPoE取得的固定IP「123.204.45.73」對應到dns2.honeypot.idv.tw。在之後的章節,會將203.70.181.248設定在pfSense的WAN介面,123.204.45.73設定在OPT1(可以想像為第二個WAN)的介面上。
以上的設定方式是假設讀者的內網有兩種以上的伺服器,因此需要自己架設DNS伺服器。假如讀者只有一種伺服器(如Web Server)提供對外服務並且是使用某些DNS業者的服務(如TWNIC),若指定為DNS代管模式,並設定兩筆名稱相同的A記錄,這些業者就能提供外網對內網查詢時的負載平衡服務。
舉例而言,第一次查詢web.honeypot.idv.tw的IP時,會得到203.70.181.248的結果,在第二次查詢web.honeypot.idv.tw的IP,則會顯示123.204.45.73。這樣就能輕易地達到外對內負載平衡的效果。
為便於讀者理解設定流程,以下繪製了內網對外網負載平衡設定流程圖,如圖2所示:
 |
▲圖2 內網對外網負載平衡設定流程圖。 |
設定主要介面IP及Gateway
pfSense預設的LAN IP為192.168.1.1,在此不做調整,請依自己的環境進行配置。首先,示範如何設定WAN介面及路由(Gateway)、DNS Server,讓內網的電腦能夠透過pfSense連出Internet,之後再介紹OPT1介面的設定。首先設定WAN介面,先點選Interfaces,再點選WAN,如圖3所示。
 |
▲圖3 設定WAN介面。 |
接著,更改「Type」欄位為Static,並於「IP address」填入對應的IP設定203.70.181.248,並選擇適當的遮罩/24(此步驟常被忽略),之後點選「Gateway」後方的「add a new one」,如圖4所示。
 |
▲圖4 設定WAN IP及遮罩。 |
在此要輸入WAN IP的Gateway,因此輸入203.70.181.1,如圖5所示。
 |
▲圖5 設定Gateway IP。 |
設定DNS Server接著便可以設定DNS Server,如圖6所示。首先先點選System,再點選General Setup,然後將DNS Servers的IP資訊填入。
 |
▲圖6 設定DNS Server。 |
設定第二組介面至此,pfSense已經可以做為防火牆使用了。然後新增及設定OPT1介面。先點選「Interfaces」,再點選(assign),如圖7所示。隨後,並點選右下角的+號圖示(圖8)。
 |
▲圖7 指定OPT介面。 |
 |
▲圖8 新增一個介面。 |
接著,系統會自動出現OPT1的介面,這時只須選擇適當的網卡即可,本例選擇re1,並按下〔Save〕,如圖9所示。
 |
▲圖9 設定OPT1介面。 |
再次點選Interfaces,而後點選OPT1,並輸入PPPoE相關設定,如圖10所示。OPT1預設並沒有Enable,記得勾選Enable Interface,之後才能做相關設定。這裡將Type指定成PPPoE,並在Username和Password欄位內輸入對應的帳號及密碼。
 |
▲圖10 OPT1相關設定。 |
以Seednet作為例子,PPPoE若想要取得固定IP,必須在Username最後面加一個#號;假若是Hinet,那麼就必須在@後面加一個IP,例如
12345678@ip.hinet.net。 設定Routing Group
接下來,更改Routing Group的設定,先選擇System中的Routing。開啟後,再選擇Groups。並點選右上角的+號圖示,新增一筆設定(圖11)。
 |
▲圖11 設定Routing Groups。 |
此處設定的重點是WANGW及GW_OPT1必須選擇同一Group,例如Tier 1。如圖12所示,將此Group命名為Outgoing,在後續設定rules時須指定使用此Group。
 |
▲圖12 Gateway Priority設定。 |
設定Firewall Rule然後,設定對外的Firewall Rule。先點選Firewall中的Rules,再點選LAN,之後點選右上角的+號圖示,如圖13所示。
 |
▲圖13 設定Firewall Rules。 |
接著會產生一條新增的rule,必須修改Gateway的設定。將頁面拉到最下方時,可以看到Gateway的選項,按下〔Advanced〕按鈕,在下拉式選單中可以看到先前設定的Gateway Group選項【Outgoing】,將其點選,如圖14所示。
 |
▲圖14 Rules的Gateway設定。 |
完成以上的設定後,可以做一個簡單的測試,依序使用IE和Firefox開啟,能夠顯示目前所使用Public IP的網頁,例如「
http://checkrealip.com/」,從圖15中可以看出,兩次測試時的Public IP是不同的。
 |
▲圖15 對外Public IP的測試。 |
在完成本階段的設定後,最基本的負載平衡設定「內網至外網」已經設定完成。下一階段,將繼續完成外網至內網的負載平衡設定。
同樣地,這裡以一個簡單的流程圖來說明如何完成外網對內網的負載平衡設定,如圖16所示。
 |
▲圖16 外網對內網負戴平衡設定流程圖。 |
安裝及設定DNS Server在前置作業中曾經提到,要實現外網對內網的負載平衡,須仰賴DNS Server的輔助,在此示範如何在pfSense內安裝DNS Server並進行相關設定。
首先要安裝對應的Packages。點選System,並點選Packages,接著找到dns-server,再點選最後面的+號圖示,如圖17所示。
 |
▲圖17 安裝DNS Server。 |
安裝完成後,點選Services中的DNS Server進行相關設定,如圖18所示。
 |
▲圖18 設定DNS Server。 |
在IP Address欄位內輸入127.0.0.1。接著,在Interface to listen欄位中選擇WAN及OPT1,如圖19所示。
 |
▲圖19 設定DNS Server的IP及介面。 |
然後,選擇上方選單的New domain wizard來協助進行剩餘的設定。在點選後,會帶出設定的頁面。在Domain Name欄位內輸入honeypot.idv.tw,而Primary Nameserver欄位中則輸入203.70.181.248,另外將Secondary Nameserver欄位設定成123.204.45.73(圖20)。
 |
▲圖20 使用「New domain wizard」完成DNS設定。 |
緊接著,設定A記錄。在First A record hostname欄位內輸入
ftp.honeypot.idv.tw,並在First A record IP address欄位中輸入203.70.181.248。
同樣地,將Second A record IP hostname指定成
ftp.honeypot.idv.tw,並在Second A record IP address欄位內設定123.204.45.73,如圖21所示。在此也會發現,可以輸入第三組A記錄,這代表pfSense支援三個介面的負載平衡。
設定Firewall Rule同樣地,也要設定Firewall Rule,讓從外部進來查詢DNS Server的封包可以進入內網。選擇Firewall的Rules,並選擇WAN的設定。接著,點選右上角的+號圖示來新增一筆rule(之前已設定過,請參考圖13,此次要選擇的是WAN)
在Interface的部分,預設為WAN,不加以變更。在Protocol設定上,理論上選擇UDP即可(DNS預設使用UDP),但為避免萬一,這裡選擇TCP/UDP。而Destination port range部分, from及to設定都選擇DNS,如圖22所示。
 |
▲圖22 設定WAN Firewall rules。 |
此刻,針對用來測試的FTP服務,也要設定對應的rule。設定方式與設定DNS時相同,唯一不同的是,在設定Destination port range時記得選擇FTP。
設定NAT緊接著設定NAT,這樣一來,進來的封包才曉得要往哪個IP送。在此選擇Firewall中的NAT,再點選Port Forward,並點選右上角的+號圖示來新增一筆設定(圖23)。
 |
▲圖23 NAT新增一筆Port Forward設定。 |
隨後,設定Interface為WAN,Protocol為TCP/UDP,Redirect target IP為127.0.0.1 (與先前設定DNS Server時所bind的IP相同),Redirect target port為DNS,如圖24所示。
 |
▲圖24 設定DNS的NAT規則。 |
接著是重點中的重點:同樣再新增一筆記錄,其他的部分都與方才的設定相同,但是在Interface部分,務必記得設定為OPT1。
在完成這兩項設定後,不管是透過WAN或是OPT1進來的DNS查詢封包,都會往127.0.0.1送,而之前已將DNS Server所bind的IP設定為127.0.0.1,如此一來,當收到DNS查詢的封包時,DNS Server就會回應對應的IP address。
針對FTP服務的部分,也要做對應的設定,如圖25所示,Interface選擇WAN,Redirect target IP要輸入192.168.1.101(內部FTP Server的IP),而Redirect target port選擇FTP。在此,務必記要再新增一筆記錄,並且將Interface指定成OPT1。
 |
▲圖25 設定FTP的NAT規則。 |
設定Load Balancer設定流程至此幾乎都已經完成,經筆者測試,此時已經可以讓外部的主機在連入本地FTP Server時做到by session的負載平衡,但為了做到by packet的負載平衡。建議把Load Balancer的設定也繼續完成。
接下來,選擇Services中的Load Balancer,如圖26所示。
 |
▲圖26 設定Load Balancer。 |
然後,選擇Pools(參考圖26),並點選最後的+號圖示來新增一筆設定。
緊接著,在Name部分輸入ftp-1,Mode設定選擇Load Balance,而Port輸入21,Monitor選擇TCP,Server IP Address輸入203.70.181.248,並再點選Add to pool,之後在此欄位同樣輸入123.204.45.73,並點選Add to pool。最後按下〔Save〕,如圖27所示。
 |
▲圖27 設定Load Balancer Pool。 |
設定完成後,在Members的Enabled (default)欄位中會有203.70.181.248及123.204.45.73這兩個成員。
之後選擇Virtual Servers(參考圖26),同樣點選+號圖示新增一筆設定。在IP Address的部分輸入192.168.1.101,Port指定為21,而Virtual Server Pool部分選擇先前設定的ftp-1,Relay Protocol設定成TCP,最後按下〔Submit〕按鈕,如圖28所示。
 |
▲圖28 設定Load Balancer中的Virtual Server。 |
測試負載平衡的效果在繁瑣的設定流程完成後(其實熟練之後需要設定的部分並不多),測試一下負載平衡的效果。為便於觀察,必須安裝RRD套件(請參考圖17進行安裝)。
首先,在外部機器使用ping的方式來檢查是否每次查詢時都能對應到不同的IP,如圖29所示。根據實際測試後,結果顯示分兩次查詢
ftp.honeypot.idv.tw確實能夠得到不同的IP。  |
▲圖29 以ping的方式檢查外對內負載平衡。 |
隨後,從外部主機連線至自己的FTP Server下載檔案,並點選Status中的RRD Graphs,以便觀察流量圖。如圖30所示,從中可以發現,在WAN和OPT1的流量圖中同時均有out-pass的流量,此結果代表by packet的負載平衡確實已經生效。
 |
▲圖30 負載平衡流量圖。 |
結語在配置固定IP的光纖線路單價仍高的此時,負載平衡的使用不啻在頻寬提升及費用降低兩難之間出現一道曙光。但過於昂貴的設備及不易設定的Linux(FreeBSD)又讓這一道曙光頓時黯淡不少。所幸pfSense適時出現,讓負載平衡成為一個唾手可得且易於實現的目標。
除了負載平衡外,pfSense也具有足以取代防火牆及VPN Server的功能。但不可諱言地,pfSense相較於目前市場上廣受歡迎的UTM,仍有著較不易親近、可能較不穩定及較耗電的問題。要如何取捨,端賴網管和MIS人員謹慎地取捨。
原文出處:徒手打造pfSense負載平衡器 - 專題報導 - 網管人NetAdmin