:::

Proxmox VE的虛擬應用樣板 (Virtual Appliance Templates)

布丁布丁吃布丁

Proxmox VE的虛擬應用樣板 (Virtual Appliance Templates)

image

Proxmox VE的OpenVZ虛擬應用樣板提供了各種可以馬上執行的應用,就像是VMware的虛擬應用程式(Virtual Appliance)一樣,但使用的技術並不相同。這篇文章簡介Proxmox VE 1.8版安裝虛擬應用樣板所使用的OpenVZ技術,然後簡單介紹虛擬應用樣板的用途,最後則是以Joomla跟Moodle為例介紹安裝與使用的方式。


Proxmox VE、OpenVZ與應用樣板

Proxmox VE是一套開放原始碼的虛擬機器運作環境。他的特色在於結合了OpenVZ容器虛擬化技術與KVM全虛擬化技術,可以依照運作環境需求來選擇使用的技術。

OpenVZ容器虛擬化技術是建立一個「容器」(container),將Linux的程序與檔案全部集中在該容器中,成為獨立的一個Linux運作環境,進而模擬出一台Linux的虛擬電腦。容器虛擬化的運作方式彷彿是在Linux中執行一個Linux使用的程序,因此虛擬化的效能損耗相當的低。根據維基百科對OpenVZ的介紹,在一台768MB記憶的硬體中可以同時執行120個提供Apache服務的網站。

然而OpenVZ的容器虛擬化技術也限制於只能使用Linux作業系統。而且安裝時並不是使用一般的Linux安裝光碟,是需要使用經過特殊處理的樣板。在OpenVZ網站中稱之的樣板(template),只是建立了單純的CentOS、Fedora、Debian、SuSE、Ubuntu等Linux作業系統。而Proxmox把這些樣板加上了各種預先安裝好的服務(像是Joomla網站),而成為了虛擬應用樣板(Virtual Appliance Template)。

這些虛擬樣板的資料最後會被壓縮誠一個tar.gz的壓縮檔,使用者只要透過特定指令與步驟,就能快速在OpenVZ的環境(包括Proxmox VE)中從樣板建立一個馬上可以使用的虛擬機器。而Proxmox VE把這套流程做得更簡單、更容易上手,下面文章中將會說明詳細的安裝步驟。

應用樣板來源

目前就我知道的應用樣板來源共有三處:

  • Proxmox VE預先提供的應用樣板:應用樣板數量較少,但都是常用的服務。
  • Proxmox VE Wiki提供的完整應用樣板:完整且詳細的應用樣板,羅列了各式各樣的好用服務。這邊也含括了Promxox VE預先提供的應用樣板。
  • OpenVZ的作業系統樣板:只有純作業系統,但有各種不同版本可供下載。

以下主要介紹的是Proxmox VE Wiki提供的完整應用樣板。

Proxmox VE預先提供的應用樣板

image

Proxmox VE wiki的Get Virtual Appliances網頁中提供了許多虛擬應用樣板可供人免費下載使用。除了作業系統之外,具有特殊應用的樣板就有21種(排除僅是版本不同的樣板,以及不考慮KVM形式)。還有其他Proxmox VE推薦的2種。當然,這些應用本身也大多數都是開放原始碼軟體,請大家安心使用。

為了方便大家了解到底有哪些樣板可以使用,以下我把這26個樣板分成五種類別來介紹:

內容管理平台(Content Management System)
  • Joomla!:簡單易用的內容管理平台,現在台灣十分流行使用Joomla架設網站。
  • Wordpress:世界上最知名的部落格平台。
  • Drupal (Acquia Drupal):非常彈性具有的內容管理平台。
  • MediaWiki (v1.16x):最知名的維基軟體。維基百科就是用MediaWiki架設。
  • SimpleGroupWare:具備知識管理功能的內容管理系統。可以處理文件、e-mail、日曆、聯絡、工作、通訊錄等等多種功能。簡單容易使用。
基礎平台
  • BlueOnyx:作為架設網站的基礎,提供網頁GUI介面,可設定FTP等系統服務。(可惜似乎是不能讓Proxmox VE使用)
  • eyeOS:雲端桌面系統。你可以透過桌面電腦或行動裝置連到eyeOS進行文件管理、處理,或把它當作一個網路硬碟使用。
  • Proxmox Mail Gateway:Proxmox公司出品的郵件伺服器。
  • Zimbra:替代MS Exchange的郵件伺服器。
  • DebPBX (FreePBX, PBX in a Flash):VoIP網路電話。
  • CYAN Secure Web:代理伺服器(Proxy)。
企業管理與電腦資產管理
商務平台
其他應用
  • Moodle:數位學習使用的課程管理平台。
  • Care2x:醫院資訊管理應用。

安裝虛擬裝置樣板

在Proxmox VE安裝虛擬裝置樣板的方式有兩種,一種是在Proxmox VE提供的預設列表中直接下載安裝,另一種是手動從其他地方下載樣板,然後上傳到Proxmox VE中。

從Proxmox VE直接安裝樣板:以Joomla為例

Proxmox VE預設提供了一些常用的樣板,讓我們可以輕易地下載、取用。這個步驟真的很簡單,我非常喜歡他這邊的高度整合化功能。接著我以Joomla為例,介紹直接安裝樣板的操作過程。

image

在Proxmox VE安裝完成之後,你可以從左邊導覽列的VM Manager –> Appliance Templates –> Download中找到Proxmox VE提供的預設列表。該列表中將虛擬應用樣板分成四類:已認證的樣板(Certified Appliances)、管理用途的樣板 (admin)、作業系統樣板(system)、網站用途樣板(www)。

image

點入任一個樣板之後,你可以看到樣板的詳細訊息。上圖是點進Joomla樣板的介紹,裡面包括了對Joomla的簡介、詳細資訊連結、版本、分類、維護者、檔案名稱、MD5查核碼。

確定要使用該樣板的話,點下「start download」就可以開始下載該樣板的檔案。

2011-11-19_150328 download template

網頁中你可以看到Proxmox VE下載樣板的進度。 Joomla的樣檔案網址是http://download.proxmox.com/appliances/www/debian-6.0-joomla_1.6-3_i386.tar.gz,檔案大小為174MB。就算是我這邊學術網路的速度,下載也要等上好一陣子。後面的時間3m35s是剩餘的時間。

image

終於下載完啦。

有時候他這個訊息會跑到停住,這可能就是AJAX沒有寫好,讓他讀取中斷了。不過實際上Proxmox VE還是有在下載的,移到其他網頁再切回Download,就可以看到訊息繼續跑了。

image

下載完成之後,你就可以在Local頁面看到剛剛下載的樣板。稍後在建立新的虛擬機器時,就可以用該樣板來快速建立Joomla網站了。

手動安裝樣板:以Moodle為例

如果你要的虛擬裝置樣板並不在Proxmox VE的預設清單中,那你也可以自行下載樣板檔案,再上傳到Proxmox VE中。以下以Moodle為例說明操作步驟。

image

