1. 程式人生 > >在Ubuntu 18.04上配置openvpn

在Ubuntu 18.04上配置openvpn

在開發和工作中,有時候需要用VPN連線受限網路,所以我研究了一下,記錄了我在我Ubuntu 18.04伺服器上的安裝過程。本文參考了DigitalOcean的教程,原文CA和VPN伺服器為了安全是兩個不同的伺服器,我為了省事,讓VPN伺服器同時當做CA,如果有需要請參考原文。

安裝openvpn

第一步當然是安裝openvpn了,它在Ubuntu軟體倉庫中,可以直接安裝:

sudo apt install openvpn

此外還需要安裝一個輔助工具easyrsa,它包含了一系列指令碼和配置,可以幫助我們快速生成openvpn所需的證書和公私鑰對。因為它是一組指令碼,所以我們直接克隆一下它的Github倉庫即可:

git clone https://github.com/OpenVPN/easy-rsa.git

這樣一來,必要的軟體安裝就完成了。

生成CA

首先先進入easyrsa的指令碼目錄:

cd easy-rsa/easyrsa3

然後將其中vars.example的檔案複製一份:

cp vars.example vars

接著用文字編輯器開啟vars檔案:

nano vars

這個檔案很長,包含了很多註釋和說明,這些我們都不用管,直接翻到圖中所示部分,然後按照自己的需求進行修改,但是不能留空,修改完成後儲存檔案。

修改配置檔案

然後用下面的命令生成公鑰體系,此外easyrsa還有一些其他命令和引數,有些引數下面還會用到:

./easyrsa init-pki

會生成如下的資訊,這樣就成功了:

Note: using Easy-RSA configuration from: ./vars

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /home/yitian/easy-rsa/easyrsa3/pki

之後就是最後一步建立CA證書了,如果不想每次都輸入一個密碼,可以用nopass引數來取消密碼。在輸出中還會提示你輸入CA的公共名稱,直接預設即可,當然你想改也隨意。

./easyrsa build-ca nopass

會生成如下的資訊,這樣一來就完成了:

Note: using Easy-RSA configuration from: ./vars
Generating RSA private key, 2048 bit long modulus
....................................................................................+++
..............................................+++
e is 65537 (0x010001)
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.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/yitian/easy-rsa/easyrsa3/pki/ca.crt

這樣一來,在pkipki/private資料夾中會生成ca.crtca.key檔案,正是SSL證書所用的公私鑰對。

生成伺服器證書和加密檔案

生成私鑰

首先輸入下面的命令,這裡的server是伺服器的名稱,可以修改,但是由於接下來好幾處命令以及生成的檔案都受這個名稱影響,所以還是用預設的server省事一點:

./easyrsa gen-req server nopass

輸出如下:

Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
......................................................................+++
...................................................................+++
writing new private key to '/home/yitian/easy-rsa/easyrsa3/pki/private/server.key.IuKiwcpofq'
-----
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.
-----
Common Name (eg: your user, host, or server name) [server]:

Keypair and certificate request completed. Your files are:
req: /home/yitian/easy-rsa/easyrsa3/pki/reqs/server.req
key: /home/yitian/easy-rsa/easyrsa3/pki/private/server.key

這樣就生成了伺服器私鑰server.key和證書請求檔案server.req

然後將伺服器私鑰複製到openvpn配置檔案目錄下:

sudo cp pki/private/server.key /etc/openvpn

生成公鑰

由於我只有一臺伺服器,同時充當CA伺服器和VPN伺服器,所以需要自己給自己簽發,會產生同名檔案,所以首先先把服務請求檔案server.req重新命名一下:

mv pki/reqs/server.req pki/reqs/server2.req

然後匯入請求,這裡的server是前面指定的伺服器名稱:

./easyrsa import-req pki/reqs/server2.req server

成功之後,用下面的命令簽發請求,注意這裡的第一個server是請求型別,可以是client或者server,第二個server是前面指定的伺服器名稱:

./easyrsa sign-req server server

在這一步出了一點小問題,輸出提示index.txt.attr檔案不存在,導致出現了部分失誤,所以生成的檔案被儲存到了pki/issued目錄下,不過後來全弄完我發現這個小錯誤不影響VPN連線,但是如果你執行的時候沒有錯誤,記得改一下這裡的檔案路徑。

這樣會生成server.crt檔案,將它和ca.crt一起復制到openvpn中:

sudo cp pki/ca.crt pki/issued/server.crt  /etc/openvpn/

生成加密檔案

然後生成Diffie-Hellman金鑰檔案,這會讓VPN更加安全,不過生成過程可能需要幾分鐘時間:

./easyrsa gen-dh

等待生成完成之後,生成Diffie-Hellman簽名:

openvpn --genkey --secret ta.key

然後將生成的幾個檔案也複製給openvpn:

sudo cp ta.key pki/dh.pem /etc/openvpn/

這樣一來,伺服器端的所有檔案就全部生成完畢,下面開始生成客戶端所需檔案。

生成客戶端證書和金鑰對

首先準備一個目錄存放客戶端檔案:

