前提
- 一個有公網IP的服務器,請看教程
- 服務器系統爲Ubuntu16.04 x64
- 確保完成教程當中3點必須做的事
內容簡介
OpenVPN在服務器端的安裝,密鑰文件的配置和生成,密鑰文件分發,Linux以及Android下OpenVPN客戶端設置與運行。另外如果習慣英文教程的朋友請移步這裏,感謝原作者Justin Ellingwood!這篇博文基本上就是一翻譯。
第1步
以非root的身份鏈接到服務器,並且更新一下軟件源,並且安裝openvpn和easy-rsa。openvpn不用多說,easy-rsa是實現文件加密
sudo apt-get update
sudo apt-get install openvpn easy-rsa
第2步
OpenVPN是需要證書頒發機構CA,而這個CA就需要藉助剛剛安裝的easy-rsa咯。首先,
cd
將服務器的操作目錄轉移到這個身份的根目錄~/。之後,
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
建立一個文件夾專門放easy-rsa的模板。我們之後就會在這個模板裏面進行客製化CA操作。
第3步
客製化需要改編的文件:~/openvpn-ca/vars,因爲我們當前的工作目錄就是~/openvpn-ca,所以只需要。
nano vars
通過ctrl + w這個命令我們可以用關鍵詞搜索文件中的位置。第一個需要搜索的是“export KEY_COUNTRY=”US””,找到這一串默認的
export KEY_COUNTRY=”US”
export KEY_PROVINCE=”CA”
export KEY_CITY=”SanFrancisco”
export KEY_ORG=”Fort-Funston”
export KEY_EMAIL=”[email protected]”
export KEY_OU=”MyOrganizationalUnit”
按照我們各自的實際情況來改,給一個例子:
export KEY_COUNTRY=”US”
export KEY_PROVINCE=”NY”
export KEY_CITY=”New York City”
export KEY_ORG=”DigitalOcean”
export KEY_EMAIL=”[email protected]”
export KEY_OU=”Community”
可以照着這個自己改。這些都是一些爲生成CA添加的附加信息。除此之外,緊跟這這段,加一句export KEY_NAME="server"
。然後ctrl + x保存關閉文件。然後
source vars
讓系統重新加載一下剛纔修改好的 vars。之後如果系統中原來已經有了一些密鑰文件放在~/openvpn-ca/keys的話,推薦將他們刪除,對應的命令是
./clean-all
第4步
客製化結束之後真正使用easy-rsa生成CA文件
首先保證工作目錄爲~/openvpn-ca,之後生成CA
./build-ca
在這步的過程中會有提示我們一些關於CA附加信息的確認問題,我們直接回車就可以,一路回車到底。完成!恭喜你,已經生成了用於授權密鑰的CA辣!
第5步
生成server端使用的密鑰。
rsa其實是一個加密算法,easy-rsa就是實現這個算法的一款linux程序,所以繼續用easy-rsa去生成密鑰,然後再添加給openvpn。那可以理解爲上一步生成CA就是爲了密鑰而準備的,前續工作。
運行:
./build-key-server server
注意這裏的參數server是對應我們第三步中,export KEY_NAME="server"
這個密鑰名稱的。所以之前其實你想叫啥都可以,只要兩個地方統一就好。但是下面的教程都是按照叫做server來寫的,所以爲了方便就叫它server吧。依然,這個build過程會問很多問題,都回車enter或者y就好了。其中有一個問題是要我們給一個challenge password,不用擔心它,也直接回車就好。
下一步是生成用於密鑰交換的dh密鑰,以及將我們這步產生的ta.key配置給openvpn
./build-dh
openvpn –genkey –secret keys/ta.key
第6步
生成client端使用的密鑰。因爲這步我們可能會重複很多次,openvpn支持多用戶共同使用,所以首先保證我們已經做了
cd ~/openvpn-ca
source vars
然後生成client的密鑰,這裏我們給進的參數client1是給client密鑰的名稱,隨便取辣,不過鑑於這是我們第一次生成client密鑰,就不妨叫它client1吧,好記。
./build-key client1
同樣的,這一步也會有問這問那,直接enter或者y。
第7步
配置openvpn,首先將之前生成的keys目錄下的文件拷貝到openvpn下:
cd ~/openvpn-ca/keys
sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
注意這裏的server.crt以及server.key都是與第4步中你的選擇相一致的,如果你選擇取別的名字就需要自己改過來。然後將openvpn自帶的一個預定義配置解壓出來供我們之後更改,這樣就不用從頭寫了。
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
然後開始修改這個配置,依舊用nano打開它。
sudo nano /etc/openvpn/server.conf
找到tls-auth,將這行最前面的;去掉解除註釋。另外在它下面加上key-direction 0,長成這樣:
tls-auth ta.key 0 # This file is secret
key-direction 0
找到cipher,選擇cipher AES-128-CBC這種加密密碼。同樣的也是把它前面的;去掉。另外在它下面加上auth SHA256,指定TLS的授權算法。
cipher AES-128-CBC
auth SHA256
找到user和group,將它們的;去掉。
user nobody
group nogroup
爲了讓我們所有的網絡請求都通過vpn流轉,我們必須給client一個OpenDNS,以及設置openvpn流轉方式。找到redirect-gateway,去掉;。
push “redirect-gateway def1 bypass-dhcp
找到dhcp-option,去掉兩行的;。
push “dhcp-option DNS 208.67.222.222”
push “dhcp-option DNS 208.67.220.220”
改vpn端口和傳輸層協議爲tcp,找到port改爲你想要用的端口,找到proto改爲tcp
port 12345
proto tcp
最後如果你在第4步中把key_name叫成了其他名字而不是server,那麼需要找到cert和key,將cert和key改爲你自己叫得名字。這裏我們貼出原來默認的server.crt 與 server.key。
cert server.crt
key server.key
保存並且關閉nano。
第8步
允許系統進行ip包轉發, 打開/etc/sysctl.conf
sudo nano /etc/sysctl.conf
找到net.ipv4.ip_forward,將前面的#去掉,也是取消註釋的意思。
net.ipv4.ip_forward=1
保存關閉nano,並且重新讓系統讀取一遍這個文件
sudo sysctl -p
接下來找到VPS的公共網絡接口,複製它。
ip route | grep default
在輸出中的dev後面那個就是公共網絡接口,例如 wlp11s0就是。
default via 203.0.113.1 dev wlp11s0 proto static metric 600
打開/etc/ufw/before.rules,隨便在哪裏添加一下OpenVPN的防火牆規則。繼續用上面這個wlp11s0的例子。
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o wlp11s0 -j MASQUERADE
COMMIT
保存關閉。
打開/etc/default/ufw,找到DEFAULT_FORWARD_POLICY,將它改爲:
DEFAULT_FORWARD_POLICY=”ACCEPT”
保存關閉。
設置ufw ,允許OpenVPN的端口和使用的tcp協議,保證ufw允許ssh。並且重啓。XXXXX是我們在第7步中設置的端口。
sudo ufw allow XXXXX/tcp
sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable
第9步
開啓VPS的OpenVPN服務,並設置開機自動啓動。
sudo systemctl start openvpn@server
sudo systemctl enable openvpn@server
第10步
OpenVPN的服務器端的設置就搞定辣!接下來是client的內容。當然之前也用了easy-rsa去生成client的密鑰。創建一個OpenVPN的client文件夾,然後設置爲只有我們這個用戶可以讀,可以寫,可以允許。然後將OpenVPN提供的關於client的設置拷貝進去,之後用nano打開這個設置,準備修改。
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
找到remote,將後面的ip和端口設置爲自己的VPS的公網IP(VPS_IP_address)以及,我們在第7步中設置的端口(XXXXX)。
remote VPS_IP_address XXXXX
找到proto,改爲tcp
proto tcp
找到user和group,去掉前面的;
user nobody
group nogroup
找到ca ca.crt,cert client.crt,key client.key,將他們最前面加上#註釋掉。
找到tls-auth,在它下面加上key-direction 1,長成這樣:
key-direction 1
找到cipher,選擇cipher AES-128-CBC這種加密密碼。同樣的也是把它前面的;去掉。另外在它下面加上auth SHA256,指定TLS的授權算法。
cipher AES-128-CBC
auth SHA256
然後再任意地方加上三行代碼,在linux安裝OpenVPN時會用到。
# script-security 2
# up /etc/openvpn/update-resolv-conf
# down /etc/openvpn/update-resolv-conf
保存關閉。
第11步
建立client.opvn生成bash file.
nano ~/client-configs/make_config.sh
將下面內容複製進去。
#!/bin/bash
# First argument: Client identifier
KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.confcat ${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
生成client的OpenVPN文件,注意裏面的參數client1是我們在第6步中定的名字。
./make_config.sh client1
ok!在~/client-configs/files文件夾下面有一個client1.ovpn文件了,這個就是我們client需要的唯一一個文件了!到這裏我們所有OpenVPN的設置都完成了。下面是具體如何操作。
安卓系統:
下載OpenVPN Connect這款軟件。將client1.ovpn從遠程VPS用sftp命令下載到本地電腦:
sftp yourname@VPS_IP:client-configs/files/client1.ovpn ~/
再用數據線將這個文件傳到安卓設備。然後打開OpenVPN Connect,點擊右上角的三個點,選擇import,然後選擇import profile from SD card。接下來找到剛剛傳的client1.ovpn。之後點擊connect就可以用辣
Ubuntu
同樣將client1.ovpn從遠程VPS用sftp命令下載到本地電腦:
sftp yourname@VPS_IP:client-configs/files/client1.ovpn ~/
更新軟件源,然後安裝OpenVPN。
sudo apt-get update
sudo apt-get install openvpn
然後檢查是否本地有/etc/openvpn/update-resolv-conf這個文件存在,如果不存在則跳過這點,反之打開client1.ovpn,找到script-security,刪除三個#。
nano client1.ovpn
刪除#後是這樣的。
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
保存關閉。
然後在本地運行OpenVPN
sudo openvpn –config client1.ovpn
恭喜,這麼長的教程居然被你看完了,真不簡單。希望能成功配置上OpenVPN。