在上面介紹的虛擬應用樣板網頁中,你都可以找到下載tar.gz樣板檔案的連結。以Moodle來說就是http://www.sacollege.net/files/appliances/debian-5.0-moodle_1.9.9p-1_i386.tar.gz (190MB),請先將該檔案下載到你的電腦吧。雖然tar.gz是打包壓縮檔,不過請不要解壓縮這檔案喔,tar.gz的打包壓縮檔就是虛擬應用樣板本身了。

image

接著再回到Proxmox VE中,進入VM Manager –> Appliance Templates –> Local頁面中,在Upload File欄位裡選擇剛剛下載的樣板檔案,然後按下「upload」上傳。

2011-11-19_153634 please wait

等待樣板檔案上傳。Google Chrome會在左下角顯示上傳的進度。

image

上傳完成囉。

image

在Local頁面的OpenVZ Templates列表中就會看到剛剛上傳的Moodle樣板檔案。接下來新增虛擬機器時,就可以用該樣板快速建立Moodle網站囉。

以SSH上傳樣板到Proxmox VE

有時候網路實在是太不穩,你怎樣都無法用網頁介面上傳資料到Proxmox VE。這時候你可以考慮透過SSH的SFTP上傳樣板檔案。

image

Proxmox VE安裝完成之後,除了網頁管理介面之外,它也提供了SSH的服務。預設連接埠22,以root跟安裝時的密碼登入。我通常會用FileZilla以SFTP連到Proxmox VE管理來大型檔案。

Proxmox VE擺設樣板的路徑為「/var/lib/vz/template/cache/」,你也可以在該路徑底下看到Proxmox VE已經下載的樣板喔。

使用樣板建立虛擬機器

image

當你已經將樣板儲存到Proxmox VE之後,在VM Manager –> Virtual Machines –> Create頁面中,你就可以從Template選擇要使用的樣板。上圖可以看到我剛剛上傳的Joomla跟Moodle都在列表中。然後其他參數設定設定,你就可以建立一台具備Joomla或Moodle網站功能的虛擬機器囉。

2011-11-19_155257 joomla - mask

至於要怎麼使用樣板呢?大部分網站服務為主的樣板,架設完成之後,只要以該虛擬機器的IP為網址,直接用瀏覽器開啟,你就可以看到虛擬應用樣板的服務。但如果不是網站服務的樣板,那你就要從詳細介紹中看看如何使用的說明囉。


結語:虛擬應用是新時代趨勢

對於Proxmox VE在使用OpenVZ必須要使用樣板建立虛擬機器這點,其實很多人不太能習慣這個步驟

大多數安裝電腦的人,幾乎都是先接手一台沒有作業系統的空機器,從光碟開始一步一步慢慢地安裝,然後再安裝網站伺服器、資料庫,配置網站的程式碼,花了許多時間才能夠架設出一台可以用的伺服器。

即使是會使用VirtualBox或VMware等全虛擬化技術的人,也都會習慣先建立一個空的虛擬機器,配置好光碟機、網路卡等虛擬硬體設備,再掛載ISO光碟映像檔。然後就跟一般安裝電腦一樣,從光碟一步一步安裝起。

然而科技演進到現代,不論是Proxmox VE的虛擬應用樣板,或是VMware的虛擬應用,他們都是想要讓架設虛擬機器就像是在電腦上安裝應用程式一樣簡單。仔細看看上述我的介紹,整個架設Joomla的動作也不過是 1. 下載樣板 2. 安裝樣板 3. 建立虛擬機器 4. 開始使用,就這樣簡單。而且不管是Joomla還是Moodle,他們都可以用同樣的方式來架設,你不需要因為使用不同的系統而學習另一種架設手續。

時代的趨勢就是讓人們更容易使用科技。即使是伺服器服務這麼複雜的東西,Proxmox VE也要讓它簡單能夠使用。這也是我喜愛Proxmox VE的地方。

如何建立自己特製的樣板

雖然要在Proxmox VE使用虛擬應用樣板很簡單,但要從頭建立自訂功能的樣板,可就沒這麼容易了。

OpenVZ介紹了如何從實體電腦(physical)轉換到容器(container,也就是此篇文章講的樣板template)。轉換手續非常地多,似乎並不容易使用。

Proxmox VE介紹了以Debian作業系統建立虛擬應用樣板的Debian Appliance Builder,我還沒嘗試過,不過看起來並不複雜。

還有一種方式,就是直接「複製」已經建立好的OpenVZ虛擬機器。這只要使用vzdump匯出與vzrestore還原即可,操作方式可以看OpenVZ的說明。改天有空的時候我再來介紹如何在Proxmox VE中進行這樣的操作。

(more...)

GPLI 登入就開啟知識庫

布丁布丁吃布丁

0 Comments

GPLI 登入就開啟知識庫

image

GLPI是一套資產管理系統。我們主要側重於他的知識庫(knowledge base)功能,但是因為每次開啟時,預設都是先開啟中控台(central.php),這讓我們覺得有點煩。我順手把他的登入功能改成預設開啟知識庫,省下大家很多麻煩。

以下介紹的是GLPI 0.80.2登入就進入知識庫的程式安裝方法。

  • 檔案下載:login.php
    檔案位置:[GLPI]/login.php

[GLPI]表示GLPI網頁目錄的路徑。以Linux預設Apache安裝GLPI的話,目錄路徑就是/var/www/html/glpi。換句話說,完整路徑就是/var/www/html/glpi/login.php。

這樣就完成了。

(more...)

Proxmox VE新增登入的方式

布丁布丁吃布丁

Proxmox VE新增登入的方式

image

Proxmox VE是一套開放原始碼的虛擬機器環境。儘管在虛擬機器的管理上提供了網頁介面的管理功能(Web GUI),可是在登入的連接埠、帳號與密碼卻無法直接設定。

本篇是以Proxmox VE 1.8來跟大家說明如何新增自己熟悉的登入方式,包括新增進入的連接埠而不只使用預設的443,以及建立的可登入的帳號與密碼而不是root。


新增帳號與密碼

Proxmox VE預設是使用「root」跟安裝時建立的密碼登入。如果你想要新增一個你自己習慣使用的帳號的話,可以新增一位使用者,使其群組編號為0,即root群組。這樣在網頁管理介面中,就能使用新增的帳號登入。具體來說,以下以新增帳號「pudding」為例,作法如下:

首先,先以root登入指令列端。然後使用useradd指令新增使用者,並搭配-g 0參數,將群組設為root。指令如下:

proxmox:~# useradd -g 0 pudding

接著是設定pudding的密碼,指令為passwd,系統會要你輸入兩次該帳號的密碼:

proxmox:~# passwd pudding
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
proxmox:~#

ok,這樣就完成了。

image

以pudding成功登入。

新增登入的連接埠

這邊使用的是iptables的連接埠轉遞功能,用來新增可以連入的連接埠,而不只有使用預設的443。

我習慣將iptables的指令寫在一個腳本檔中,然後再執行該腳本檔。確定沒問題之後,再到開機檔案/etc/rc.local當中。

