在 Ubuntu 15.04 上配置 OpenVPN 伺服器和客戶端
虛擬專用網(VPN)常指幾種通過其它網路建立連線技術。它之所以被稱為“虛擬”,是因為各個節點間的連線不是通過物理線路實現的,而“專用”是指如果沒有網路所有者的正確授權是不能被公開訪問到。
OpenVPN軟體藉助TUN/TAP驅動使用TCP和UDP協議來傳輸資料。UDP協議和TUN驅動允許NAT後的使用者建立到OpenVPN伺服器的連線。此外,OpenVPN允許指定自定義埠。它提供了更多的靈活配置,可以幫助你避免防火牆限制。
OpenVPN中,由OpenSSL庫和傳輸層安全協議(TLS)提供了安全和加密。TLS是SSL協議的一個改進版本。
OpenSSL提供了兩種加密方法:對稱和非對稱。下面,我們展示瞭如何配置OpenVPN的伺服器端,以及如何配置使用帶有公共金鑰基礎結構(PKI)的非對稱加密和TLS協議。
伺服器端配置
首先,我們必須安裝OpenVPN軟體。在Ubuntu 15.04和其它帶有‘apt’包管理器的Unix系統中,可以通過如下命令安裝:
sudo apt-get install openvpn
然後,我們必須配置一個金鑰對,這可以通過預設的“openssl”工具完成。但是,這種方式十分難。這也是我們使用“easy-rsa”來實現此目的的原因。接下來的命令會將“easy-rsa”安裝到系統中。
sudo apt-get unstall easy-rsa
注意: 所有接下來的命令要以超級使用者許可權執行,如在使用sudo -i命令後執行,或者你可以使用sudo -E作為接下來所有命令的字首。
開始之前,我們需要拷貝“easy-rsa”到openvpn資料夾。
mkdir /etc/openvpn/easy-rsa cp -r /usr/share/easy-rsa /etc/openvpn/easy-rsa mv /etc/openvpn/easy-rsa/easy-rsa /etc/openvpn/easy-rsa/2.0
然後進入到該目錄
cd /etc/openvpn/easy-rsa/2.0
這裡,我們開始金鑰生成程式。
首先,我們編輯一個“vars”檔案。為了簡化生成過程,我們需要在裡面指定資料。這裡是“vars”檔案的一個樣例:
export KEY_COUNTRY="CN" export KEY_PROVINCE="BJ" export KEY_CITY="Beijing" export KEY_ORG="Linux.CN" export KEY_EMAIL="open@vpn.linux.cn" export KEY_OU=server
希望這些欄位名稱對你而言已經很清楚,不需要進一步說明了。
其次,我們需要拷貝openssl配置。另外一個版本已經有現成的配置檔案,如果你沒有特定要求,你可以使用它的上一個版本。這裡是1.0.0版本。
cp openssl-1.0.0.cnf openssl.cnf
第三,我們需要載入環境變數,這些變數已經在前面一步中編輯好了。
source ./vars
生成金鑰的最後一步準備工作是清空舊的證照和金鑰,以及生成新金鑰的序列號和索引檔案。可以通過以下命令完成。
./clean-all
現在,我們完成了準備工作,準備好啟動生成程式了。讓我們先來生成證照。
./build-ca
在對話中,我們可以看到預設的變數,這些變數是我們先前在“vars”中指定的。我們可以檢查一下,如有必要進行編輯,然後按回車幾次。對話如下
Generating a 2048 bit RSA private key .............................................+++ ...................................................................................................+++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [BJ]: Locality Name (eg, city) [Beijing]: Organization Name (eg, company) [Linux.CN]: Organizational Unit Name (eg, section) [Tech]: Common Name (eg, your name or your server's hostname) [Linux.CN CA]: Name [EasyRSA]: Email Address [open@vpn.linux.cn]:
接下來,我們需要生成一個伺服器金鑰
./build-key-server server
該命令的對話如下:
Generating a 2048 bit RSA private key ........................................................................+++ ............................+++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [BJ]: Locality Name (eg, city) [Beijing]: Organization Name (eg, company) [Linux.CN]: Organizational Unit Name (eg, section) [Tech]: Common Name (eg, your name or your server's hostname) [Linux.CN server]: Name [EasyRSA]: Email Address [open@vpn.linux.cn]: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /etc/openvpn/easy-rsa/2.0/openssl-1.0.0.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName RINTABLE:'CN' stateOrProvinceName RINTABLE:'BJ' localityName RINTABLE:'Beijing' organizationName RINTABLE:'Linux.CN' organizationalUnitName:PRINTABLE:'Tech' commonName RINTABLE:'Linux.CN server' name RINTABLE:'EasyRSA' emailAddress :IA5STRING:'open@vpn.linux.cn' Certificate is to be certified until May 22 19:00:25 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
這裡,最後兩個關於“簽署證照”和“提交”的問題,我們必須回答“yes”。
現在,我們已經有了證照和伺服器金鑰。下一步,就是去省城Diffie-Hellman金鑰。執行以下命令,耐心等待。在接下來的幾分鐘內,我們將看到許多點和加號。
./build-dh
該命令的輸出樣例如下
Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time ................................+................<許多的點>
在漫長的等待之後,我們可以繼續生成最後的金鑰了,該金鑰用於TLS驗證。命令如下:
openvpn --genkey --secret keys/ta.key
現在,生成完畢,我們可以移動所有生成的檔案到最後的位置中。
cp -r /etc/openvpn/easy-rsa/2.0/keys/ /etc/openvpn/
最後,我們來建立OpenVPN配置檔案。讓我們從樣例中拷貝過來吧:
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ cd /etc/openvpn gunzip -d /etc/openvpn/server.conf.gz
然後編輯
vim /etc/openvpn/server.conf
我們需要指定金鑰的自定義路徑
ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/server.crt key /etc/openvpn/keys/server.key # This file should be kept secret dh /etc/openvpn/keys/dh2048.pem
一切就緒。在重啟OpenVPN後,伺服器端配置就完成了。
service openvpn restart
Unix的客戶端配置
假定我們有一臺裝有類Unix作業系統的裝置,比如Ubuntu 15.04,並安裝有OpenVPN。我們想要連線到前面建立的OpenVPN伺服器。首先,我們需要為客戶端生成金鑰。為了生成該金鑰,請轉到伺服器上的對應目錄中:
cd /etc/openvpn/easy-rsa/2.0
載入環境變數
source vars
然後建立客戶端金鑰
./build-key client
我們將看到一個與先前關於伺服器金鑰生成部分的章節描述一樣的對話,填入客戶端的實際資訊。
如果需要密碼保護金鑰,你需要執行另外一個命令,命令如下
./build-key-pass client
在此種情況下,在建立VPN連線時,會提示你輸入密碼。
現在,我們需要將以下檔案從伺服器拷貝到客戶端/etc/openvpn/keys/資料夾。
伺服器檔案列表:
- ca.crt,
- dh2048.pem,
- client.crt,
- client.key,
- ta.key.
在此之後,我們轉到客戶端,準備配置檔案。配置檔案位於/etc/openvpn/client.conf,內容如下
dev tun proto udp # 遠端 OpenVPN 伺服器的 IP 和 埠號 remote 111.222.333.444 1194 resolv-retry infinite ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/client.crt key /etc/openvpn/keys/client.key tls-client tls-auth /etc/openvpn/keys/ta.key 1 auth SHA1 cipher BF-CBC remote-cert-tls server comp-lzo persist-key persist-tun status openvpn-status.log log /var/log/openvpn.log verb 3 mute 20
在此之後,我們需要重啟OpenVPN以接受新配置。
service openvpn restart
好了,客戶端配置完成。
安卓客戶端配置
安卓裝置上的OpenVPN配置和Unix系統上的十分類似,我們需要一個含有配置檔案、金鑰和證照的包。檔案列表如下:
- 配置檔案 (副檔名 .ovpn),
- ca.crt,
- dh2048.pem,
- client.crt,
- client.key.
客戶端金鑰生成方式和先前章節所述的一樣。
配置檔案內容如下
client tls-client dev tun proto udp # 遠端 OpenVPN 伺服器的 IP 和 埠號 remote 111.222.333.444 1194 resolv-retry infinite nobind ca ca.crt cert client.crt key client.key dh dh2048.pem persist-tun persist-key verb 3 mute 20
所有這些檔案我們必須移動我們裝置的SD卡上。
然後,我們需要安裝一個OpenVPN Connect 應用。
接下來,配置過程很是簡單:
- 開啟 OpenVPN 並選擇“Import”選項
- 選擇“Import Profile from SD card”
- 在開啟的視窗中導航到我們放置好檔案的目錄,並選擇那個 .ovpn 檔案
- 應用會要求我們建立一個新的配置檔案
- 點選“Connect”按鈕並稍等一下
搞定。現在,我們的安卓裝置已經通過安全的VPN連線連線到我們的專用網。
尾聲
雖然OpenVPN初始配置花費不少時間,但是簡易的客戶端配置為我們彌補了時間上的損失,也提供了從任何裝置連線的能力。此外,OpenVPN提供了一個很高的安全等級,以及從不同地方連線的能力,包括位於NAT後面的客戶端。因此,OpenVPN可以同時在家和企業中使用。
相關文章
- 如何在 Linux 上安裝、配置 NTP 伺服器和客戶端?Linux伺服器客戶端
- 在Ubuntu 18.04上編譯安裝pppoe客戶端軟體Ubuntu編譯客戶端
- UE 客戶端和伺服器上的時間同步客戶端伺服器
- 在 ASP.NET Core 中建立 gRPC 客戶端和伺服器ASP.NETRPC客戶端伺服器
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- YUM源伺服器搭建與客戶端配置使用伺服器客戶端
- 物理DataGuard客戶端無縫切換--客戶端TAF 配置客戶端
- ubuntu17.4安裝git伺服器,window使用sourcetree客戶端UbuntuGit伺服器客戶端
- Redis原始碼剖析——客戶端和伺服器Redis原始碼客戶端伺服器
- 【SpringCloud】Ribbon如何自定義客戶端配置和全域性配置SpringGCCloud客戶端
- Eureka高可用叢集服務端和客戶端配置服務端客戶端
- NBU 8.0客戶端安裝和備份配置客戶端
- 用AnySQL在沒有oracle客戶端的伺服器上傳送郵件SQLOracle客戶端伺服器
- 客戶端svn上傳後,原始檔案在伺服器的什麼位置?客戶端伺服器
- 分散式配置中心客戶端分散式客戶端
- React 伺服器端渲染和客戶端渲染效果對比React伺服器客戶端
- Java UDP伺服器和客戶端原始碼 -javarevisitedJavaUDP伺服器客戶端原始碼
- 如何安裝和配置 Chrony 作為 NTP 客戶端?客戶端
- Ubuntu16.04 percona MySQL客戶端安裝UbuntuMySql客戶端
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- 郵件客戶端的配置使用客戶端
- Windows客戶端的JProfiler遠端監控Linux上的Tomcat伺服器Windows客戶端LinuxTomcat伺服器
- 在 WPF 客戶端實現 AOP 和介面快取客戶端快取
- Web 應用客戶端渲染和伺服器端渲染的比較Web客戶端伺服器
- OSSEC服務端配置客戶端批次部署方案服務端客戶端
- ORA-21561 OID generation failed [Ubuntu 16.04下Oracle客戶端連線伺服器]AIUbuntuOracle客戶端伺服器
- 一個端到端的基於 form 表單的檔案上傳程式,包含客戶端和伺服器端ORM客戶端伺服器
- Thrift 客戶端-服務端 零XML配置 註解式配置客戶端服務端XML
- 服務端渲染和客戶端渲染服務端客戶端
- netty系列之:自建客戶端和HTTP伺服器互動Netty客戶端HTTP伺服器
- ASP.NET Core 中建立 gRPC 客戶端和伺服器ASP.NETRPC客戶端伺服器
- FastDFS伺服器叢集部署和整合客戶端到SpringBootAST伺服器客戶端Spring Boot
- 在.NET 6 中如何建立和使用 HTTP 客戶端 SDKHTTP客戶端
- Centos7安裝與配置OpenVPN伺服器CentOS伺服器
- Ubuntu 16.04下安裝資料庫Oracle客戶端Ubuntu資料庫Oracle客戶端
- Easyvision中的伺服器與客戶端伺服器客戶端
- 客戶端 post ,get 訪問伺服器客戶端伺服器
- zookeeper在Linux客戶端操作命令大全Linux客戶端
- Jaeger的客戶端取樣配置(Java版)客戶端Java