2007年5月14日 星期一

OpenVPN 與金鑰的搭配使用

重點說明

這次要設定的 OpenVPN,要搭配 X.509 certificate 一同設定;基本上,針對安全性相關檔案的部分,有以下幾項工作必須完成:
  1. 自行建置 CA(certificate authority)外
  2. 必須使用 CA 產生給 vpn server 以及 vpn client 用的 key pair,用於身份辨識之用
  3. 使用 openssl 工具產生 Diffie-Hellman 加密檔,作為資料交換加密之用


環境介紹

這裡所測試的環境,還是與上一篇 static key VPN 所使用的環境一樣,只是這次改用 X.509 certificate 將安全性更為提升,以下用圖示來說明:



設定前的準備

在設定 vpn 前,必須準備以下檔案:

VPN Server
  • CA certificate
  • vpn server certificate
  • vpn server key (務必妥善保護)
  • Diffie-Hellman Key (務必妥善保護)

VPN Client
  • CA certificate
  • vpn client certificate
  • vpn client key (務必妥善保護)

其中 CA 的建置與 key pair 的產生,這邊就不作說明了,詳情可參考之前寫的文章「CA建置(1) - Self-Signed CA 」。

剩下的就只有 Diffie-Hellman Key 的產生了,在一般的教學中會指導使用者怎麼透過 easy-rsa utility 來產生,不過我看了一下原始碼,其實他還是透過 openssl 的指令去產生出來的,況且上面的連結所說明 server 以及 client 的 certificate 與 key 的部分,也不是用 easy-rsa 所產生的,因此這邊不打算用 easy-rsa 來作。

講了一堆廢話,要怎麼作呢? 假設我們要作一個 2048 bit 加密的 key,可用以下指令:
# 參數說明: # dhparam:指定產生 Diffie-Hellman Key
# -out:輸出檔案

# dh2048.pem:輸出檔案名稱
# 2048:表示要加密的長度為 2048 bit

openssl dhparam -out dh2048.pem 2048
整個過程需要蠻長一段時間,如此一來,Diffie-Hellman Key 就順利產生了。

接著透過 scp 將檔案分別傳給 vpn server 以及 client,接下來就準備進行設定工作了。


VPN 設定

vpn server
dev tun

# 使用 TLS mode,並指定用來加密傳輸的 key file
tls-server
tls-auth keys/ta.key 0

# 金鑰相關設定
ca keys/cacert.pem
cert keys/vpn_server_cert.pem
key keys/vpn_server_key.pem

# server 與 client 之間交換金鑰時的加密用檔案
dh keys/dh2048.pem

# 設定啟用時所需密碼的檔案位置 # 有此設定就不需要再輸入密碼了
askpass keys/startup_password

# 設定 client 所分配的 ip 網段
server 10.8.0.0 255.255.255.0

# 紀錄 client 連線資訊的檔案
ifconfig-pool-persist ipp.txt

# 傳給 client 使用的設定檔
# 「redirect-gateway def1」是讓 client 所有的網路流量都透過 vpn server 進出

# 若 vpn server 及 client 在同一個實體網段內,則必須多加上「local」,若沒有,在同網段連上 vpn server 的電腦會無法連外喔!

#push "redirect-gateway local def1"

push "redirect-gateway def1"

# 設定 client 連至內部網路的的 routing 資訊
push "route 192.168.0.0 255.255.255.0"

# server 每 10 發送 ping 指令到 client,確定 client 持續連線
# 若 client 沒有回應,每 120 秒重試一次

keepalive 10 120

# 傳輸資料前進行壓縮
comp-lzo

# 同時最多 10 個 client
max-clients 10

# 以非 root 的身份啟動 vpn service
user nobody
group nogroup

# 以 daemon 的方式啟動 vpn service
daemon

# 不重複讀取 key file # 不重開 TUN 裝置
# 當用非 root 的使用者開啟服務時,必須要有以下兩個設定

persist-key
persist-tun

# Log 資訊
status openvpn-status.log
log openvpn.log
log-append openvpn.log
vpn client
# VPN server 的位址
remote 221.169.40.120

# 以 TLS mode 進行連線
tls-client
tls-auth keys/ta.key 1

# 從 VPN server 取得相關設定
pull

# 指定使用的裝置為 TUN
dev tun

# 金鑰相關設定
ca keys/cacert.pem
cert keys/vpn_client_cert.pem
key keys/vpn_client_key.pem

# 傳輸資料前進行壓縮
comp-lzo

接著,為了讓網路流量可以完全經由 vpn server,因此 server 必須執行以下兩行指令:
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ppp0 -j MASQUERADE
其他的問題,就是檢查相關檔案所擺放的路徑是否正確了!


【後記】
後來發現,若 server 與 client 在同一網段內, server.conf 中的 push 設定中,不加上「local」也可以讓網路流量都走 vpn tunnel 順利上網。


參考連結:
  1. OpenVPN 建置方案
  2. 使用 OpenVPN
  3. OpenVPN(Debian)
  4. StudyArea - vpn一問,請高手幫忙一下
  5. OpenVPN 2.0 HOWTO
  6. OpenVPN FAQ
  7. OpenVPN HOWTO
  8. OpenVPN 2.1 Man Page

沒有留言:

張貼留言