首先,先新增一個檔案:/root/iptables.port-forward-webgui.rule。我習慣使用vim,指令如下:

proxmox:~# vim iptables.port-forward-webgui.rule

這邊要讓eth0網路卡的64443轉遞到443連接埠,並限定來源IP為192.168.11.0/24的範圍,而Proxmox VE的IP位置為192.168.11.13。請在root/iptables.port-forward-webgui.rule檔案中輸入以下內容:

iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.11.0/24 --dport 64443 -j DNAT --to-destination 192.168.11.13:443

然後改變該檔案的權限為771,使用chmod指令:

proxmox:~# chmod 771 /root/iptables.port-forward-webgui.rule

接著執行該腳本檔,看看是否能夠順利把64443轉到443連接埠去;

proxmox:~# /root/iptables.port-forward-webgui.rule

接著以HTTPS通訊協定與64443連接埠開啟Proxmox VE網頁管理介面看看。

image 

如上圖,注意網址中的連接埠,現在是以64443連到Proxmox VE的網頁管理介面囉。

確認沒問題之後,我們最後在開機時會執行的腳本檔 /etc/rc.local 最後一行加入執行該腳本檔的指令:/root/iptables.port-forward-webgui.rule

重開機看看,順利的話,那重開機之後依然可以以64443登入喔。重開機的指令為reboot:

proxmox:~# reboot 

不過就算經過這樣的設定,原本的443連接埠依然可以登入。用連接埠轉遞的方式似乎沒辦法只允許64443而不用443的樣子。


結語:資安與管理之間的取捨

上面介紹這些方法,並沒有取消原本預設的登入方式,而是新增其他的登入管道。站在資安的角度來看,等於是多增加一個讓人入侵的漏洞。不過這邊我是站在管理的角度來看,當你系統一多的時候,要背下各種不同的登入連接埠、使用者帳號名稱與密碼,這是很痛苦的一件事情。如果能把這些登入連接埠、帳號與密碼做個統一,那麼管理上會輕鬆許多。

當然,這也代表了一旦被人知道統一的登入連接埠、帳號與密碼的話,那整個組織的系統就完了。所以為了避免外部網路的駭客惡意入侵,在這邊有多做一個來源IP的限制,以防萬一。

如果你想要再更進一步提高Proxmox VE的資安防護,建議你參考我另一篇SSH資安防護建議,提高Proxmox VE的SSH資安防護能力吧。

(more...)

IPFire 修改預設登入方法

布丁布丁吃布丁

IPFire 修改預設登入方法

image

IPFire是一套小巧簡單易用的防火牆套件。他使用的是我們熟悉的CentOS,操作上也算是挺直覺得,也不會用常見的登入方式,以提高資安防護。預設登入方法很特殊,如果不記錄的話很容易就會忘記,這邊介紹IPFire 2.9版(安裝光碟ipfire-2.9.i586-full-core51.iso)如何自訂修改其登入的方法。


預設登入方法

預設登入的方法是在Green網卡 (內部區域網路)中透過HTTPS連線與444連接埠登入,而登入時會出現Apache認證,需要輸入帳號密碼才能進入IPFire管理畫面。

image

Apache認證需要輸入使用者名稱「admin」跟安裝IPFire時使用的密碼。

然而由於IPFire使用的登入方法比較特殊,我想要改成自己習慣的登入方式,所以打算進行以下修改:

  1. 增加另一個我自訂的連接埠
  2. 增加另一個登入的使用者名稱與密碼

以下詳細說明各個步驟。

增加自訂連接埠:透過Port Forwarding的方法

這方法比較簡單,但原本444連接埠依然可以連線,等於是另外多加一個自訂的連接埠。

image

進入上方導覽列的 firewall ,到side menu的port forwarding中,新增一個新的規則。規則如下:

  • Protocol: TCP
  • Alias IP: DEFAUL IP
  • Source port: 63443 (這個是你自訂的連接埠)
  • Destination IP: 你現在IPFire所在的IP
  • Destination port: 444
  • Remark: IPFire admin webpage (說明這個連接埠轉遞的用意)
  • Source IP, or network: 是否要限定範圍的IP才能連線,建議是設定,例如140.119.61.0/24僅供140.119.61.0~140.119.61.254連線,以提高資安保護

確定好之後就新增。

image

然後設定External Access,開放444連接埠供外部連線(也就是透過Red網卡連線)。

這樣就可以了。

有人會提出疑問,為何不修改Apache設定呢?這是因為Apache設定要調整的地方比較多,不熟悉的人做起來會很頭痛,所以在這邊並不推薦修改Apache設定。

增加使用者名稱與密碼

這邊開始要進入Linux指令列操作。

修改Apache設定檔

首先先修改Apache的設定檔。檔案位置是「/etc/httpd/conf/vhosts.d/ipfire-interface-ssl.conf」,將看到「Require user」開頭的地方最後都加入空白與你要使用的帳號,例如我要使用的是pudding,那麼就改成「Require user adminpudding」。

共有四處要修改,我這邊各別是:

  • 29行:Require user admin pudding
  • 38行:Require user adminpudding
  • 52行:Require user admin pudding
  • 61行:Require user dial adminpudding
新增Apache認證檔

然後再來新增Apache認證檔的使用者名稱與密碼。認證檔的位置在「/var/ipfire/auth/users」,設定認證檔的指令為「htpasswd」。如果要新增pudding帳號,則下以下指令:

[root@ipfire /]# htpasswd /var/ipfire/auth/users pudding

接著Linux會問你密碼,請輸入兩次相同密碼作為確認。

重新啟動Apache,完成

接著是重新啟動Apache,指令如下:

[root@ipfire /]# /etc/init.d/apache restart

或著你也可以重新啟動IPFire也無所謂。

image

這樣就可以用你剛剛設定的使用者名稱與密碼登入了。


結語

如何有效管理網路仍是每個網管致力不懈的難題。儘管IPFire特殊的方式提高了資安防護,但也讓一般人容易忘記怎麼連線。那麼還是要手動調整成符合當地文化的登入方式,這樣子就比較令人安心了。

(more...)

GLPI 強化知識庫目錄功能

布丁布丁吃布丁

0 Comments

GLPI 強化知識庫目錄功能

image

雖然GLPI提供了知識庫的功能,但是說實在的並不是很好操作。我修改了知識庫的目錄功能,讓他更容易使用。以下說明安裝方式跟強化的功能。這邊所說的是GLPI 0.80.2版本,安裝在Linux (CentOS)作業系統預設的Apache伺服器上,Windows作業系統的路徑並不一樣,請自行找尋位置。


安裝

※ [GLPI]請取代掉GLPI網頁目錄中的相對應位置。

Linux預設Apache的話,網頁檔案的位置在/var/www/html/glpi/。換句話說,完整路徑就是/var/www/html/glpi/inc/knowbaseitemcategory.class.php

功能

  • 知識庫的類別可以顯示備註的完整內容。
    image
  • 知識庫的類別具備直接編輯的連結。(開新視窗)
    image
  • 從類別路徑可以直接新增知識庫文章。
    image
  • 新增知識庫文章之後,跳到該類別的列表中,而不是回到知識庫首頁。 (2011/11/17)
  • 知識庫文章列表可以直接修改與跳到上傳檔案的位置。(2011/11/18)
    image

