建構基於OpenVPN之VPN環境
建構基於OpenVPN之VPN環境
作者:國家資通安全會報技術服務中心 系統研究組經理 林志堯
內容:
1. 前言
在本期的技術專欄中,筆者將介紹使用開放源軟體OpenVPN建構免費之VPN伺服器方案。OpenVPN為著名的開放源軟體類型的VPN套件,並且獲得2007年最佳開放源軟體VPN之殊榮[1],由此可見其受歡迎與肯定之程度。在此篇文章中,將使用Linux Fedora 7作為安裝OpenVPN伺服器之作業系統,至於OpenVPN用戶端系統,將同時說明使用Linux與Windows系統的安裝設定方式,提供讀者在商業方案以外的免費VPN方案選擇。
2. 建立OpenVPN伺服端環境
2.1. 安裝OpenVPN套件
在安裝OpenVPN套件前,須先安裝完成作業系統環境,請依據一般的Fedora安裝方式安裝系統,在本文中將以Fedora 7作為建構環境,並且系統所使用的IP位址為10.3.89.50。
首先在完成作業系統安裝後,使用yum安裝OpenVPN套件,指令為:
# yum install openvpn
系統將檢查相關相依套件,並詢問是否同意安裝,如圖1所示。
圖1 安裝OpenVPN套件
2.2. 設定OpenVPN伺服器
以root身分登入系統主機,並將隨著安裝OpenVPN所增加的設定範例檔與金鑰憑證產生工具複製到/etc/openvpn目錄下,該目錄將作為系統使用OpenVPN服務相關的設定檔與金鑰之存放位置。
# cp -R /usr/share/openvpn/easy-rsa/ /etc/openvpn/
接著建立新子目錄 /etc/openvpn/keys 用以存放憑證金鑰。
# mkdir /etc/openvpn/keys
由於OpenVPN套件提供產生VPN伺服器憑證的產生檔,所以可以簡便地修改該檔案以生成符合本身所需之憑證檔。
# cd /etc/openvpn/easy-rsa/2.0/
# vi vars
其中比較需要變更的為vars檔案最後幾行的值,原始的檔案內容為:
export KEY_COUNTRY=”US”
export KEY_PROVINCE=”CA”
export KEY_CITY=”SanFrancisco”
export KEY_ORG=”Fort-Funston”
export KEY_EMAIL=me@myhost.mydomain
可將此改為適合的內容,例如:
export KEY_COUNTRY=”TW”
export KEY_PROVINCE=”Taiwan”
export KEY_CITY=”Taipei”
export KEY_ORG=”ICST”
export KEY_EMAIL=”vpn@icst.org.tw”
此外為了方便金鑰產生自動存放到/etc/openvpn/keys目錄下,請一併將vars檔案中的KEY_DIR設定值,變更為/etc/openvpn/keys,亦即將
export KEY_DIR=”$EASY_RSA/keys”
改為
export KEY_DIR=”/etc/openvpn/keys”
之後儲存修改後的vars檔案。接著依序執行以下指令
# . ./vars
# ./clean-all
# ./build-ca
其中第一行的指令,兩個”.”中間存在一個空格,如果少的話,將無法正常執行,請特別注意。如果一切順利的話,就會出現如圖2之訊息,其中紅框之文字可依據本身的環境條件進行變更。
圖2 產生OpenVPN憑證
接著執行以下指令產生VPN伺服器之金鑰
# ./build-key-server server
此時系統所詢問之內容皆輸入’Enter’接受即可,最後再輸入’y’簽署VPN伺服器之憑證即可,如圖3所示。
圖3 產生OpenVPN伺服器金鑰
接下來產生VPN用戶端的憑證與金鑰,指令為:
# ./build-key client1
此時系統所詢問之內容皆按下’Enter’鍵接受即可,至於系統詢問是否執行的判斷,請皆輸入’y’即可,如圖4所示。
圖4 產生OpenVPN用戶端金鑰
接著產生Diffie Hellman參數值,此為OpenVPN伺服器使用上所必須具備的,指令為:
./build-dh
系統花點時間產生Diffie Hellman參數值,如圖5所示。
圖5 產生Diffie Hellman參數值
接下來執行以下指令,創造防止DoS攻擊之驗證金鑰(ta.key)。
# openvpn genkey secret /etc/openvpn/keys/ta.key
此時檢查系統相關的金鑰與憑證等檔案是否皆存在於系統上,例如圖6所示。
圖6 OpenVPN伺服器相關憑證與金鑰
在相關憑證與金鑰皆備齊之後,接著需要創造OpenVPN伺服器之設定檔。
首先請將系統的範例檔複製到/etc/openvpn/目錄下。
# cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf /etc/openvpn/
接著編輯/etc/openvpn/server.conf檔案,令其內容如下:
port 1194
proto udp
server 10.8.0.0 255.255.255.0
status openvpn-status.log
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
tls-auth /etc/openvpn/keys/ta.key 0
dh /etc/openvpn/keys/dh1024.pem
comp-lzo
dev tun
ifconfig-pool-persist ipp.txt
keepalive 10 30
max-clients 100
persist-key
persist-tun
verb 3
其中server 10.8.0.0 255.255.255.0,代表OpenVPN伺服端系統使用10.8.0.0/24這個網段,作為與OpenVPN用戶端系統網路連結之用途,當VPN連線建立後,OpenVPN伺服端將為10.8.0.1,OpenVPN用戶端則為該網段的其他IP,例如10.8.0.6。至於port 1194與proto udp代表OpenVPN伺服端將開放UDP通訊埠1194供OpenVPN用戶端與其建立VPN通道。而ca、cert、key與dh分別指向前述步驟所產生之檔案。comp-lzo代表啟用壓縮加強傳輸效能,而dev tun代表OpenVPN伺服端系統使用虛擬出來的tun網路介面作為封包傳輸用途。
2.3. 啟動OpenVPN伺服器
執行以下指令啟動OpenVPN伺服器,並請確認系統回應之訊息為OK。
# service openvpn start
之後可以使用ifconfig指令檢查系統網路狀態,如果出現tun0的資訊,代表系統已與OpenVPN伺服器建立連線,例如圖8所示,其中VPN網路介面的IP為10.8.0.1。相關OpenVPN之設定可參考[2]。
圖7 OpenVPN伺服端虛擬網卡檢查
3. 建立OpenVPN用戶端環境
在OpenVPN用戶端的作業系統選用上,可為Linux之類的Unix Like系統,或者是Windows系統。在這裡將分別說明Fedora 7之OpenVPN用戶端安裝設定,以及Windows系統之OpenVPN安裝設定方式。
3.1. Linux Fedora之OpenVPN用戶端設定
Fedora作業系統之OpenVPN用戶端套件安裝方式於前面文章所提的伺服端安裝方式相同,同樣使用yum install openvpn安裝即可。
至於設定的方式,首先要從前面設定的OpenVPN伺服端獲得相關憑證與金鑰,分別為ca.crt、client1.crt、client1.key,以及ta.key。
建議將以上各檔案置放於用戶端系統的特定目錄下,例如同樣創造/etc/openvpn目錄,並於其中創造keys目錄存放上述檔案。指令為
# mkdir /etc/openvpn
# mkdir /etc/openvpn/keys
# mv ca.crt client1.crt client1.key ta.key /etc/openvpn/keys/
接著請於/etc/openvpn/目錄下創造一名為client.conf的設定檔,檔案內容如下:
client
remote 10.3.89.50 1194
dev tun
comp-lzo
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
tls-auth /etc/openvpn/keys/ta.key 1
verb 3
之後啟動OpenVPN用戶端程式即可,方式為:
# openvpn config /etc/openvpn/client.conf &
之後可以使用ifconfig指令檢查系統網路狀態,如果出現tun0的資訊,代表系統已與OpenVPN伺服器建立連線,例如圖8所示,其中VPN網路介面的IP為10.8.0.6。
圖8 OpenVPN用戶端(Linux)虛擬網卡檢查
之後即可使用Ping工具檢查兩者間的連線,例如
# ping 10.8.0.1
正常情況下將可收到來自OpenVPN伺服端系統的回應封包,同樣地,若登入OpenVPN伺服端系統,執行
# ping 10.8.0.6
同樣也可收到來自OpenVPN用戶端系統的回應封包,此代表兩者間的連線正常。
3.2. Windows系統之OpenVPN用戶端設定
若想使用的OpenVPN用戶端系統是安裝於Windows上的話,需先由官方網站[3]下載OpenVPN用戶端程式,目前最新的版本為openvpn-2.0.9-gui-1.0.3-install.exe,下載安裝時,系統預設安裝於Program Files\OpenVPN目錄下,將來自OpenVPN伺服端系統的相關檔案(ca.crt、client1.crt、client1.key,以及ta.key),存放於其中的config目錄下,並且創造一檔名為client.ovpn的設定檔,內容與Linux系統相同,同樣為:
client
remote 10.3.89.50 1194
dev tun
comp-lzo
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/client1.crt
key /etc/openvpn/keys/client1.key
tls-auth /etc/openvpn/keys/ta.key 1
verb 3
之後在桌面右下角點選連線即可建立VPN連線。如圖9所示。
圖9 OpenVPN用戶端(Windows)啟動方式
之後可以使用ipconfig指令檢查系統網路狀態,如果出現tun0的資訊,代表系統已與OpenVPN伺服器建立連線,例如所示,其中VPN網路介面的IP為10.8.0.6,如圖10所示。
圖10 OpenVPN用戶端(Windows)虛擬網卡檢查
4. 結論
在本篇文章中,介紹使用開放源OpenVPN套件建構VPN環境,當環境建立完成後。伺服端與用戶端系統間就可透過虛擬出來的IP(例如本文採用之10.8.0.0/24網段)進行彼此間的溝通連線。然而OpenVPN僅在於建立雙方的VPN通道,所以通道建立後,用戶端系統仍然需要透過伺服端系統開放的服務進行溝通,例如再使用Telnet、SSH等方式進行系統管理,或者使用相關的通訊埠進行資料庫的溝通,例如VPN伺服端同時也是MySQL伺服器,則VPN伺服端預設亦須開放TCP port 3306供VPN用戶端存取其中的資料庫。因此OpenVPN主要目的乃在於提供系統原有網路服務更安全的加密通道,以避免資訊洩漏風險。
在下期的技術專欄中,將整合前一期有關於Linux-HA Project之Heartbeat套件,以及本期所介紹之OpenVPN套件,建構出高可用性的VPN通道環境。
5. 參考文獻
[1]http://www.openvpn.net/index.php/bossie-award-winner.html
[2]http://blog.fourthirty.org/?p=135
[3]http://openvpn.se/
========
建構高可用性的OpenVPN伺服器
作者:國家資通安全會報技術服務中心 系統研究組經理 林志堯
內容:
1. 前言
在筆者前一期的技術專欄:「建構基於OpenVPN之VPN環境」中,介紹使用OpenVPN套件建構穩定與經濟之VPN伺服器,以提供讀者在商業方案以外的免費VPN方案選擇。而在前二期的技術專欄:「建構高可用性Linux系統,以Apache Server為例」中,則介紹使用Heartbeat套件構築具備Failover的Apache伺服器。在本期的技術專欄中,進一步將OpenVPN套件與Heartbeat套件結合,使得在VPN伺服器上,增加Failover之功能,進一步提升OpenVPN伺服器的可用性。目標為建構具備高可用性之OpenVPN伺服器。在本文中將延續筆者之前技術專欄的內容為基礎,增加額外設定說明,著眼於未來應用方向,作為讀者未來採用OpenVPN或Heartbeat套件之應用參考。
2. 安裝與設定Heartbeat
請參考8月技術專欄:「建構高可用性Linux系統,以Apache Server為例」,依序執行以下步驟安裝設定:
# yum install heartbeat
修改範例設定檔
設定主機IP與名稱,其中IP分別為10.3.89.23與10.3.89.24,主機名稱則分別為node 1與node 2。IP與主機名稱的對應於測試環境中,必須為node 1對應為10.3.89.23,而node 2對應為10.3.89.24。
至此請先啟動Heartbeat服務,確認出現類似以下資訊:
Refresh in 5s…
============
Last updated: Thu Jul 24 17:47:22 2008
Current DC: node1 (a78f6a8d-68db-428f-acfd-6afa81acc415)
2 Nodes configured.
0 Resources configured.
============
Node: node1 (a78f6a8d-68db-428f-acfd-6afa81acc415): online
Node: node2 (a5a3a561-6c88-474b-bd2a-0ac31d12311e): online
3. 安裝與設定OpenVPN
請參考10月技術專欄:「建構基於OpenVPN之VPN環境」,依序執行以下步驟安裝設定:
# yum install openvpn
產生OpenVPN金鑰與憑證檔
編輯OpenVPN伺服器設定檔
待安裝設定完成後,請測試使用service openvpn start是否可正常啟動,此時的/etc/openvpn/server.conf設定檔內容應如下:
port 1194
proto udp
server 10.8.0.0 255.255.255.0
status openvpn-status.log
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
tls-auth /etc/openvpn/keys/ta.key 0
dh /etc/openvpn/keys/dh1024.pem
comp-lzo
dev tun
ifconfig-pool-persist ipp.txt
keepalive 10 30
max-clients 100
persist-key
persist-tun
verb 3
其中OpenVPN伺服器將使用10.8.0.1作為其VPN伺服器的IP,而連線建立的VPN用戶端系統,則會被配發屬於10.8.0.0/24網段,但非為10.8.0.1的IP。
執行以下指令啟動OpenVPN伺服器,並請確認系統回應之訊息為OK。
# service openvpn start
4. 整合Heartbeat與OpenVPN
4.1. 更新Heartbeat設定檔
在進行以下步驟前,首先請分別登入node 1主機(IP為10.3.89.23)以及node 2主機(IP為10.3.89.24),並確保系統上的/etc/ha.d/目錄下存在以下檔案,ha.cf,authkeys。以筆者為例,ha.cf的檔案內容如下:
use_logd yes
bcast eth0
auto_failback on
node node1 node2
crm on
而authkeys的檔案內容則為:
auth 1
1 sha1 yourSecretWord
並請確保/etc/logd.cf將其中的logfacility為:
logfacility daemon
以利由/var/log/message檢查Heartbeat紀錄訊息。
為了讓系統使用Heartbeat提供OpenVPN高可用性,須確保其中的OpenVPN服務是由Heartbeat所管控的,亦即由Heartbeat偵測與管理OpenVPN服務。當Heartbeat發現原有執行OpenVPN的node出問題時,自動啟動其他node的OpenVPN服務,接手原有node之服務,所以以本文的架構而言,當node 1正常運作時,Heartbeat將控制由node 1執行OpenVPN服務,而當node 1出現問題時,Heartbeat將要求node 2執行OpenVPN服務,之後當node 1恢復正常時,Heartbeat再把node 2執行之OpenVPN服務中止,改由node 1啟動OpenVPN服務。
所以為了讓Heartbeat可以管理OpenVPN服務,除了讓Heartbeat知道node 1與node 2的存在,以及模擬出的IP(以本文而言,此IP為10.3.89.50)之外,還要定義OpenVPN服務的資源,以讓Heartbeat可以進行資源管理。
在此請先執行以下指令,暫時將Heartbeat服務中止:
# service heartbeat stop
接著若系統存在舊設定檔時,請先移除:
# rm -rf /var/lib/heartbeat/crm/cib.xml
# rm -rf /var/lib/heartbeat/crm/cib.xml.sig
其中cib.xml為Heartbeat定義資源服務的主要設定檔(XML格式),而cib.xml.sig則是cib.xml的MD5雜湊檔,供Heartbeat驗證cib.xml之真確性。
之後請進入/etc/ha.d/目錄,並編輯haresources檔案,亦即:
# cd /etc/ha.d/
# vi haresources
使其檔案內容如下,此代表預設使用node 1提供OpenVPN服務,並且使用的IP為10.3.89.50(亦即執行Heartbeat所模擬出之IP):
node1 10.3.89.50 openvpn
之後再執行以下指令產生新的cib.xml。
# python /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources
此時可先檢查系統是否正常產生cib.xml,方式為:
# ls -l /var/lib/heartbeat/crm/cib.xml -rw-rr 1 hacluster haclient 2620 2008-11-24 17:28 /var/lib/heartbeat/crm/cib.xml
接著請將/etc/init.d/openvpn複製到/etc/ha.d/resource.d/目錄下:
cp /etc/init.d/openvpn /etc/ha.d/resource.d/
因為Heartbeat預設用來控制OpenVPN啟動的執行檔,並非使用標準的Linux開機程序—Linux Standard Base (LSB),而是使用Heartbeat類型。然而上述由/etc/init.d/openvpn複製而來的OpenVPN啟動程序屬於LSB格式,所以需要針對cib.xml稍作修改調整,將其中的heartbeat類型改為lsb類型,避免Heartbeat監控結果有誤。方法為將cib.xml之中的
[primitive id=”openvpn_2″ provider=”heartbeat” type=”openvpn”]
改為
[primitive id=”openvpn_2″ provider=”heartbeat” type=”openvpn”]
4.2. 更新OpenVPN設定檔
由於整合Heartbeat後,OpenVPN伺服器將使用10.3.89.50而非使用10.3.89.23或10.3.89.24,所以在原有的OpenVPN設定檔上需要加以指定10.3.89.50作為提供連結之IP,亦即須針對/etc/openvpn/server.conf進行修改,增加以下一行設定
local 10.3.89.50
4.3. 複製node 1設定檔至node 2
在Heartbeat之高可用性架構中,最重要的要求之一,就是確保各個node的設定檔內容相同,以保證當由不同的node接手服務時,可以提供相同之服務,所以接下來便是將前述於node 1之設定檔複製到node 2的對應位置。
4.3.1. 複製Heartbeat設定檔
首先登入node 2後,輸入以下指令複製ha.cf以及authkeys:
# cd /etc/ha.d/
# scp root@10.3.89.23:/etc/ha.d/ha.cf .
# scp root@10.3.89.23:/etc/ha.d/authkeys .
接著輸入以下指令複製cib.xml:
# cd /var/lib/heartbeat/crm/
# scp root@10.3.89.23:/var/lib/heartbeat/crm/cib.xml .
4.3.2. 複製OpenVPN設定檔
登入node 2後,輸入以下指令複製來自node 1的設定檔:
# cd /etc/openvpn/
# scp root@10.3.89.23:/etc/openvpn/server.conf .
# cd /etc/openvpn/keys/
# scp root@10.3.89.23:/etc/openvpn/keys/* .
4.4. 最後調整
分別登入node 1與node 2,並且設定系統自動開機時會執行Heartbeat服務,但不會執行OpenVPN服務,以達到開機後由Heartbeat控制OpenVPN之啟動與中止目標。指令為:
# chkconfig heartbeat on
# chkconfig openvpn off
之後再分別於node 1與node 2關閉OpenVPN服務:
# service openvpn stop
之後再分別於node 1與node 2啟動Heartbeat服務:
# service heartbeat start
經過一會兒後,於node 1執行以下指令,應可看到如圖1資訊:
# ifconfig
圖1 node 1主機網卡檢查1
仔細留意的話,可以發現系統上多出eth0:0以及tun0兩張網卡,並且分別使用10.3.89.50,以及10.8.0.1。
此外使用Heartbeat的偵測工具crm_mon,可以看到如圖2資訊,指令為:
# crm_mon –i 3
圖2 node 1主機Heartbeat狀態
其中可以看出,系統上由node 1虛擬出10.3.89.50,並且由node 1執行OpenVPN服務,此與圖1所顯示的資訊相符。
此外若於node 1主機上強制讓Heartbeat服務中止(模擬node 1主機移除Heartbeat控制的Cluster之外),亦即於node 1主機執行以下指令:
# service heartbeat stop
之後於node 1在執行ifconfig指令,發現原本多出之網卡自動消失了,如圖3所示:
圖3 node 1主機網卡檢查2
而於node 2主機執行crm_mon檢查Heartbeat狀態,可以發現目前10.3.89.50由node 2使用,並且開啟了OpenVPN服務,並且可以看到目前僅有node 2可以使用,如圖4所示:
圖4 node 2主機Heartbeat狀態
此時於node 2執行ifconfig指令,應可看到如圖5資訊:
圖5 node 2主機網卡檢查
最後若於node 1主機上再讓Heartbeat服務啟動(模擬node 1主機重回Heartbeat控制的Cluster之內),亦即於node 1主機執行以下指令:
# service heartbeat start
之後於node 1在執行ifconfig指令,可發現原本網卡又自動增加了,所以證明由node 1與node 2組合之OpenVPN伺服器具備高可用性。
5. 結論
在本篇文章中,筆者介紹使用開放源Heartbeat與OpenVPN套件建構高可用性之VPN伺服器,當環境建立完成後。使用者即可使用低成本,高可靠性的VPN伺服器,而這也比一般商業平台僅僅具備單一VPN伺服器來得可靠穩定,具備很高的價值。也期待讀者可以花點時間嘗試,過程中或許會有不同的發現,此外在本文中,僅僅探討建立VPN伺服器的過程,進一步探討的話,尚可整合Iptables防火牆套件於VPN伺服器上,使VPN伺服器可以進一步管控位於後端的網路環境,大大提升系統之安全管理能力,也供有興趣的讀者自行嘗試使用。
6. 附錄
以下為筆者系統中相關設定檔之內容,僅供設定參考。
(1)/etc/ha.d/ha.cf
use_logd yes
bcast eth0
auto_failback on
node node1 node2
crm on
(2)/etc/ha.d/authkeys
auth 1
1 sha1 yourSecretWord
(3)/etc/openvpn/server.conf
local 10.3.89.50
port 1194
proto udp
server 10.8.0.0 255.255.255.0
status openvpn-status.log
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
tls-auth /etc/openvpn/keys/ta.key 0
dh /etc/openvpn/keys/dh1024.pem
comp-lzo
dev tun
ifconfig-pool-persist ipp.txt
keepalive 10 30
max-clients 100
persist-key
persist-tun
verb 3
(4)/var/lib/heartbeat/crm/cib.xml
[cib admin_epoch=”0″ generated=”true” have_quorum=”true” ignore_dtd=”false” num_peers=”2″ cib_feature_revision=”1.3″ ccm_transition=”6″ dc_uuid=”afd93b03-f0fa-4f5c-a720-ad191db1ea99″ epoch=”7″ num_updates=”93″ cib-last-written=”Mon Nov 24 19:53:58 2008″]
[configuration]
[crm_config]
[cluster_property_set id=”cib-bootstrap-options”]
[attributes]
[nvpair id=”cib-bootstrap-options-symmetric-cluster” name=”symmetric-cluster” value=”true”/]
[nvpair id=”cib-bootstrap-options-no_quorum-policy” name=”no_quorum-policy” value=”stop”/]
[nvpair id=”cib-bootstrap-options-default-resource-stickiness” name=”default-resource-stickiness” value=”0″/]
[nvpair id=”cib-bootstrap-options-default-resource-failure-stickiness” name=”default-resource-failure-stickiness” value=”0″/]
[nvpair id=”cib-bootstrap-options-stonith-enabled” name=”stonith-enabled” value=”false”/]
[nvpair id=”cib-bootstrap-options-stonith-action” name=”stonith-action” value=”reboot”/]
[nvpair id=”cib-bootstrap-options-stop-orphan-resources” name=”stop-orphan-resources” value=”true”/]
[nvpair id=”cib-bootstrap-options-stop-orphan-actions” name=”stop-orphan-actions” value=”true”/]
[nvpair id=”cib-bootstrap-options-remove-after-stop” name=”remove-after-stop” value=”false”/]
[nvpair id=”cib-bootstrap-options-short-resource-names” name=”short-resource-names” value=”true”/]
[nvpair id=”cib-bootstrap-options-transition-idle-timeout” name=”transition-idle-timeout” value=”5min”/]
[nvpair id=”cib-bootstrap-options-default-action-timeout” name=”default-action-timeout” value=”5s”/]
[nvpair id=”cib-bootstrap-options-is-managed-default” name=”is-managed-default” value=”true”/]
[/attributes]
[/cluster_property_set]
[/crm_config]
[nodes]
[node id=”1d00ae5f-af7e-4ebf-bf79-dc7dd77cb40a” uname=”node1″ type=”normal”/]
[node id=”afd93b03-f0fa-4f5c-a720-ad191db1ea99″ uname=”node2″ type=”normal”/]
[/nodes]
[resources]
[group id=”group_1″]
[primitive id=”IPaddr_10_3_89_50″ provider=”heartbeat” type=”IPaddr”]
[operations]
[op id=”IPaddr_10_3_89_50_mon” interval=”5s” name=”monitor” timeout=”5s”/]
[/operations]
[instance_attributes id=”IPaddr_10_3_89_50_inst_attr”]
[attributes]
[nvpair id=”IPaddr_10_3_89_50_attr_0″ name=”ip” value=”10.3.89.50″/]
[/attributes]
[/instance_attributes]
[/primitive]
[primitive id=”openvpn_2″ provider=”heartbeat” type=”openvpn”]
[operations]
[op id=”openvpn_2_mon” interval=”120s” name=”monitor” timeout=”60s”/]
[/operations]
[/primitive]
[/group]
[/resources]
[constraints]
[rsc_location id=”rsc_location_group_1″ rsc=”group_1″]
[rule id=”prefered_location_group_1″ score=”100″]
[expression attribute=”#uname” id=”prefered_location_group_1_expr” operation=”eq” value=”node1″/]
[/rule]
[/rsc_location]
[/constraints]
[/configuration]
[/cib]
========
高可用度 OpenVPN 伺服器實例分享
作者:國家資通安全會報技術服務中心 林志堯
1. 前言
在網際網路服務可用度越來越要求的情況下,有關於電腦系統如何達到此要求也越來越受重視,其中最為人所知的技術便是所謂的Cluster技術,中文稱為叢集技術。在電腦系統中,所謂的Cluster技術,因應不同的需求也有不同的應用,主要有High-availability (HA) clusters;Load-balancing clusters與Compute clusters。High-availability (HA) clusters,又稱為Failover Clusters,主要的用意在於對於重要之伺服器,建立其他的分身,以當原來之伺服器出問題,無法持續提供服務時,便由分身接手提供服務,確保服務之品質;而Load-balancing clusters則是結合多台主機,但以單獨之主機面貌來面對使用者提出之需求,對使用者而言看起來像是一台伺服器,但實際上使用多台主機進行負載平衡;而Compute clusters則是結合多台主機,以強化計算效能,用來執行較複雜之計算,例如氣象或汽車碰撞模擬等等。
不同的Cluster技術有不同之應用環境,所以在之前的技術專欄,例如:「建構高可用性的OpenVPN伺服器」,實際上所使用的技術是屬於High-availability (HA) clusters之技術,亦即主要服務皆由單一主機提供,並且增加其他之主機,以當原有主機出現問題時,由其他主機接手服務。在此篇文章中,將針對「建構高可用性的OpenVPN伺服器」的內容擴充說明,以利讀者評估採用。
2. 環境說明
在前次文章所提之高可用性的OpenVPN伺服器中,雖然成功使用HeartBeat套件(用來實現High-availability (HA) clusters之用途)與OpenVPN套件,建立高可用性之OpenVPN伺服器。但是前次內容所建立之VPN伺服器,實際的使用場合可能較受限制,原因在於所用的VPN伺服器是屬於單一網卡之環境,因此對於與單位組織內其他伺服器主機之整合上會有問題,結果變成有如孤島之伺服器。因此在此將其進一步擴充,亦即在VPN伺服器上,由原先的單一網卡,增加為兩張網卡,並啟用其中的網卡間封包轉送功能,使其具備routing用途,以利單位組織內伺服器與Internet之溝通連結,有關系統架構圖如圖1所示:
圖1 VPN伺服器叢集架構
3. 設定說明
3.1. HeartBeat設定
首先請依照一般方式進行HeartBeat與OpenVPN套件之安裝,在此所使用的Fedora 7的作業系統。分別使用yum工具安裝,安裝後的套件,分別為HeartBeat 2.0.8版與OpenVPN 2.1-0.19版。接下來依照以下之順序編輯HeartBeat的相關設定檔。
複製官方提供之設定範本檔至相關目錄:
# cp /usr/share/doc/heartbeat-2.0.8/ha_logd.cf /etc/logd.cf
# cp /usr/share/doc/heartbeat-2.0.8/ha.cf /etc/ha.d/
# cp /usr/share/doc/heartbeat-2.0.8/authkeys /etc/ha.d/
修改/etc/logd.cf
確認存在logfacility daemon資訊,以讓HeartBeat紀錄存在於/var/log/message中
修改ha.cf
修改此HeartBeat的主要設定檔,令其有如下資訊:
use_logd yes
ucast eth0 other_node’s_ip
auto_failback on
node openvpn1 openvpn2
crm on
其中比較特別不同的地方,在於先前技術文章所用的是mcast eth0的方式,來與其他叢集節點(node)進行溝通,但因為這樣的方式是屬於廣播的形式,所以會造成較多的垃圾封包,所以在此改為使用ucast方式,並且限定與其連結的另一節點的ip (若有更多其他節點,則其他節點ip以空格區別),以作為彼此溝通。另外node後面所接的是兩個節點的主機名稱,分別為openvpn1與openvpn2,需要確保的是彼此可以該主機名稱進行溝通即可。
修改authkeys
請修改此檔,令其如下:
auth 1
1 sha1 yoursecert
其中yoursecert為不同節點間彼此溝通的密語。
以上的設定,兩個VPN伺服器主機上皆須設定相同,不同之處僅在於其中ha.cf的ucast所設定的ip剛好互為彼此的ip。
3.2. OpenVPN設定
在OpenVPN的設定中,主要設定的為設定檔與產生相關的金鑰,設定檔中唯一要注意的是服務所監聽的ip須為兩個節點組成Cluster後所使用的IP,例如節點1的配置於eth0(與Internet連結)的ip為172.16.0.2,而節點2的ip為172.16.0.3,而兩節點組成叢集後對外代表的ip為172.16.0.1的話,則須於OpenVPN的設定檔中,設定172.16.0.1為所監聽使用的ip。原因在於HeartBeat實現High-availability (HA) clusters的作法為各節點保留各自的ip位置,而代表對外的ip,則視目前適合由何節點使用,則給該節點使用,因此代表對外的ip有可能於各節點間移動,所以OpenVPN伺服器應該指定代表的ip作為對外服務之ip。另外面對伺服器組的eth1網卡介面的ip,則例如節點1的配置於eth1(與Internet連結)的ip為192.168.0.2,而節點2的ip為192.168.0.3,而主要代表的ip為192.168.0.1。
至於OpenVPN用來提供使用者連結所需之金鑰,則同樣於節點1與節點2皆要有相同的金鑰,以確保OpenVPN的使用者可以正常連結使用,不因現在提供服務的是節點1或節點2而有所差異。
3.3. 叢集設定說明
請分別於節點1與節點2設定,將/etc/ha.d/haresources的檔案修改如下:
openvpn1 172.16.0.1 openvpn
openvpn1 IPaddr::192.168.0.1
以上的設定中,第一行指的是設定openvpn服務於172.16.0.1此ip上,並且預設提供服務的是openvpn1這台主機,而第二行的設定代表192.168.0.1此ip,預設亦由openvpn1提供。設定完以後,分別於兩台主機執行以下指令,以產生HeartBeat所使用的叢集設定檔:
# python /usr/lib/heartbeat/haresources2cib.py /etc/ha.d/haresources
因為Heartbeat預設用來控制OpenVPN啟動的執行檔,並非使用標準的Linux開機程序—Linux Standard Base (LSB),而是使用Heartbeat類型。然而上述由/etc/init.d/openvpn複製而來的OpenVPN啟動程序屬於LSB格式,所以需要針對cib.xml稍作修改調整,將其中的heartbeat類型改為lsb類型,避免Heartbeat監控結果有誤。方法為將cib.xml之中的
<primitive id=”openvpn_2″ provider=”heartbeat” type=”openvpn”>
改為
<primitive id=”openvpn_2″ provider=”heartbeat” type=”openvpn”>
之後分別於兩節點上執行crm_mon –i 5指令,若可發現兩節點皆為online狀態,並且分別看到ip與openvpn皆由節點1提供服務的資訊即成功。
3.4. 防火牆設定說明
由於VPN伺服器作為連結Internet與內部伺服器組的用途,因此需要特別於VPN伺服器上設定轉發eth0與eth1的封包,以達到routing封包的需求,以及需設定iptables防火牆,以保護伺服器組之安全。
其中轉發不同網卡之封包的方式為設定以下系統設定(可包含於iptables的設定檔中):
sysctl -w net.ipv4.ip_forward=1
至於iptables的設定檔,則設定允許OpenVPN的封包至eth0介面,並且對於因OpenVPN啟動後虛擬出的tun介面,設定對應的存取需求。例如:
# Define firewall rules of tunnel interface (tun+) needed by connected via VPN
# Allow incoming packets to TCP port 22 from VPN tunnel
iptables -i tun+ -A INPUT -p tcp ”dport 22 -j ACCEPT
# Allow icmp ping packet between VPN tunnel
iptables -i tun+ -A INPUT -p icmp -j ACCEPT
# Allow incoming packets to TCP port 22 from Local LAN
iptables -i $SVR_IFACE -A INPUT -p tcp ”dport 22 -j ACCEPT
# Allow icmp ping packet between Local LAN
iptables -i $SVR_IFACE -A INPUT -p icmp -j ACCEPT
# Allow incoming packets to TCP port 10000 for VPN connection
iptables -i $INET_IFACE -A INPUT -p tcp ”dport 10000 -j ACCEPT
# Allow incoming packets to UDP port 694 of this system for heartbeat cluster.
iptables -i $INET_IFACE -A INPUT -p udp -s $SOCMON ”dport 694 -j ACCEPT
3.5. 注意事項說明
由於HeartBeat使用網路方式進行彼此狀態溝通,預設使用的UDP port 694進行溝通,所以須確保各節點間的UDP 694是互相開放的,否則會出現大問題。像筆者就曾經遇過這個問題,造成的結果是各節點不清楚彼此的狀態,造成各節點都認為對方當掉,無法提供服務,導致各節點皆提供服務與使用相同的代表ip,所以原本應該僅有一台主機提供服務的情況,變成多台主機同時提供服務的錯亂情況,無法正常運作了,經過反覆檢查方發現是防火牆之問題。
4. 結語
在本文中,以實例方式說明使用HeartBeat與Openvpn建立供VPN用戶端可連結使用單位組織之伺服器組的方式,主要的設定說明之外,亦提供設定上須特別注意的說明。若對於相關細部設定上有疑問的話,建議可在查詢相關套件之說明文件,並實際嘗試試用,應該能體會到它的便利性。