在 CentOS5 上安裝 OpenVPN

引言

Draft

This page is draft. Please send suggestions and/or corrections to EdHeron.

關於

本文檔嘗試為 CentOS 5 安裝 OpenVPN 提供提示。

先決條件

建議用最新版 CentOS 5。

聲明

這裡不提供任何保證。要是你的系統損壞了,你要收拾殘局。

軟件安裝

OpenVPN 並非上游發行版本的一部份。有些志同道合的朋友把它編譯好,建立 RPM 並存放在可供分享的地方。

加入 RPMForge 軟件庫

有關軟件庫的資訊可在可供 CentOS 使用的軟件庫頁內找到。

安裝 RPMForge 軟件庫的教學文檔已收錄在安裝 RPMForge 頁內。

選擇性建議:停用軟件庫

第三方軟件庫內有很多套件。當中有些是官方套件的代替品。當你進行安裝,安裝第三方的套件也許並不理想。停用一個軟件庫能防止它被誤用。

你可以這樣停用 RPMForge 軟件庫

sed --in-place "s/\\(.*enabled.*=\\).*/\1 0/" /etc/yum.repos.d/rpmforge.repo

安裝 OpenVPN

新增 RPMForge 軟件庫後,你只須這樣便能安裝 OpenVPN

yum --enablerepo rpmforge install openvpn

憑證

設定目錄

建立憑證用的目錄只需位於一個地方。建議的位置是一台擁有較嚴緊存取限制,甚至有實體存取限制的管理用機器。你必須製作備份。假如憑證機構的金鑰檔落在錯的手中,他們便能建立金鑰來存取你的 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_COUNTRYKEY_PROVINCEKEY_CITYKEY_ORGKEY_EMAIL

把腳本設成可執行的

chmod u+x clean-all build-ca whichopensslcnf build-dh build-key pkitool build-key-server

設定環境

任何時候你要用 easy-rsa 腳本,請進入該目錄並設定環境

cd ~/easy-rsa
. ./vars

洗理金鑰目錄

建立一個清潔的金鑰目錄來收藏被建立的金鑰。此步驟只須做一次,否則你將會遺失現有的憑證:

./clean-all

Diffie Hellman 檔

Diffie Hellman 參數常被應用,讓加密憑證在不安全的媒體上能較安全地被交換。

檔案的建立方法是

./build-dh

所有伺服器及客端都需要此檔案。

建立憑證機構

為要設立相互的信任,你必須建立一個主金鑰來簽署所有憑證。它會被用作簽署其他憑證之用。

./build-ca

名為 ca.keyca.crt 的檔案應該已被建立在 keys/ 內。ca.key 檔是你的私鑰,它不必在其他地方出現。ca.crt 檔必須在所有建立或接收 OpenVPN 連線的電腦上。

設定伺服器

建立憑證

在我們的 easy-rsa 目錄裡,按需要執行 vars 腳本後,連同伺服器的公用名稱執行建立伺服器金鑰的腳本,並且輸入其它所需的資訊。舉個例說,我們可以稱伺服器為 main

./build-key-server main

main.key、main.csr 及 main.crt 檔應該已被建立在 keys/ 內。key 檔是私鑰。csr 檔是中轉檔,是簽署憑證的要求。crt 檔是憑證。

設定檔

設定檔控制 OpenVPN 端點的每個細節。它位於 /etc/openvpn/ 內,也可隨意命名,唯獨必須以 .conf 結束檔名。由於每個端點都有獨特之處,你可透過名稱來簡化它們的管理。承接上述例子,建議的檔名是 main.conf。

Tun 相對 Tap

設置一台伺服器的方法多不勝數。Tun 或 Tap 可能是最大的決擇。

Tun 會為 VPN 的兩端建立一個獨特的子網絡隧道。你必須指派一個網絡給每台伺服器。

Tap 會分接通現存的網絡並分配一個本地的 IP 位址給遠端。Tap 須要在分配本地位時(DHCP?)與 OpenVPN 伺服器作出合作。一般來說,某系列 IP 位址會被預留給遠端用戶。採用 tap 的主要好處就是網絡廣播可達至遠端的端點。

在這裡我們選用 Tun,因為它不依賴於本地的網絡設定,也不會重疊。

tun

埠號

預設的埠號是 1194。然而,某些 wi-fi 熱點,甚至乎網絡供應商會限制 1194 號埠。我當地的 Dunkin Donuts 就是一個例子。暫時我們先採用預設值。

port 1194

UDP 相對 TCP

UDP 使用較少頻寬,但 TCP 能在不可靠的連線上維繫 VPN 的接線。除非遇上問題,我們會採用 UDP。

proto udp

客端通訊

要讓客端「看見」對方,請加入

client-to-client

壓縮封包

要減低頻寬,選用壓縮

comp-lzo

指定 Diffie Hellman 檔

加入

dh dh1024.pem

加入持久連線

為協助偵測被遺棄的連線,加入

keepalive 10 120

把用戶降級

為減低安全性風險,請把 OpenVPN 的用戶改為 nobody。 要把用戶降級,加入

user nobody
group nobody

橫跨重新啟動