就這樣簡單的功能,可是卻能省下許多管理上的麻煩。

如果要新增子類別(子項)的話,可以到編輯類別的功能中操作。如下圖:

image

(more...)

在 PHP 使用 YUI Compressor 壓縮 JavaScript 跟 CSS

在 PHP 使用 YUI Compressor 壓縮 JavaScript 跟 CSS

2011-11-14_232832 yui logo

我在寫程式的時候,習慣搭配程式註解一併撰寫。寫JavaScript就搭配JSDoc,寫CSS就搭配CSSDoc,寫著寫著程式碼就會非常非常地龐大,造成使用者每次都要下載過大的檔案內容而效率緩慢。

YUI是一套開放原始碼的JavaScript與CSS框架,以BSD授權條款開放使用。它其中一個相當知名的功能是JavaScript與CSS的壓縮器(compressor)。這篇是要教你如何在PHP的環境中使用YUI Compressor來壓縮JavaScript與CSS。


安裝配置

由於這篇的目的是使用PHP作為開發環境,相信你已經有了一個運作PHP的環境。我自己的測試環境是以XAMPP 1.7.0架設,使用PHP 5.2.8。

首先,你要準備一個資料夾,用來擺放YUI Compressor與相關檔案。

再來將以下檔案下載到該資料夾中:

安裝Java

由於YUI Compressor使用Java,你必須確保你的環境中安裝了JDK才行。請到Java網站下載Java Platform (JDK),他有提供Windows與Linux各種版本。

然而我在CentOS作業系統中安裝JDK 7u1時不知為何地失敗了,所以我又回頭去裝了JDK 6u12。

下載之後,請調整該檔案的權限為755,然後執行該檔案。舉例來說指令如下:

[root@dspace ~]# chmod 755 jdk-6u12-linux-i586-rpm.bin
[root@dspace ~]# ./jdk-6u12-linux-i586-rpm.bin

如要確認Java能夠使用,請輸入以下指令並可能會看到如下訊息:(可能是因為我先裝7u1失敗的關係,以下版本顯示的是7u1而不是6u12)

[root@dspace ~]# java -version
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) Client VM (build 21.1-b02, mixed mode)

這樣就完成配置囉。


壓縮使用

使用YUI Compressor時,要先引用Minify_YUICompressor.php,然後透過它的靜態方法minifyJs()跟minifyCss()來輸入要壓縮的程式碼,並取得壓縮過後的程式碼。

以下是minifyJs跟minifyCss的用法:

/**
* Minify a Javascript string
*
* @param string $js
*
* @param array $options (verbose is ignored)
*
* @see http://www.julienlecomte.net/yuicompressor/README
*
* @return string
*/
public static function minifyJs($js, $options = array())

/**
* Minify a CSS string
*
* @param string $css
*
* @param array $options (verbose is ignored)
*
* @see http://www.julienlecomte.net/yuicompressor/README
*
* @return string
*/
public static function minifyCss($css, $options = array())

使用範例

為了讓大家更容易理解如何使用,請下載以下兩個範例檔案到上述Minify_YUICompressor.php跟yuicompressor-2.4.6.jar的同一個資料夾中。

我們先看一下blogger-template.css的原始碼,這是一個沒有經過壓縮的CSS程式,大概長得像下面這樣子,程式碼大小為19.9KB:

2011-11-14_232059 blogger-template.css

然後我們再透過minifyCss.php看一下壓縮過的樣子,壓縮過後程式碼大小為13.4KB,足足有67.3%的壓縮率:

2011-11-14_232133 minifyCss.php

以下是minifyCss.php的程式碼內容。這裡面包括了在HTTP標頭輸出為CSS格式的指令,以協助瀏覽器正確判斷資料內容。

<?php
header('Content-type: text/css', TRUE);

include("Minify_YUICompressor.php");
$script = file_get_contents("blogger-template.css");
$packed = Minify_YUICompressor::minifyCss($script);
echo $packed;

而JavaScript也是以此類推,以下是minifyJs.php壓縮JavaScript的標頭輸出與壓縮寫法:

<?php
header('Content-type: text/javascript', TRUE);

include("Minify_YUICompressor.php");
$script = file_get_contents("puliBloggerDigest.js");
$packed = Minify_YUICompressor::minifyJs($script);
echo $packed;


致謝與修改過程

YUI Compressor雖然一般是要透過Java以指令列的方式運作,不過多虧了minify專案開發了Minify_YUICompressor.php,讓我們得以輕易地以PHP使用YUI Compressor。

然而由於原本的Minify_YUICompressor.php需要將YUI Compressor跟暫存目錄指定為絕對路徑,我覺得不是很好用,所以將暫存目錄改為系統自訂的暫存目錄、YUI Compreesor改為跟Minify_YUICompressor.php相同的目錄,讓我們只要把兩個檔案擺在一起就能夠使用。這樣在程式碼轉移的時候特別方便,例如將PHP系統從Windows轉移到Linux的時候。

結語:最好搭配快取機制一起使用

YUI Compressor的壓縮功能雖然挺好用的,搭配上Minify程式之後就更容易讓PHP取用,但是運作效率卻有待堪慮。我在Windows環境中請YUI Compressor壓縮1MB左右的JavaScript的時候,通常會延遲個3秒鐘左右才完成。儘管這是因為我檔案太大的關係,但是如果太過頻繁的壓縮,恐怕仍會帶來效率上的問題。

我建議在使用YUI Compressor的時候,同時搭配一些快取機制(cache),將YUI Compressor的壓縮結果另存為一個靜態的JavaScript或CSS程式碼。下次就能讓系統直接讀取壓縮結果,而不需要經過YUI Compressor的壓縮。

(more...)

SSH資安防護建議

布丁布丁吃布丁

SSH資安防護建議

ssh

圖片來源:SSH tunnels for the common man (and woman)

SSH是Linux常用的通訊協定。儘管它是一種加密式的通訊協定,但是其實它很容易被用各種方法來取得進入的權限。為了提高SSH的安全性,我提出三層額外的SSH防護措施,以避免Linux直接暴露在網際網路的危險之中。


SSH簡介

SSH是Secure SHell protocol(安全的殼程式協定)的簡寫,他是一種封包加密技術,以確保封包在網路傳輸中不會因為中途竊取、監聽而暴露重要資料。SSH在Linux作業系統中已經被視為遠端操作用的基本工具,現在已經幾乎沒人在用telnet來操作Linux,除了BBS之外。詳細內容可以參考維基百科鳥哥的Linux私房菜的介紹。

然而,即使SSH已經是加密過的通訊協定,只要有心人士知道你的IP(用ping就可以抓到,或是各種方法都能知道你的伺服器IP)、連接埠(預設是22,或用連接埠掃描工具就知道)、帳號(預設是root)、密碼(透過暴力破解法猜測而得),那麼任何人依然可以輕易地登入你的主機、植入木馬、讓你的伺服器成為殭屍電腦

