wireguard vpn setup and implementation

URL Link //n.sfs.tw/15036

2021-04-04 12:26:18 By jung

最近火熱的wireguard vpn server套件,想說來試試看

於是就上了UBUNTU 20.04 LTS server來安裝

紀錄一下過程,原理就是server對client做公私鑰驗證,每個client都要有單獨的一組公私鑰配私有ip來驗證

1. 設定套件

在UBUNTU上用apt就可以了

sudo apt install wireguard

設定檔預設放在/etc/wireguard 目錄下

2. 設定vpn

2-1.先產生server side 公私鑰

伺服器端的金鑰是固定的,金鑰放置的目錄位置可自行修改

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey
伺服器端的公鑰=publickey,私鑰=privatekey,產生時可以自行改檔名

2-2.編輯虛擬界面的設定檔

2-2-1.先找出伺服器對外網卡的編號

ip -o -4 route show to default | awk '{print $5}'

2-2-2.新增設定檔,檔名可以自訂,這邊參考網路文件用wg0

sudo nano /etc/wireguard/wg0.conf

內容如下:

[Interface]

Address = 10.0.0.1/24  #這邊是虛擬的私有ip界面可以自訂

ListenPort = 51820

PrivateKey = YOUR_SERVER_PRIVATE_KEY #這邊要改成上面用 wg genkey 程式產出的伺服器端的私鑰
#要把eth0改成伺服器端的網卡編號

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

SaveConfig = true

 

2-2-3.修改權限只有root能開啟

sudo chmod 600 /etc/wireguard/{privatekey,wg0.conf}

 

2-2-4.啟動wireguard

這邊查網路說明要用wg-quick up,但是測試後發現這樣改用systemctl啟動時會報錯

所以正確用法應該直接用systemctl啟動就好

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

 

2-2-5.修改sysctl設定允許ipv4封包轉送

sudo nano /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

存檔後套用新設定

sudo sysctl -p

 

3.設定防火牆

我用內建的ufw可以配合上面關於iptables的設定,先把規則建好再啟動

sudo ufw allow 51820/udp
sudo ufw allow ssh
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable

檢查設定是否完整

sudo ufw status verbose

 

4.設定上層路由器

由於UBUNTU架在內網虛擬機,需要設定上層路由轉送到公網固定ip

到這邊wireguard vpn server基本上就完成了,但他比openvpn複雜的地方在於

每個裝置都要單獨產生公私鑰及設定檔並給一個私有ip對應

可用 sudo wg show wg0 來檢查

 

接下來繼續紀錄用戶端的設定方式,上面的指令都可以用一般使用者sudo執行,接下來因為權限問題,我都改用root執行

5.在伺服器端新增用戶設定檔

5-1.產生用戶端金鑰

我把用戶端設定檔都放到/etc/wireguard/clients目錄下

sudo mkdir -p /etc/wireguard/clients
wg genkey | sudo tee /etc/wireguard/clients/xxxx.privatekey | wg pubkey | sudo tee /etc/wireguard/clients/xxxx.publickey

wg genkey是產生用戶端的私鑰,給伺服器驗證用

wg pubkey是產生用戶端的公鑰,讓使用者匯入用

金鑰檔名可自訂,方便記憶哪組是公鑰還是私鑰最好,因為設定時會搞混@@

 

5-2.產生用戶端設定檔,每個裝置都要給一個設定檔,檔名要做區隔

sudo nano /etc/wireguard/clients/xxxx.conf

內容如下:

[Interface]

PrivateKey = abcdefghijklmnopqrstuvwxyz1234567890=+   ####這邊要改成用戶端的私鑰檔內容,就是上面產生的xxxx.privatekey檔案
Address = YOUR_VPN_PRIVATE_IP/24 ####這邊要依照上面wg0.conf設定的私有網域給這個用戶一個固定私有ip
DNS = 1.1.1.1, 1.0.0.1 ####給用戶端使用的DNS

[Peer]

PublicKey = YOUR_SERVER_PUBLIC_KEY ####這邊要改成伺服器端的公鑰檔內容,我放在上層/ete/wireguard目錄下
AllowedIPs = 0.0.0.0/0 ####允許所有連線
Endpoint = YOUR_SERVER_WAN_IP:51820 ####這邊要改成對外的固定ip,不能用內網虛擬機的虛擬ip
 
這個設定檔就是要給使用者在裝置上匯入的,iOS和android的app可以掃描qrcode匯入,所以在伺服器上安裝qrcode套件產生qrcode傳給使用者就好
 

5-3.在伺服器上的虛擬界面加入使用者的公鑰設定

 
wg set wg0 peer IBkKTn5oar+3fVB+Enp94zs1AXSa+qTq5mPm= allowed-ips 10.10.0.4
 
wg0是上面設定時給的虛擬界面名稱
peer 參數後面接的是使用者的公鑰檔內容
allowed-ips 參數後面接的是給使用者裝置固定的私有ip,就是在使用者的conf設定檔內設定的
 

5-4.安裝qrcode套件

apt install qrencode
 

5-5.替設定檔產生qrcode

 
qrencode -t ansiutf8 < /etc/wireguard/clients/xxxx.conf
 
終端機就會出現一個qrcode,截圖下來就可以
 
 
最後是在使用者裝置上匯入設定檔
 

6.使用者裝置匯入設定檔

下載iOS及android 專用APP,就可以直接用qrcode匯入設定檔,這邊的截圖用iOS的
 
 
 
 
匯入後自行設定一個連線名稱
 
 
這樣就完成了,android設定也差不多,只是不需要自訂連線名稱
如果是用android電視盒之類的,要把用戶端的conf設定檔從伺服器複製出來,傳給android裝置
 
我的作法是放到google雲端硬碟,然後在android裝置上用瀏覽器開啟檔案連結就可以下載設定檔匯入了
方法就是選擇IMPORT FROM FILE OR ARCHIVE
但是zip壓縮檔是無法匯入的
 
 
以上紀錄