IPFire 實作反向代理伺服器(Reverse Proxy)
IPFire是我最近在研究防火牆套裝系統中覺得較為合適的一套軟體。它是以Linux為基礎發展而成的作業系統,專門用來作為防火牆、DHCP伺服器、NAT路由器等功能。
IPFire在安裝Pound套件之後一樣可以作為反向代理伺服器(reverse proxy)使用,不過Pound的設定檔必須要透過指令列來修改,不是很方便。我用PHP寫了一個pound.cfg設定檔編輯器,並將之整合到IPFire的管理介面中。
以下簡介IPFire、反向代理伺服器套件Pound、IPFire安裝Pound與pound.cfg設定檔編輯器的方法,以及如何設定Pound反向代理伺服器。
IPFire簡介
- IPFire官方網站
- IPFire下載網頁:此篇使用的是Installable CD image:ipfire-2.9.i586-full-core51.iso(SkyDrive備份:part 1、part 2)
IPFire是一個設計作為防火牆的伺服器系統,採GNU第三版發佈,可供人免費自由使用。它主要是用於可設定、調整大小的中小型企業網路與家庭網路中。
在這個前提之下,IPFire原始安裝時只提供了最小的功能,但附有大量的擴充套件(add-ons),只要點點滑鼠就能輕易安裝。這也是IPFire與其他防火牆系統的差異所在:它很容易設定各種功能,並易於管理。
IPFire的安裝與設定都十分簡單,就跟它企鵝火燒屁股的標誌一樣可愛。儘管它並沒有許多UTM(Unified Threat Management,整合式威脅防護系統)主打的複雜功能,但容易上手、設定、並能夠滿足我的需求,對我來說就足夠了。
不過老實說,它網頁管理端的防火牆設定只能設定單一來源位置,如果要規劃複雜的防火牆規則,例如我之前的iptables設定,那麼就得要用指令列來手動設定iptables了。
Pound簡介
Pound是一種反向代理伺服器(reverse proxy)、負載平衡器(load balancer)以及網頁伺服器的前端(front-end)HTTPS管理器。Pound可將流量負載分散至多台網頁伺服器,並能夠使用方便的SSL包裝器加密HTTP封包,讓原本沒有HTTPS功能的網頁伺服器也能夠使用HTTPS提供服務。Pound是以GPL發佈,可供人免費自由地使用。
網路上實作反向代理伺服器的套件很多,大多人都使用Squid與Apache,而之前我也用Lighttpd來做反向代理伺服器。Squid設定複雜不易上手;Apache我試過,但不太穩定;Lighttpd雖然不錯用,但是以Lighttpd作為網頁伺服器的情況不常碰到(IPFire是用Apache);而這個Pound則是專門用來作為反向代理伺服器的套件,跟前面敘述的套件不同的地方是,Pound並沒有代理伺服器特有的快取功能,而完全只負責轉遞封包,這是在使用Pound需要注意到的問題。此外,Pound設定簡單容易上手,這也是我喜歡Pound的特色。
來聊個題外話:通常Pound套件會安裝在獨立的負載平衡伺服器中,但偶爾也會遇到將網頁伺服器與Pound套件安裝在同一台伺服器的情況。由於Pound必須監聽連接埠80才能引導封包流向,這會與一般的網頁伺服器(如Apache)監聽連接埠80相互衝突。我看有些設定是修改網頁伺服器的連接埠,例如改為8080,然後讓Pound在引導封包流向時將80轉為8080,達到兩種服務共同相處的目的。稍後在介紹Pound設定檔pound.cfg的內容時,相信應該很容易理解這個作法。不過本篇並不會處理這樣的問題,當做閒聊看看就算了。
接下來開始介紹IPFire上安裝Pound與Pound設定檔pound.cfg編輯器的方法,以及設定Pound反向代理伺服器的方法。
IPFire安裝Pound
我參考了原本IPFire安裝Pound的教學,加入我額外開發的pound.cfg設定檔編輯器,所以步驟變得有點複雜。如果有任何講述錯誤的地方,請多多指教。
1. 前置作業:安裝IPFire與開啟網頁管理介面(Web Interface)
安裝IPFire的步驟挺簡單的,就跟安裝普通的Linux作業系統一樣,我就不再贅述。
一開始常見的問題通常是要如何連上網頁管理介面(Web Interface)。不過這也不是本篇的重點,我也沒打算花太多篇幅敘述這個作法。簡單來說:
- 請使用內部網路(LAN)的電腦來連線。
- 連線到https://192.168.0.1:444。
- 預設帳號為admin,密碼為IPFire安裝時設定的密碼。
以下所有步驟都必須要從網頁管理介面操作,請想辦法努力做到這一步吧。
2. 設定防火牆
這一步也是要在內部網路的電腦中連到IPFire網頁管理介面進行操作。
請進入firewall > External Access頁面中,設定網際網路連線可連入IPFire的規則。
主要欄位說明如下:
- TCP:封包類型。我們大部分的服務都是用TCP進行,此處請選TCP。
- Destination port:目標連接埠。為了讓網際網路的電腦可以連到IPFire的網頁管理介面,此處請開放444連接埠。
- Remark:說明。我們為此規則加入「ipfire web interface」的說明。也可以輸入中文。
最後按下「Add」按鈕,就完成了新增規則的作業。以下就能用任意電腦連線至IPFire的網頁管理介面了。
同時,也請你以相同的步驟,開啟以下幾個之後會用到的連接埠:
- 連接埠222:IPFire使用的SSH通訊協定。
- 連接埠80:Pound監聽的HTTP通訊協定。
- 連接埠443:Pound監聽的HTTPS通訊協定。
3. 開啟SSH
請開啟網頁管理介面中的system > SSH Access頁面。
在ssh區塊中,勾選以下選項:
- SSH Access:讓IPFire可以使用SSH。
- Allow TCP forwarding:允許TCP封包轉遞。
- Allow password based authentication:允許密碼認證。
- Allow public key based authentication:允許公開金鑰認證。
加上前一步驟中開放了防火牆,接下來你可以就用你的電腦以SSH連線至IPFire。IPFire的SSH連接埠為222,這跟一般預設的22有所不同,因此比較不容易被駭客猜到。
稍後我們會透過SFTP(SSH的FTP模式)上傳檔案,我是使用FileZilla來上傳。如果要用SSH的指令列模式操作IPFire的話,我通常是使用PieTTY,但是指令列模式操作比較困難,本篇也不打算多談,僅供進階使用者使用而已。
4. 檔案上傳
以下幾個檔案請以SFTP方式上傳到IPFire的指定路徑中。
pound
- 下載位址
- 存放路徑:/etc/sysconfig/pound
- 開機時自動啟動pound的設定。
ipfire-interface-ssl.conf
- 下載位址
- 存放路徑:/etc/httpd/conf/vhosts.d/ipfire-interface-ssl.conf
- 讓Apache可以使用PHP程式。其實IPFire的Apache本來就有載入PHP元件,但並沒有設定PHP關連。此檔案就是加入了PHP的關聯設定。
pakfire.cgi
- 下載位址
- 存放路徑:/srv/web/ipfire/cgi-bin/pakfire.cgi
- 在IPFire網頁管理介面中加入開啟pound.cfg的連結。
pound_edit.php
- 下載位址 (如果新版本IPFire的pound.cfg路徑有修改的話,請下載這個檔案)
- 存放路徑:/srv/web/ipfire/html/pound_edit.php
- 編輯pound.cfg設定檔的程式
檔案放完之後,要記得重新啟動apache喔。指令如下:
[root@ipfire ~]# /etc/init.d/apache restart
Restarting Apache daemon... [ OK ]
5. IPFire安裝Pound套件
在網頁管理介面端,進入ipfire > Pakfire頁面,請在Available Addons中選擇「pound」(我目前使用的是pound-2.5-2版本),然後按下下面的「+」按鈕進行安裝。
接著IPFire會要你確認是否要安裝。按下綠色向右箭頭確認即可。稍微等待一段時間,IPFire一下子就會裝好Pound套件,並跳回剛剛的Pakfire頁面中。
6. 開啟pound.cfg editor
安裝完Pound套件之後,網頁管理介面的ipfire > Pakfire下方應該會出現pound區塊。請開啟pound.cfg editor連結。
接著會開啟pound.cfg editor視窗,你就可以在此畫面中編輯Pound的設定檔了。詳細的設定稍後會再敘述,此處只要確認可以開啟即可。
7. 重新啟動IPFire
以上設定完畢之後,需要重新啟動Apache跟Pound,設定才會生效。你可以從網頁管理介面中的 system頁面找到「Reboot?」按鈕,按下去之後就會讓IPFire重開機了。
如果你會使用SSH指令列操作IPFire,也可以輸入以下兩個指令,各別將Apache與Pound重新啟動:
[root@ipfire /]# /etc/init.d/apache restart
[root@ipfire /]# /etc/init.d/pound restart
到此為止,IPFire安裝Pound就大功告成了。
設定pound反向代理伺服器
反向代理伺服器是一種特殊的網路架構,它利用FQDN(Fully Qualified Domain Name)透過反向代理伺服器連接到內部網路的伺服器。其原理我已經在之前討論pfSense時介紹過了,在此不再贅述。
Pound作為反向代理伺服器的設定方式很容易上手,在此我謹介紹最簡單的範例。我先講述一下範例的網路拓蹼,然後再講要如何設定Pound。如果要進行更複雜的設定,請參考Pound官方網站的說明。
1. 網路拓蹼規劃
現在的網路拓蹼架構如上圖,IPFire作為防火牆與路由器,負責連接網際網路(外部網路)與內部網路兩者。
在內部網路中,有一台網頁伺服器提供Joomla網站服務,內部網路的IP為192.168.0.20。
為了讓網際網路的電腦可以連線至Joomla網站,我們先註冊一個FQDN:joomla.example.com,並指向IPFire伺服器的外部網路IP:140.119.61.254。
接著我們就要設定IPFire中的Pound套件,讓它知道接收到來自joomla.example.com的封包時,要轉遞到內部網路中的Joomla伺服器。
2. 進入pound.cfg editor
Pound的設定檔是/etc/pound.cfg。如果你在上述步驟中一起安裝了pound.cfg編輯器,那麼你可以透過它從IPFire網頁管理介面中編輯pound.cfg。
請開啟IPFire的網頁管理介面,進入ipfire > Pakfire,找到最下面的pound.cfg editor,開啟視窗。
3. 編輯pound.cfg
依照目前的網路拓蹼規劃,有幾個參數是必須要確定的:
- IPFire的外部網路IP位置:140.119.61.254 (以藍色表示)
- FQDN:joomla.example.com (以紅色表示)
- 內部網路伺服器的IP位置:192.168.0.20 (以綠色表示)
如此設定pound.cfg之後的內容如下,請注意顏色的對應:
ListenHTTP
Address 140.119.61.254
Port 80
Service
HeadRequire "Host: .*joomla.example.com*"
BackEnd
Address 192.168.0.20
Port 80
End
End
End
設定應該算蠻好懂的,在此就不多解釋了。
4. 重新啟動IPFire
修改pound.cfg之後,要重新啟動Pound才會生效。你可以從IPFire的網頁管理介面中將IPFire重新啟動,也可以透過SSH輸入指令「/etc/init.d/pound restart」來重新啟動Pound。
以上Pound的設定就大功告成了。
F&Q
為什麼pound.cfg editor抓不到檔案內容?
可能是IPFire設定的pound.cfg路徑有所修改,詳細請看IPFire addons: pound的說明。
結語
我本來是打算用pfSense作為反向代理伺服器。但很遺憾的是,不知道是不是硬體不支援的關係,我的實體伺服器並沒辦法安裝pfSense。所以我只好臨時找尋其他的方案,而找到現在的這個IPFire。
老實說,IPFire並沒有pfSense容易上手,但還算是堪用就是。希望他真的能夠讓我安裝到實體伺服器中,別讓我又要重找了啊。
至於為什麼pound.cfg editor是用PHP開發的這點,雖然IPFire主要的功能都是用Perl寫成的cgi網頁,但我對cgi並不熟,所以才會折衷用PHP來寫。雖然安裝手續上複雜了一點,但操作時應該比較容易才是吧?至少不必用到vi來編輯pound.cfg設定檔,這點應該可以讓許多管理者容易上手許多才是。
光是研究各個防火牆系統套件花了不少時間,本來想說這個pound.cfg editor應該可以很快完成,結果又因為其他意外拖了很久,實在是很慚愧。希望未來也能繼續努力加油,嗯!
IPFire好像改過pound.cfg的路徑,所以我這篇更新一下。
回覆刪除最近使用IPFire的pound模組時發生了問題,
回覆刪除我調整了pound_edit.php的檔案內容,請到下面網址下載:
https://skydrive.live.com/redir?resid=6BA2FBE8DE6717A9!968
另外,因為/etc/pound.cfg設定檔預設只能給root讀寫修改,沒辦法用網頁來修改
所以用以下語法開放權限之後,就可以順利用pound editor了
[root@ipfire ~]# chmod 777 /etc/pound.cfg
當然這樣做有安全風險囉
很好的教学。。。。谢谢。
回覆刪除To IT Ting,
刪除不客氣,有幫上忙就好!
ipfire实在好用,我懒惰所以没有弄反向代理,而是直接开port去web server。谢了,这篇文章我收了做参考咯。
回覆刪除To Y. King Ting,
刪除你用的是IPFire的routing功能,跟反向代理伺服器的用途不同。
你可以解決問題最重要,恭喜
請問ipfire 可以安裝tailscale嗎,謝謝。
回覆刪除不好意思,這個我不知道,請您自行研究。
刪除