由於我們這邊常常有電腦遭駭客鎖定、攻擊,所以我思考了很多SSH防護的對策。以下介紹我目前的SSH三層防護措施:1. 防火牆設置白名單、2. 更改預設登入與連線方式、3. fail2ban。這三層的作法中,做完第一層就能達到一定程度的保護。如果不甚安心,或是無法限定白名單的話,那麼再進行第二層跟第三層的設定即可。


第一層:防火牆設置白名單

2011-11-14_171102 zentyal whitelist - mask

防火牆中的白名單(whitelist)是指較嚴謹的防護方式。只有白名單中IP範圍的電腦才能允許連線,否則全部都不能連線。

如果你所在網路中有架設防火牆統一管理,那麼可以請網路管理員幫忙設定。上圖是Zentyal防火牆套裝軟體的設定畫面,在這邊我將來源範圍設定為140.119.61.0/24,代表只有140.119.61.0~140.119.61.254這些IP範圍內的電腦才能連線,其他電腦都會被擋下來。

如果你沒有類似的防火牆伺服器,那麼也可以在Linux中使用iptables防火牆套件來配置。關於iptables請見我另一篇的說明,像是在iptables.allow的設定中加入以下設定:

iptables -A INPUT -i $EXTIF -s 140.119.61.0/255.255.255.0 -j ACCEPT #允許140.119.61.*的電腦連入

不過,當你不確定哪些電腦可以連入,譬如時常要從特定區域外面的網路中連回到Linux伺服器時,這種白名單就很難掌控。你有兩種作法可以作為應變:

  1. 準備一台白名單內的個人電腦,常常是公司內部的個人工作站,再透過該工作站連到Linux伺服器。
  2. 放棄使用白名單,僅做以下第二層與第三層的防護設定。

當然,我還是會建議你用第一種作法,而不是放棄白名單。

第二層:修改預設登入與連線方式

許多Linux安裝好之後,都會預設開放SSH(連接埠22),並允許root連線登入。所以駭客只要偵測到該IP開放22連接埠提供SSH服務,就可以用root帳號跟暴力破解法猜測密碼來登入。Ubuntu在這點做得不錯,它預設是關閉SSH,更不允許使用者用root直接登入。不過還是很多人打開了SSH連線,結果一樣很容易讓駭客進行暴力破解法猜測。

為了避免直接被猜測預設帳號與連線方式的方法,我提供以下幾個建議:

1. 新增另一個擁有root權限的帳號

為了避免直接被以root帳號猜測登入,我們要先準備另一個帳號,並給予他root般的權限,以方便進行伺服器管理。

Linux新增帳號的指令為useradd,然後再用passwd給予密碼。詳細操作請看鳥哥的帳號管理說明。舉例來說,我現在要以pudding作為另一個管理者帳號,作法如下:

[root@ipfire ~]# useradd pudding
[root@ipfire ~]# passwd pudding
Changing password for pudding
Enter the new password (minimum of 5, maximum of 127 characters)
Please use a combination of upper and lower case letters and numbers.
New password:
Re-enter new password:
Password changed.
[root@ipfire ~]#

接著修改帳號的uid,將之設為0,表示同等於root帳號。修改uid的位置在「/etc/passwd」檔案,打開該檔案之後,有一條設定將會是剛剛新增的帳號。舉例來說,剛剛新增的pudding帳號,其設定如下:

pudding:x:1001:1001::/home/pudding:

將這設定中的uid改成0,結果如下:(注意紅字的部份)

pudding:x:0:1001::/home/pudding:

關於「/etc/passwd」的詳細內容,請參考鳥哥的說明

2. 設定SSH,阻止root登入

SSH的設定檔預設位於「/etc/ssh/sshd_config」檔案中。

要阻止root帳號登入的話,則是在設定檔最後加上一條設定:(注意大小寫不同)

DenyUsers root

儲存之後,重新啟動SSH。之後SSH就不准給root登入了。

不使用PermitRootLogin no的理由

必須要說明的是,在此不使用大部分教學主張的「PermitRootLogin no」設定。這是因為該設定會一併擋掉前面建立的帳號,讓他無法登入。

如果是指令操作的話,還可以用su root換成root帳號。但是像是SFTP的操作就不能用su root切換,因此乾脆還是用擁有root權限的帳號比較方便。

3. 修改SSH連接埠

同樣是在「/etc/ssh/sshd_config」檔案中。

找到「Port 22」的設定,並將之改為其他的連接埠。舉例來說,如果要設定為透過64022來連接SSH的話,那就是改為「Port 64022」。

image

儲存之後,重新啟動SSH。之後SSH必須透過64022登入了。

弱點仍是暴力破解法

很遺憾的是,第二層作法只能防君子不能防小人。駭客依然可以透過掃描工具掃描伺服器連接埠,找到你修改後的SSH連接埠號碼,然後透過暴力破解法,猜測你的帳號與密碼組合。

具體來說,SSH雖然預設限制每次連線都只能嘗試登入5次,但是只要撰寫程式機器人,就可以不斷重複進行SSH並嘗試猜測帳號與密碼。這種程式並不難寫,可是卻很難防禦。為了阻止暴力破解法,你還需要第三層的防護:fail2ban。

第三層:fail2ban 限制登入失敗次數

fail2ban是Linux的一個套件,它會根據記錄檔來判斷使用者登入失敗的次數,來決定是否要阻止該使用者再次嘗試登入。舉例來說,你可以設定嘗試登入次數最高3次,超過次數之後必須等待1小時才能再登入。這樣駭客就很難用暴力破解法猜測你的密碼,因為他用錯誤的方式猜測,一天最多也能猜測24*3=72組帳號密碼而已。

關於fail2ban的安裝與設定方式,請參考我另一篇教學


結語

之前我這邊發生一件事情。我們同事平常用他工作用電腦連上Linux伺服器操作,然而他工作用電腦因為沒有定時更新防毒軟體,導致駭客入侵、成為殭屍電腦,一併感染了Linux伺服器。在這個案例中,第一層防護因為同事電腦位於白名單內而沒有效用,第二層與第三層防護,也因為同事電腦的帳號密碼直接被側錄,而跟著毫無效用。

同事的電腦不更新防毒軟體(實際上是已經過期了,卻又不更新授權),連帶導致的問題,讓計畫團隊足足有半個月沒有任何進度,而是在重灌伺服器跟修補漏洞。

這件事情告訴我們,任何角落都可能成為資安的漏洞來源,怎樣都擋不完。

不過,實際上也不要這麼悲觀。平時定期更新防毒軟體(免費的防毒軟體例如小紅傘Avira AntiVir PersonalAVG Anti-Virus FREE都不錯用)、架設伺服器時設定一下SSH的連線,將資訊安全當成常識一樣看待,將可以大幅降低駭客入侵的可能性。

(more...)

GLPI新增文件類型

布丁布丁吃布丁

GLPI新增文件類型

image

