在 CentOS5 上安裝 OpenVPN
1. 引言
1.1. Draft
This page is draft. Please send suggestions and/or corrections to EdHeron.
1.2. 關於
本文檔嘗試為 CentOS 5 安裝 OpenVPN 提供提示。
1.3. 先決條件
建議用最新版 CentOS 5。
1.4. 聲明
這裡不提供任何保證。要是你的系統損壞了,你要收拾殘局。
2. 軟件安裝
OpenVPN 並非上游發行版本的一部份。有些志同道合的朋友把它編譯好,建立 RPM 並存放在可供分享的地方。
2.1. 加入 RPMForge 軟件庫
有關軟件庫的資訊可在可供 CentOS 使用的軟件庫頁內找到。
安裝 RPMForge 軟件庫的教學文檔已收錄在安裝 RPMForge 頁內。
2.2. 選擇性建議:停用軟件庫
第三方軟件庫內有很多套件。當中有些是官方套件的代替品。當你進行安裝,安裝第三方的套件也許並不理想。停用一個軟件庫能防止它被誤用。
你可以這樣停用 RPMForge 軟件庫
sed --in-place "s/\\(.*enabled.*=\\).*/\1 0/" /etc/yum.repos.d/rpmforge.repo
2.3. 安裝 OpenVPN
新增 RPMForge 軟件庫後,你只須這樣便能安裝 OpenVPN
yum --enablerepo rpmforge install openvpn
3. 憑證
3.1. 設定目錄
建立憑證用的目錄只需位於一個地方。建議的位置是一台擁有較嚴緊存取限制,甚至有實體存取限制的管理用機器。你必須製作備份。假如憑證機構的金鑰檔落在錯的手中,他們便能建立金鑰來存取你的 VPN。另外,要是你遺失了憑證機構的金鑰檔,你必須建立新的金鑰檔,繼而要重建所有現存的憑證。
建立憑證的腳本都放置在 /usr/share/doc/openvpn-*/easy-rsa/。那悝有多個版本的腳本。我們採用的是第 2 版。請把該目錄內的檔案複製至某處,以免它們被更改,或因升級而消失。
mkdir ~/easy-rsa cp -Rv /usr/share/doc/openvpn-*/easy-rsa/2.0/* ~/easy-rsa/
進入該目錄內
cd ~/easy-rsa
按你的需要編輯vars。特別要修改包括 KEY_COUNTRY、KEY_PROVINCE、KEY_CITY、KEY_ORG 和 KEY_EMAIL。
把腳本設成可執行的
chmod u+x clean-all build-ca whichopensslcnf build-dh build-key pkitool build-key-server
3.2. 設定環境
任何時候你要用 easy-rsa 腳本,請進入該目錄並設定環境
cd ~/easy-rsa . ./vars
3.3. 洗理金鑰目錄
建立一個清潔的金鑰目錄來收藏被建立的金鑰。此步驟只須做一次,否則你將會遺失現有的憑證:
./clean-all
3.4. Diffie Hellman 檔
Diffie Hellman 參數常被應用,讓加密憑證在不安全的媒體上能較安全地被交換。
檔案的建立方法是
./build-dh
所有伺服器及客端都需要此檔案。
3.5. 建立憑證機構
為要設立相互的信任,你必須建立一個主金鑰來簽署所有憑證。它會被用作簽署其他憑證之用。
./build-ca
名為 ca.key 及 ca.crt 的檔案應該已被建立在 keys/ 內。ca.key 檔是你的私鑰,它不必在其他地方出現。ca.crt 檔必須在所有建立或接收 OpenVPN 連線的電腦上。
4. 設定伺服器
4.1. 建立憑證
在我們的 easy-rsa 目錄裡,按需要執行 vars 腳本後,連同伺服器的公用名稱執行建立伺服器金鑰的腳本,並且輸入其它所需的資訊。舉個例說,我們可以稱伺服器為 main。
./build-key-server main
main.key、main.csr 及 main.crt 檔應該已被建立在 keys/ 內。key 檔是私鑰。csr 檔是中轉檔,是簽署憑證的要求。crt 檔是憑證。
4.2. 設定檔
設定檔控制 OpenVPN 端點的每個細節。它位於 /etc/openvpn/ 內,也可隨意命名,唯獨必須以 .conf 結束檔名。由於每個端點都有獨特之處,你可透過名稱來簡化它們的管理。承接上述例子,建議的檔名是 main.conf。
4.2.1. Tun 相對 Tap
設置一台伺服器的方法多不勝數。Tun 或 Tap 可能是最大的決擇。
Tun 會為 VPN 的兩端建立一個獨特的子網絡隧道。你必須指派一個網絡給每台伺服器。
Tap 會分接通現存的網絡並分配一個本地的 IP 位址給遠端。Tap 須要在分配本地位時(DHCP?)與 OpenVPN 伺服器作出合作。一般來說,某系列 IP 位址會被預留給遠端用戶。採用 tap 的主要好處就是網絡廣播可達至遠端的端點。
在這裡我們選用 Tun,因為它不依賴於本地的網絡設定,也不會重疊。
tun
4.2.2. 埠號
預設的埠號是 1194。然而,某些 wi-fi 熱點,甚至乎網絡供應商會限制 1194 號埠。我當地的 Dunkin Donuts 就是一個例子。暫時我們先採用預設值。
port 1194
4.2.3. UDP 相對 TCP
UDP 使用較少頻寬,但 TCP 能在不可靠的連線上維繫 VPN 的接線。除非遇上問題,我們會採用 UDP。
proto udp
4.2.4. 客端通訊
要讓客端「看見」對方,請加入
client-to-client
4.2.5. 壓縮封包
要減低頻寬,選用壓縮
comp-lzo
4.2.6. 指定 Diffie Hellman 檔
加入
dh dh1024.pem
4.2.7. 加入持久連線
為協助偵測被遺棄的連線,加入
keepalive 10 120
4.2.8. 把用戶降級
為減低安全性風險,請把 OpenVPN 的用戶改為 nobody。 要把用戶降級,加入
user nobody group nobody
4.2.9. 橫跨重新啟動
通過儲存只有在開機時可存取的資訊,嘗試橫跨重新啟動。加入
persist-key persist-tun
4.2.10. 狀況日誌
要設定狀況檔,加入
status openvpn-status.log
4.2.11. 設定日誌級別
要設定日誌級別,加入
verb 3
4.2.12. 維持客端 IP
建立一個檔案來記錄客端的 IP,好讓它們在連線及伺服器重新開機前後能一致。加入
ifconfig-pool-persist ipp.txt
4.2.13. 指定憑證檔
伺服器需要存取憑證機構的憑證,及自己的私鑰和憑證檔。加入
ca ca.crt cert main.crt key main.key
4.2.14. 本地 IP 位址
指定一個對外的 IP 位置。加入
local xxx.xxx.xxx.xxx
4.2.15. 設定 Tunnel 網絡
此設定在每個伺服器上都必須是獨特的。每個端點/用戶要被分配一個 2 位元的子網絡(4 個位置),因此標準的 24 位元網絡可容納 64 個端點。要是你需要更多端點,請採用較大的網絡。
若最多只需 64 個端點,我們可加入
server 192.168.5.0 255.255.255.0
若要容納更多端點,我們可加入
server 10.5.0.0 255.255.0.0
4.2.16. 加入本地路線
要讓遠端端點知道有甚麼存在,加入本地網絡及網絡遮罩
push "route 192.168.1.0 255.255.255.0"
4.2.17. 加入本地 DNS 伺服器
要讓遠端端點知道關於內部 DNS 伺服器,加入該台機器的 IP 位址
push "dhcp-option DNS 192.168.1.251"
4.2.18. 加入本地 WINS 伺服器
要讓遠端端點知道關於本地的 WINS 伺服器,好讓 MS Windows 客端能瀏覧資源,加入該台伺服器的 IP 位址
push "dhcp-option WINS 192.168.1.201"
4.2.19. 總結
我們的範例設定檔,main.conf,或許會是這個樣子
tun port 1194 proto udp client-to-client comp-lzo dh dh1024.pem keepalive 10 120 user nobody group nobody persist-key persist-tun status openvpn-status.log verb 3 ifconfig-pool-persist ipp.txt ca ca.crt cert main.crt key main.key local xxx.xxx.xxx.xxx server 192.168.5.0 255.255.255.0 push "route 192.168.1.0 255.255.255.0" push "dhcp-option DNS 192.168.1.251" push "dhcp-option WINS 192.168.1.201"
4.3. 安裝檔案到伺服器上
要設定一台 OpenVPN 伺服器,
* 安裝 RPMForge 軟件庫
* 安裝 OpenVPN
* 複製 ca.crt、main.key、main.crt、dh1024.pem、main.conf 到 /etc/openvpn/
* 啟動 OpenVPN
service openvpn start
* 在開機時啟用 openvpn
chkconfig openvpn on
5. 客端設定
在這個範例裡,我們會設置一台沒有本地路由網絡的客端。這對流動一族很有用。我們只會描述針對 CentOS 客端的程序。關於微軟 Windows 客端的資訊,請參閱 OpenVPN 的教學文檔。此外,你亦可在一台已破解的 iPad 上設置 OpenVPN,但它已超越此文的範疇。
5.1. 建立憑證
在我們的 easy-rsa 目錄裡,按需要執行 vars 腳本後,連同客端的公用名稱執行建立金鑰的腳本,並且輸入其它所需的資訊。舉個例說,我們的客端或許名為 ed。
./build-key ed
ed.key、ed.csr 及 ed.crt 檔應該已被建立在 keys/ 內。key 檔是私鑰。csr 檔是中轉檔,是簽署憑證的要求。crt 檔是憑證。
5.2. 設定檔
設定檔必須仿效伺服器的設定及加入客端專用的選項。由於它是用來與一台特定的伺服器連線,你可採用客端及伺服器的名稱來為它命名,譬如:ed-main.conf。這容讓該客端連線到多台伺服器。
5.2.1. 仿效伺服器的設定
在我們的範例中,必須相定的設定包括
dev tun proto udp comp-lzo
5.2.2. 指定為客端
利用 client 選項來表示我們是一台端。加入
client
5.2.3. 埠號
客端無須指定連接埠。事實上,這個決定背後有數個原因,但我不會在此詳述。
nobind
5.2.4. 把用戶降級
這與伺服器相若,原因亦一樣,縱使設定不須等同。加入
user nobody group nobody
5.2.5. 橫跨重新啟動
通過儲存只有在開機時可存取的資訊,嘗試橫跨重新啟動。加入
persist-key persist-tun
5.2.6. 指定憑證檔
客端需要存取憑證機構的憑證,及自己的私鑰和憑證檔。加入
ca ca.crt cert ed.crt key ed.key
5.2.7. 重試 DNS
如果伺服器是以主機名稱來指定,延伸解析的重試時限也許會有好處。加入
resolv-retry infinite
5.2.8. 伺服器地址
伺服器的地址可透過 IP 位址或主機名稱來指定,但該名稱必須能被解析。IP 位址也許也較快連線,但不適用於改變 IP 位址的伺服器。請包括伺服器的連接埠。
remote xxx.xxx.xxx.xxx 1194
5.2.9. 要求遠端是伺服器
要求遠端的憑證擁有伺服器的旗標。加入
ns-cert-type server
5.2.10. 總結
我們的範例設定檔,ed.conf,或許會是這個樣子
dev tun proto udp comp-lzo client nobind user nobody group nobody persist-key persist-tun ca ca.crt cert ed.crt key ed.key resolv-retry infinite remote xxx.xxx.xxx.xxx 1194 ns-cert-type server
5.3. 安裝檔案到客端上
要設定一台 OpenVPN 客端,
* 安裝 RPMForge 軟件庫
* 安裝 OpenVPN
* 複製 ca.crt、ed.key、ed.crt、dh1024.pem、ed-main.conf 到 /etc/openvpn/
* 啟動 OpenVPN
service openvpn start
* 在開機時啟用 openvpn
chkconfig openvpn on
6. 額外資訊
OpenVPN 教學程式 Diffie Hellman 是甚麼?
Translation of revision 14