通過儲存只有在開機時可存取的資訊,嘗試橫跨重新啟動。加入

persist-key
persist-tun

狀況日誌

要設定狀況檔,加入

status openvpn-status.log

設定日誌級別

要設定日誌級別,加入

verb 3

維持客端 IP

建立一個檔案來記錄客端的 IP,好讓它們在連線及伺服器重新開機前後能一致。加入

ifconfig-pool-persist ipp.txt

指定憑證檔

伺服器需要存取憑證機構的憑證,及自己的私鑰和憑證檔。加入

ca ca.crt
cert main.crt
key main.key

本地 IP 位址

指定一個對外的 IP 位置。加入

local xxx.xxx.xxx.xxx

設定 Tunnel 網絡

此設定在每個伺服器上都必須是獨特的。每個端點/用戶要被分配一個 2 位元的子網絡(4 個位置),因此標準的 24 位元網絡可容納 64 個端點。要是你需要更多端點,請採用較大的網絡。

若最多只需 64 個端點,我們可加入

server 192.168.5.0 255.255.255.0

若要容納更多端點,我們可加入

server 10.5.0.0 255.255.0.0

加入本地路線

要讓遠端端點知道有甚麼存在,加入本地網絡及網絡遮罩

push "route 192.168.1.0 255.255.255.0"

加入本地 DNS 伺服器

要讓遠端端點知道關於內部 DNS 伺服器,加入該台機器的 IP 位址

push "dhcp-option DNS 192.168.1.251"

加入本地 WINS 伺服器

要讓遠端端點知道關於本地的 WINS 伺服器,好讓 MS Windows 客端能瀏覧資源,加入該台伺服器的 IP 位址

push "dhcp-option WINS 192.168.1.201"

總結

我們的範例設定檔,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"

安裝檔案到伺服器上

要設定一台 OpenVPN 伺服器,

* 安裝 RPMForge 軟件庫

* 安裝 OpenVPN

* 複製 ca.crt、main.key、main.crt、dh1024.pem、main.conf 到 /etc/openvpn/

* 啟動 OpenVPN

service openvpn start

* 在開機時啟用 openvpn

chkconfig openvpn on

客端設定

在這個範例裡,我們會設置一台沒有本地路由網絡的客端。這對流動一族很有用。我們只會描述針對 CentOS 客端的程序。關於微軟 Windows 客端的資訊,請參閱 OpenVPN 的教學文檔。此外,你亦可在一台已破解的 iPad 上設置 OpenVPN,但它已超越此文的範疇。

建立憑證

在我們的 easy-rsa 目錄裡,按需要執行 vars 腳本後,連同客端的公用名稱執行建立金鑰的腳本,並且輸入其它所需的資訊。舉個例說,我們的客端或許名為 ed

./build-key ed

ed.key、ed.csr 及 ed.crt 檔應該已被建立在 keys/ 內。key 檔是私鑰。csr 檔是中轉檔,是簽署憑證的要求。crt 檔是憑證。

設定檔

設定檔必須仿效伺服器的設定及加入客端專用的選項。由於它是用來與一台特定的伺服器連線,你可採用客端及伺服器的名稱來為它命名,譬如:ed-main.conf。這容讓該客端連線到多台伺服器。

仿效伺服器的設定

在我們的範例中,必須相定的設定包括

dev tun
proto udp
comp-lzo

指定為客端

利用 client 選項來表示我們是一台端。加入

client

埠號

客端無須指定連接埠。事實上,這個決定背後有數個原因,但我不會在此詳述。

nobind

把用戶降級

這與伺服器相若,原因亦一樣,縱使設定不須等同。加入

user nobody
group nobody

橫跨重新啟動

通過儲存只有在開機時可存取的資訊,嘗試橫跨重新啟動。加入

persist-key
persist-tun

指定憑證檔

客端需要存取憑證機構的憑證,及自己的私鑰和憑證檔。加入

ca ca.crt
cert ed.crt
key ed.key

重試 DNS

如果伺服器是以主機名稱來指定,延伸解析的重試時限也許會有好處。加入

resolv-retry infinite

伺服器地址

伺服器的地址可透過 IP 位址或主機名稱來指定,但該名稱必須能被解析。IP 位址也許也較快連線,但不適用於改變 IP 位址的伺服器。請包括伺服器的連接埠。

remote xxx.xxx.xxx.xxx 1194

要求遠端是伺服器

要求遠端的憑證擁有伺服器的旗標。加入

ns-cert-type server

總結

我們的範例設定檔,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

安裝檔案到客端上

要設定一台 OpenVPN 客端,

* 安裝 RPMForge 軟件庫

* 安裝 OpenVPN

* 複製 ca.crt、ed.key、ed.crt、dh1024.pem、ed-main.conf 到 /etc/openvpn/

* 啟動 OpenVPN

service openvpn start

* 在開機時啟用 openvpn

chkconfig openvpn on

額外資訊

OpenVPN 教學程式 Diffie Hellman 是甚麼?

Translation of revision 14

TimothyLee/zh-tw CentOS5OpenVPN (last edited 2012-03-16 06:47:38 by TimothyLee)