GLPI中上傳檔案時,會受到GLPI的文件類型管理限制。如果是未設定過的特殊文件類型,那上傳會失敗。這篇是講如何在GLPI 0.80.2中新增文件類型的方法。


1. 進入文件類型頁面

image

位置在「主頁 >設定 > 下拉列表」中,選擇「管理 文件類型」,再按下搜尋,就會進入文件類型的設定頁面。

2. 新增文件類型

image

新增文件類型的按鈕是上面導覽列的「+」。非常難發現,這是我覺得GLPI難以使用的缺點之一,雖然習慣就好。

image

接著進入「文件類型-建立」頁面。你可以輸入以下資料:

  • 名稱
  • 圖標(圖示)
  • 授權下載
  • 擴展名(副檔名的意思)
  • MIMIE類型
  • 備註說明

確定之後,按下「新增」按鈕就完成新增文件類型的動作。之後就可以用你設定的文件類型來上傳檔案了。


如果你使用GLPI的問題是檔案大小過大(預設是2MB),那必須調整php.ini的環境設定才行。關於放寬檔案大小設定的方法,請看我另一篇的說明。

(more...)

用JSON加快JavaScript的搜尋速度

用JSON加快JavaScript的搜尋速度

image

(圖片來源:ICON FINDER)

最近在寫JavaScript程式,在這邊跟大家分享一些程式撰寫的小技巧。JavaScript在網頁應用中通常是作為客戶端的應用程式,而JavaScript的運作速度時常取決於客戶端使用的瀏覽器與電腦效能。要執行複雜的JavaScript運算時,使用Google Chrome跟使用Internet Explorer (簡稱IE,特別是6以下)會有相當驚人的差距。

最近發現我的程式在IE上的瓶頸卡在「搜尋速度」上。如果修過資料結構的同學一定知道,資料結構最常探討的問題就是「搜尋」。提高搜尋速度有很多已知的方法,平常撰寫時通常只會實作最簡單但也是最沒效率的循序演算法(sequential search),而這也就是執行效率的瓶頸。然而多虧JavaScript的特殊資料結構JSON,我們也可以犧牲一些記憶體空間來換取非常快的執行速度,實作雜湊搜尋法(Hash Search)

以下就簡單介紹一下這些方法的差別。


低效率搜尋:循序演算法

現在我想要做一個函式(function),它會要求輸入一個字,並確認這個字是否是大寫英文,輸出「true」或「false」。

陣列版本

簡單一點的作法,我們可以用陣列(array)來實作:

/**
* 檢查一個字是否是英文大寫。(陣列搜尋版本)
* @param String _word 要檢查的字
* @return boolean 是英文,或不是英文
*/
function is_english_by_array(_word) {
var _english_list = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];

for (var _i in _english_list)
{
if (_word == _english_list[_i])
return true;
}
return false;
}

alert(is_english_by_array('Z'));

這是很直覺的寫法,要比對的資料組成一個陣列資料集,然後再一一比對。雖然看起來有點冗長,效率也不高。

正規表示法版本

聰明一點的人會用正規表示法(Regular Expression)來作字串的搜尋,以下是改用正規表示法的寫法:

/**
* 檢查一個字是否是英文大寫。(正規表示法版本)
* @param String _word 要檢查的字
* @return boolean 是英文,或不是英文
*/
function is_english_by_reg(_word) {
var _reg = /^([A-Z])$/;
return _reg.test(_word);
}

alert(is_english_by_reg('Z'));

看起來簡潔多了。但其實正規表示法的效率極差,這樣子的搜尋速度並不會快到哪裡去。

JSON與雜湊演算法

自從學會使用JSON之後,我就愛上了這種特殊的資料格式,特別是用在雜湊演算法的時候實在是很方便。

JSON介紹

以下引用維基百科對JSON的介紹

JSON(Javascript Object Notation)是一種輕量級的資料交換語言,以文字為基礎,且易於讓人閱讀。

JSON用於描述數據結構,有以下形式存在。

  • 物件 (object):一個物件以「{」開始,並以「}」結束。一個物件包含一系列非排序的名稱/值對,每個名稱/值對之間使用「,」分割。
  • 名稱/值對(collection):名稱和值之間使用「:」隔開,一般的形式是:
{name:value}

一個名稱是一個字串; 一個值可以是一個字串,一個數值,一個物件,一個布林值,一個有序列表,或者一個null值。

  • 值的有序列表(Array):一個或者多個值用「,」分割後,使用「[」,「]」括起來就形成了這樣的列表,形如:
[collection, collection]

  • 字串:以""括起來的一串字元。
  • 數值:一系列0-9的數位組合,可以為負數或者小數。還可以用「e」或者「E」表示為指數形式。
  • 布林值:表示為 true 或者 false。
雜湊搜尋法

用JSON實作雜湊搜尋法的方式,跟上面用陣列來實作的方式有點像:他們一樣是要準備一個可供搜尋的資料集,只是資料結構的方式完全不同。

以下是用JSON實作的雜湊搜尋法:

/**
* 檢查一個字是否是英文大寫。(JSON版本)
* @param String _word 要檢查的字
* @return boolean 是英文,或不是英文
*/
function is_english_by_json(_word) {
var _english_list = {'A':1,'B':1,'C':1,'D':1,'E':1,'F':1,'G':1,'H':1,'I':1,'J':1,'K':1,'L':1,'M':1,'N':1,'O':1,'P':1,'Q':1,'R':1,'S':1,'T':1,'U':1,'V':1,'W':1,'X':1,'Y':1,'Z':1};
return (typeof(_english_list[_word])=="number");
}

alert(is_english_by_json('Z'));

跟陣列把要比對的資料放在「值」(value)的方式不同,雜湊法中要比對的資料是放在「名稱」(name)當中。因此一旦用typeof()確認資料集中是否有該名稱時,就能夠知道搜尋的結果。

至於資料集中的值為何是用1?其實在此問題中用什麼值是無所謂,因為我只要確認該_word是否在待比對資料集裡面就好了。


結語

寫JavaScript實在是很有趣。

傳統在教資料結構時,大多是用C或Java在做教學。然而由於語言先天上的限制,像是強型別(Strong Type)、僅有基本的資料型態等等的特性,在實作資料結構與演算法時,其實是需要非常多步驟。對於JavaScript來說,既有JSON這個萬用的資料結構,也可以把function當做是資料型態,因此寫起程式來可說是非常靈活。

然而不僅僅只是在客戶端的應用,現在也越來越多人把JavaScript拿到伺服器端來使用,稱之為Server-side JavaScript (SSJS),目前相當知名應用之一就是Node.js

相信未來JavaScript會更加蓬勃發展,大家一起加油吧。

(more...)

jQuery動態載入CKEditor注意事項

jQuery動態載入CKEditor注意事項

image

最近在寫標註工具的API,完成之前沒有好好做的載入器(loader),目標是要讓人用一行程式碼就能載入全部需要的工具。

在我做的KALS標註工具當中使用到了CKEditor,而要讓他與jQuery搭配,則需要額外載入一個調配器(adapters)。但是傳統的用法都是在<head>寫<script>標籤,這跟我要的動態載入不太一樣。

