在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
這樣一來,在pki
和pki/private
資料夾中會生成ca.crt
和ca.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是成功配置好了。