mkdir -p ~/client-configs/keys

然後修改許可權確保安全:

sudo chmod -R 700 ~/client-configs

然後生成客戶端請求檔案,考慮到可能會有幾個客戶端,所以這裡叫client1,當然名稱也可以修改:

./easyrsa gen-req client1 nopass

將其複製到存放目錄中:

cp pki/private/client1.key ~/client-configs/keys/

和前面一樣,首先修改一下客戶端請求檔案的名稱:

mv pki/reqs/client1.req pki/reqs/client.req

然後匯入請求檔案:

./easyrsa import-req pki/reqs/client.req client1

再簽發請求:

./easyrsa sign-req client client1

這樣會生成client1.crt檔案,最後將幾個檔案複製到存放目錄中(這裡注意一下檔案路徑,我前面出現錯誤,所以檔案生成在issued資料夾中,如果你沒錯誤記得改一下路徑):

cp pki/issued/client1.crt ta.key pki/ca.crt  ~/client-configs/keys/

這樣,所有證書檔案就準備就緒了。

配置openvpn服務

必須配置

首先先複製一個樣例配置檔案:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
sudo gzip -d /etc/openvpn/server.conf.gz

然後開啟配置檔案:

sudo nano /etc/openvpn/server.conf

先找到tls-auth一行,它應該是下面的樣子,如果不是,取消註釋並修改成下面的樣子,並新增一句key-direction 0配置。

tls-auth ta.key 0 # This file is secret
key-direction 0

然後是cipher一行,它應該是下面的樣子,如果不是,取消註釋並修改成下面的樣子,並新增一句auth SHA256

cipher AES-256-CBC
auth SHA256

然後是dh一行,預設應該是dh2048.pem,修改成下面的樣子:

dh dh.pem

找到使用者許可權一行,取消註釋,在linux系統上用更低的許可權執行會更加安全:

user nobody
group nogroup

可選配置

以下是可選配置,但是配置之後會更方便使用,推薦配置。

首先是讓所有流量都通過VPN,找到並取消以下幾行的註釋:

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

然後修改預設埠號和協議:

port 6666
proto udp

如果將協議改為TCP,還要將explicit-exit-notify修改為0,不然會出錯:

explicit-exit-notify 0

如果前面一些檔案你沒有使用預設名稱,那麼在這個配置檔案中別忘了也進行一些修改:

cert server.crt
key server.key

調整伺服器網路設定

首先需要允許IP轉發,用下面的命令開啟配置檔案:

sudo nano /etc/sysctl.conf

找到並取消下面一行的註釋,然後儲存檔案。

net.ipv4.ip_forward=1

用下面的命令可以檢查一下當前配置:

sudo sysctl -p

如果你伺服器還有防火牆,那麼還需要配置一下防火牆允許VPN通過,這裡就不介紹了(防火牆各有各的,而且我一個也不會)。

啟動openvpn服務

用下面的命令啟動openvpn,後面的@server代表使用的是名為server.conf的配置檔案,如果沒什麼輸出,說明一切正常。

sudo systemctl start [email protected]

否則用下面兩條命令查詢並嘗試改正錯誤:

systemctl status [email protected]
journalctl -xe

如果openvpn正常啟動,別忘了讓它開機啟動:

sudo systemctl enable [email protected]

建立客戶端配置檔案

這一部分需要上面建立的客戶端檔案。首先建立存放生成檔案的目錄:

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files

然後複製一個示例配置檔案:

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf

然後編輯該檔案:

nano ~/client-configs/base.conf

將下面一些配置進行修改,我就不一一說明了,基本上和伺服器配置要對應:

# 伺服器IP和埠
remote server_IP_address 6666
# 協議
proto udp
# 許可權
user nobody
group nogroup
# 證書檔案
ca ca.crt
cert client1.crt
key client1.key
cipher AES-256-CBC
# 這行沒有要新增
auth SHA256
# 不用看了,這行沒有,要加上,伺服器上是0,客戶端是1
key-direction 1
# 這幾行建議新增,如果是linux客戶端而且有/etc/openvpn/update-resolv-conf檔案就取消註釋
# 如果不是就保持註釋狀態
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf

下面來生成客戶端配置檔案,首先新建一個檔案:

nano ~/client-configs/make_config.sh

然後將下面的內容複製進去:

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/client-configs/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn

順便修改一下許可權:

chmod 700 ~/client-configs/make_config.sh

然後執行一下檔案,這裡的client1要和前面的名稱對應:

cd ~/client-configs
./make_config.sh client1

如果所有配置都按照前面的配置進行的話,會在~/client-configs/file資料夾中生成一個.ovpn檔案,然後將它複製到所需地方即可。

客戶端配置

這裡用windows系統舉例,首先下載並安裝openvpn軟體。開啟軟體之後在系統托盤右鍵點選import,然後選擇生成的.ovpn,匯入之後點選連線,然後看看是否連線成功。

連線成功

我這裡成功連線,但是VPN只能訪問伺服器,無法訪問伺服器所在網路,可能是VPN服務被禁的原因。不過不管怎麼說,VPN是成功配置好了。