在四處碰壁嘗試之後,終於找到了正確的作法。在此做個筆記。


不可用的方法

由於我是要在網頁讀取完之後才開始動態載入,因此不能用document.write,否則會洗掉整個網頁。

原本我也想利用DOM建立<script>標籤,內含src屬性載入CKEditor,插入<head>當中,但卻發現這個插入的<script>標籤並不會執行,簡單來說就是沒有效果。

後來改用jQuery的getScript()方法,就能夠確實地讀取並執行CKEditor。不過仍有其他細節需要注意,以下說明。

正確的方法

正確的作法是:

  1. 建立<script src=”[CKEditor的網址]”></script>貼到<head>之中,供CKEditor本身去搜尋連結,自動載入其他檔案。
  2. 以jQuery.getScript()載入並執行CKEditor。
  3. 先載入CKEditor主程式,再載入調配器。

以下是簡單的範例程式碼:

//在這之前,你已經確認載入了jQuery

//路徑宣告
var _ckeditor_url = "/ckeditor/ckeditor.js";
var _adapters_url = "/ckeditor/adapters/jquery.js";

//載入函式
var _load_lib = function (_url, _callback) {
var _script_tag = $('<script type="text/javascript" src="' + _url + '"></script>');
_script_tag.appendTo($('head'));

$.getScript(_url, function () {
if (typeof(_callback) == 'function')
_callback();
});
};

//開始載入
_load_lib(_ckeditor_url, function () {
_load_lib(_adapters_url, function () {

//你接下來要做的其他程式

});
});

這是截自KALS載入器的部分程式,並沒有經過測試。有任何錯誤,請提醒我再檢查、修正。

(more...)

Proxmox VE建立虛擬區域網路 (VLAN) 方案 (3) 操作說明

Proxmox VE建立虛擬區域網路 (VLAN) 方案 (3) 操作說明

proxmox_logo 3 excute

終於來到了Proxmox VE虛擬區域網路方案的最後一篇。這一篇是介紹每建立一台虛擬機器時所需要的設定。儘管大部分的設定都在前一篇環境配置中設定完了,不過每一台虛擬機器還是需要手動設定不少參數。這邊也會介紹如何使用反向代理伺服器連接FQDN跟虛擬機器喔。

Proxmox VE建立虛擬區域網路(VLAN)方案目錄:

  1. 方案說明
  2. 環境配置
  3. 操作說明

1. 建立虛擬機器的網路設定

好,講了老半天,我們終於要在Proxmox VE建立虛擬機器了。登入Proxmox VE管理介面的網址是「https://192.168.11.13」,注意是https,而不是http。

由於它的介面已經很容易操作了,在此我就不再一步一步講述,只講需要注意的重點。

1-1. 建立虛擬機器

2011-10-24_155244 create vm - draw

  • 虛擬機器類型(Type):OpenVZ
  • 虛擬機器樣板(Template):Joomla! Content Management    debian-6.0-joomla_1.6-3_i386.tar.gz
  • 網路類型(Network Type):Brdged Ethernet (veth)
  • First DNS Server:140.119.1.110

最重要的是網路類型必須為veth,本篇不使用venet。其他的參數則就視你的需求做調整。

2011-10-22_001631 Open VNC console

建立好之後,就把這台虛擬機器開起來吧。進入主控台的位置在Open VNC console,如上圖。

1-2. 虛擬機器網路設定

這邊的網路設定必須要透過Proxmox VE的VNC console進入虛擬機器的指令列模式設定。

因為每一種Linux發行版的網路設定都不大相同,這邊介紹的是Debian。其實RedHat系的Linux發行版設定起來也差不多,可以參考使用CentOS的鳥哥教學

1-2-1. 編輯設定檔

請用vi修改/etc/network/interfaces 網路配置檔:

vi /etc/network/interfaces

因為目前還沒辦法連上網路安裝vim,所以只好先用vi。

預設的網路配置檔幾乎什麼都沒有設定,所以是無法連線到網際網路的。

設定網路的方式有兩種:DHCP與靜態網路,請選用其中一種來配置。

1-2-2a. 網路模式:DHCP

如果只是暫時要連到網際網路,而不需要讓網際網路的電腦連線至虛擬機器、讓它提供服務的話,你可以採用DHCP的配置方式。

請在網路配置檔加上以下設定:

auto eth0
iface eth0 inet dhcp
1-2-2b. 網路模式:靜態網路

如果是要對網際網路的電腦提供服務的虛擬機器,請使用靜態網路配置。配置如下:

auto eth0
iface eth0 inet static
address 10.10.10.1
netmask 255.255.255.0
gateway 10.10.10.254

設定時必須指定區域網路IP,在此使用10.10.10.1。同一個區域網路裡面不能有相同的IP,因此你可能需要另外的管理方法來確保IP之間不會相互衝突。

2011-10-24_161511 notes

我通常會將虛擬機器的區域網路IP跟FQDN資訊寫在Notes中,如上圖。

1-2-3. 重新啟動網路

請輸入以下指令以重新啟動網路:

/etc/init.d/networking restart

如果沒有錯誤訊息的話,那應該就是順利設定完成了。

1-2-4. 測試網路連線

你可以用最常見的ping指令,測試看看虛擬機器能不能連到Google:

ping www.google.com

如果順利的話,你可以看到以下畫面:

2011-10-22_012750 ping google

確認沒問題之後,按Ctrl + c取消ping指令。

如果網路順利接通的話,你就可以順便安裝vim,指令為:

apt-get install vim

到此為止,虛擬機器連到網際網路已經沒有問題了。但是反過來,若要網際網路的電腦能夠連到虛擬機器,那還需要其他的設定。以下繼續介紹。


2. Proxmox VE 網路路由設定

接下來我們要想辦法讓網際網路的電腦能夠連上虛擬機器。而這之間的橋接者,就是Proxmox VE了。

讓虛擬機器提供服務的方式有許多種,在此要介紹的是透過連接埠轉遞(port forwarding)跟反向代理伺服器(reverse proxy)的方法。

2-1. 網路設定規劃

在設定之前,有必要先釐清預期的網路設定。以下介紹中,我要讓人能夠連線到架設Joomla的虛擬機器。該虛擬機器是以靜態網路配置,區域網路IP為10.10.10.1。Joomla是走HTTP服務,連接埠80,在此設定Proxmox VE時,我規劃以31080連接埠轉遞到他的80連接埠;我們也希望能夠以SSH管理虛擬機器,SSH的連接埠為22,在此設定Proxmox VE時,我規劃以31022連接埠轉遞到他的22連接埠。但我們只希望特定的IP範圍能夠使用SSH連線到虛擬機器,範圍是192.168.11.0/24,也就是僅給192.168.11.0到192.168.11.254的IP連線。關於IP與子網路遮照的表示法,請參考Wikipedia的子網路介紹

