2015年10月18日 星期日

CentOS 6 建立私有 OpenVPN,想要穩定又快速的 VPN 不求人

近年 OpenVPN 頗為流行,尤其是在 Line 跨區載貼圖時期更是廣為人知,以往我在使用 VPN 的時候除了設備上的 site to site 以外就是使用 PPTP 加上 MSCHAP 或 MPPE 來達到加密的功能。

 

OpenVPN 是一個著重於加密型態的 VPN,基於 OpenSSL 的加密形式,可以相容於 Windows、OSX、Linux、Android、iOS 等裝置上,溝通於單一個連接埠,預設為 UDP 1194

 

對於企業來說 OpenVPN 更適用於 site to site 不中斷連接,OpenVPN 的穩定性以及加密都有頗高的水準,因為是採用 OpenSSL 所以可以進行憑證加密通道

 

然而他的跨平台相容性非常高,拿來作為一般使用者使用也是頗穩定,不過缺點是必須在安裝相對應的軟體,如 Tunnelblick (Mac)、OpenVPN (Windows)

 



 

 

CentOS 6 安裝 OpenVPN Server

 

Step.1 安裝 OpenVPN 套件
$ rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm 
$ yum install openvpn easy-rsa -y

 

 

Step.2 從範例複製一份 server.conf 設定檔,並設定以下參數
$ cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/ 
$ vim /etc/openvpn/server.conf

#OpenVPN的通道
port 1194
proto udp

#使用 tun mode
dev tun

#伺服器和 ca 憑證
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

#指派給 Client 的網段
server 10.8.0.0 255.255.255.0

#提供DHCP並且指派DNS
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

#建立一個 SSL/TLS "HMAC" 來加密封包
tls-auth shazi.info.key

#基於安全設定
user nobody
group nobody

 

主要以上設定必須要了解其作用,其他就採預設值。

 

Step.3 利用 easy-rsa 工具,來建立 OpenVPN 所須的認證 key

複製 easy-rsa 工具到 /etc/openvpn
$ cp -r /usr/share/easy-rsa /etc/openvpn/ 
$ cd /etc/openvpn/easy-rsa/2.0/ 

 

設定 easy-rsa 的環境參數
設定憑證參數 
$ vim vars

export KEY_COUNTRY="TW"
export KEY_PROVINCE="TW"
export KEY_CITY="Taipei"
export KEY_ORG="Mr.shazi"
export KEY_EMAIL="system@gmail.com"
export KEY_OU="shazi.info"

複製 openssl 範例參數
$ cp /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/2.0/openssl.cnf

 

 

建立 ca.crt、ca.key
$ source ./vars 
$ ./clean-all
$ ./build-ca

 

建立伺服器憑證 server.crt、server.csr、server.key,當出現詢問是否註冊時請輸入 y
$ ./build-key-server server 
Certificate is to be certified until Oct 13 19:01:26 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

 

 

建立 Diffie Hellman key:dh2048.pem
$ ./build-dh

 

 

建立 HMAC 加密憑證:tls.key
$ openvpn --genkey --secret keys/tls.key

 

建立 Client 憑證:client.crt、client.csr、client.key,當出現詢問是否註冊時請輸入 y
$ ./build-key client 
Certificate is to be certified until Oct 13 19:01:26 2025 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

 

 

Step.4 將所有憑證都建立好之後,把 ca.crt、server.crt、server.key、dh2048.pem、tls.key 都丟到 /etc/openvpn 好讓 server.conf 可以抓的到。
$ cd /etc/openvpn/easy-rsa/2.0/keys 
$ cp ca.crt server.crt server.key dh2048.pem tls.key /etc/openvpn

 

 

Step.5 設定 iptables 允許 10.8.0.0/24 允許 NAT,並開啟 udp 1194
$ vim /etc/sysconfig/iptables 

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state NEW -p udp --dport 1194 -j ACCEPT
COMMIT

$ service iptables restart

 

Step.6 開啟 IP packet forwarding
$ vim /etc/sysctl.conf 
$ net.ipv4.ip_forward = 1

立即讓 sysctl 生效
$ sysctl -p

 

Step.7 啟動 OpenVPN,並確認 listen 1194
$ service openvpn start 
$ netstat -tunpl | grep 1194

udp 0 0 0.0.0.0:1194 0.0.0.0:* 21798/openvpn

 

OpenVPN Server 的部分到此就搞定了,再來就是要提供 Client 設定檔

 

 

 

OpenVPN Client Config ovpn

OpenVPN 的設定檔統一都是 .ovpn,必須提供使用者伺服器憑證以及TLS認證

 

你可以提供 ovpn 和憑證檔打包給使用者安裝,但有更簡單的方式是直接把憑證用 tag 的方式將憑證資訊包在 ovpn

 

以下就是將憑證資訊包在 ovpn 的作法,設定參數主要參考 server.conf
$ vim shazi.info.ovpn 

client
dev tun
proto udp
remote shazi.info 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3

<ca>
-----BEGIN CERTIFICATE-----
MIIEzTCCA7WgAwIBAgIJAN2YabKaLEZgMA0GCSqGSIb3DQEBCwUAMIGfMQswCQYD
...
...

-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
MIIFDjCCA/agAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBnzELMAkGA1UEBhMCVFcx
...
...
</cert>

<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDG8h4ISOnfQXIm
...
...
-----END PRIVATE KEY-----
</key>

<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
6f4fd8cd0eb29f94db31e67379917dbf
...
...
-----END OpenVPN Static key V1-----
</tls-auth>
key-direction 1

 

 

remote 為 OpenVPN Server 的位置和端口。

<ca> 包的是 ca.crt 憑證資訊

<cert> 包的是 client.crt 憑證資訊

<key> 包的是 client.key 憑證資訊

<tls-auth> 包的是 tls.key 憑證資訊,在最後務必加上 key-direction 1 判別為 client

 

 

對於一般的桌面裝置,只要你有安裝 OpenVPN,直接點選 .ovpn 就可以安裝

 

 

行動裝置安裝 ovpn 以 iPhone 為例 

那如果是 iOS / Android 裝置呢?小弟是上傳到雲端硬碟給行動裝置下載

 

上傳到 ownCloud 雲端後讓 iPhone 去打開,並且點選 Open with

IMG_0334

 

然後選擇 Open in OpenVPN

IMG_0336

 

就會將 .ovpn 設定檔匯入 OpenVPN 囉,這裡點選綠色的 + 就可以進行匯入

IMG_0335

 

 

打開連線的開關,連上 VPN 囉!!而且速度優於 PPTP 很多唷!

IMG_0340

 

OpenVPN 相較於 PPTP 或 L2TP/IPsec 來說相對穩定,速度在 OpenSSL 的硬體加速加持下實際使用也非常快,如果使用者對於另外安裝一套 OpenVPN 軟體不排斥的話,相信 OpenVPN 會是穩定與速度上的首選!

 

 

 

註1. 此篇採用的是 TUN Mode,TUN 必須於 OpenVPN Server 使用 NAT 的方式轉發封包,而 TAP 是允許 VPN Client 和 Server 同網段。

TAP 的方式可能會造成 IP 浪費並且目前也暫不支援 Android 系統。

 

 

參考資料:

iPhone OpenVPN Setup

How to Setup and Configure an OpenVPN Server on CentOS 6

 

 

 

 

Orignal From: CentOS 6 建立私有 OpenVPN,想要穩定又快速的 VPN 不求人

沒有留言:

張貼留言