近年 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
然後選擇 Open in OpenVPN
就會將 .ovpn 設定檔匯入 OpenVPN 囉,這裡點選綠色的 + 就可以進行匯入
打開連線的開關,連上 VPN 囉!!而且速度優於 PPTP 很多唷!
OpenVPN 相較於 PPTP 或 L2TP/IPsec 來說相對穩定,速度在 OpenSSL 的硬體加速加持下實際使用也非常快,如果使用者對於另外安裝一套 OpenVPN 軟體不排斥的話,相信 OpenVPN 會是穩定與速度上的首選!
註1. 此篇採用的是 TUN Mode,TUN 必須於 OpenVPN Server 使用 NAT 的方式轉發封包,而 TAP 是允許 VPN Client 和 Server 同網段。
TAP 的方式可能會造成 IP 浪費並且目前也暫不支援 Android 系統。
參考資料:
How to Setup and Configure an OpenVPN Server on CentOS 6