此外,我們也設置了一個FQDN「joomla.example.com」,希望能夠讓網際網路的電腦透過此FQDN連線到虛擬機器。設定FQDN一般需要借助你網路環境中的DNS Server幫忙,或是你也可以修改自己電腦的hosts檔案,暫時加入IP與FQDN的對應表,以方便測試。Windows的hosts檔案位於C:\Windows\System32\drivers\etc\hosts,詳細請參考Wikipedia的介紹

2-2. 連接埠轉遞 (port forwarding)

簡單來說,我們要設定兩套連接埠轉遞的規則:(Proxmox VE表示實體機器,Joomla表示虛擬機器)

  • Proxmox VE:31080 –> Joomla:80
  • Proxmox VE:31022 –> Joomla:22

連到Proxmox VE的31080連接埠,就等於連到Joomla虛擬機器的80連接埠,提供HTTP服務;連到Proxmox VE的31022連接埠,就等於連到虛擬機器的22連接埠,提供SSH服務。其中第二套規則要加上來源IP的限制。

至於31080跟31022的設定,只是我自己的管理規劃。要用哪個連接埠並沒有特別技術上的限制,只要不要跟Proxmox使用的連接埠443衝突即可。

這些動作可以使用Webmin的Linux Firewall模組來進行,以下一一介紹。

2-2-1. 進入Linux Firewall模組的NAT設定

2011-10-22_013619 linux firewall - draw

請先登入Webmin,然後從左邊導覽列進入 Networking > Linux Firewall模組。然後點選Showing IPtable: Network address translation (nat),以進入NAT的設定頁面。

2-2-2. 新增規則

2011-10-24_170421 Linux Firewall Add Rule

我們要設定的規則是屬於Packets before routing (PREROUTING,封包被路由前的規則)鏈,請在PREROUTING右下角找到「Add Rule」進入新增。

2011-10-24_170816 Add Rule - HTTP 

剛進去的時候可能會被他繁雜的選項嚇到。別擔心,一步一步照著我以下的介紹來設定吧。

2-2-3. 新增HTTP的規則

2011-10-24_170816 Add Rule - HTTP - draw

首先先新增HTTP的連接埠轉遞。以下是要設定的欄位與建議參數,我將參數以粗體顯示。

Chain and action details的部份:

  • Rule comment: Joomla HTTP
  • Action to take: Destination NAT
  • IPs and ports for DNAT
    • IP range: 10.10.10.1 to 10.10.10.1
    • Port range: 80 to 80

Condition details的部份:

  • Destination address or network: Equals 192.168.11.13/32
  • Incoming interface: Equals eth0
  • Network protocal: Equals TCP
  • Destination TCP or UDP port: Equals Port(s) 31080

然後按左下角的「Create」按鈕,完成規則的建立。

2-2-4. 新增SSH的規則

接著新增SSH的連接埠轉遞。以下是要設定的欄位與建議參數,我將參數以粗體顯示。

Chain and action details的部份:

  • Rule comment: Joomla SSH
  • Action to take: Destination NAT
  • IPs and ports for DNAT
    • IP range: 10.10.10.1 to 10.10.10.1
    • Port range: 22 to 22

Condition details的部份:

  • Source address or network: Equals 192.168.11.0/24
  • Destination address or network: Equals 192.168.11.13/32
  • Incoming interface: Equals eth0
  • Network protocal: Equals TCP
  • Destination TCP or UDP port: Equals Port(s) 31022

跟HTTP規則相比,SSH規則多加了來源位置的限制,如上面紅字所示。然後按左下角的「Create」按鈕,完成規則的建立。

2-2-5. 套用設定

2011-10-24_172556 Firewall Apply Configuration

在Linux Firewall模組底下,按下「Apply Configuration」按鈕,套用上述設定即可。

2-3. 反向代理伺服器 (reverse proxy)

設定反向代理伺服器之後,就能夠用FQDN:joomla.example.com連到Joomla虛擬機器。

反向代理伺服器Pound的設定必須靠SSH連入Proxmox VE的指令列模式來操作。步驟很簡單,敘述如下:

2-3-1. 編輯設定檔

請以vim編輯/etc/pound/pound.cfg:

vim /etc/pound/pound.cfg

在設定檔最後加入以下設定:

ListenHTTP
Address 192.168.11.13
Port 80
Service
HeadRequire "Host: joomla.example.com.*"
BackEnd
Address 10.10.10.1
Port 80
End
End
End

你可以注意到,首先要設定Proxmox VE的IP、連接埠80;封包對象的FQDN網址規則「joomla.example.com.*」,表示是以「joomla.example.com」開頭的網址;以及要傳遞到區域網路的虛擬機器IP:10.10.10.1與連接埠80。

2-3-2. 重新啟動Pound與測試

重新啟動的指令如下:

/etc/init.d/pound restart

如果沒有任何錯誤訊息的話,那就是設定成功了。

你可以試著從自己電腦的瀏覽器打開「http://joomla.example.com/」順利的話就會出現以下畫面:

2011-10-24_203502 joomla.example.com

看到Joomla網站的話就大功告成啦!


結語

經由上述的方法,就能夠以一台伺服器、一個對外IP,架設起Proxmox VE環境。他可以讓虛擬機器處於一個區域網路中,並透過連接埠轉遞跟反向代理伺服器提供服務。儘管操作上是沒有VirtualBox這麼簡單,但是防火牆設定、反向代理伺服器等功能較符合網管的需求。

讓我覺得遺憾的是,Webmin還是太過複雜,儘管許多名詞已經註明,但是光看名詞也很難理解所有功能的意義。因此在操作的時候請務必多多參考鳥哥的Linux私房菜,不要冒然猜測設定參數的意義。

我本來是希望能找到能夠安裝在Debian,簡單易懂的防火牆設定工具。但是大多數防火牆工具都是像Zentyal這種套裝的系統,而不是讓人簡單安裝在Debian、並提供網頁服務的工具。

另一個方法是用KVM虛擬機器安裝獨立的防火牆系統,不過我目前缺少具備VT-x / AMD-V的伺服器,因此實際上我還沒用過KVM的功能。原本我在VMware ESXi的時候的確做過這樣的設定,但是這要耗掉兩個對外IP:VMware ESXi伺服器、以及防火牆伺服器。不過如果照上述的方法來設定的話,應該會有更簡單的作法才是。我簡單的規劃草圖如下,不過這樣的規劃究竟是否可行,也得等未來有機器之後再繼續研究吧。

Proxmox VE結合防火牆套件建構虛擬區域網路 

關於反向代理伺服器選擇Pound的理由。網路上常見以Apache跟Squid這兩套工具來做反向代理伺服器,但是他們在設定上相較於Pound複雜很多。不過Pound並沒有快取功能,他純粹是封包轉遞、負載平衡而已。請端看你的需求選擇反向代理伺服器。

話說回來,光是寫這篇就花掉我好幾天,能寫到結語真是太令人感動了。有時候精神不佳寫起來不是很清楚,或是有筆誤的地方,請不吝糾正,感謝。

總之,還有許多要研究的議題,這次就先走到這邊即可。未來還有進一步的研究發現,我會在上來跟大家分享。一起加油吧。

(more...)