什麼是 WireGuard ? 其官方宣稱是快速、現代以及安全的VPN隧道(Fast, Modern, Secure VPN Tunnel)。
WireGuard使用了最先進的加密技術,相比 IPSec 更簡單更精簡,而且擁有幾乎超越 OpenVPN 的性能。其最初是針對Linux內核發佈的,但是現在已經跨平臺(Windows, MacOS, BSD, Android, iOS等)可部署。
接下來這篇How To系列文章,就來一步步在Ubuntu (Linux)上安裝和配置WireGuard VPN,其中一臺雲主機運行Ubuntu-20.04用作VPN服務器,另一臺本地的linux桌面環境作爲VPN客戶端。
服務器端安裝WireGuard
這裏我們的服務器使用的是操作系統爲Ubuntu 20.04的雲主機,對於如何創建並配置一臺雲主機,可以參考 DigitalOcean。
這裏我們我們已經配置好一臺Ubuntu 20.04的雲主機,並且可以通過SSH訪問。首先對系統進行安全更新
$ sudo apt update
$ sudo apt upgrade
接下來直接使用APT安裝WireGuard軟件包
$ sudo apt install wireguard
會同時安裝 wireguard-tools
軟件包,我們需要使用其工具進行相關的配置。
配置WireGuard服務端
進入root權限進行操作,爲服務端生產私有/公共密鑰對
$ sudo -i
# cd /etc/wireguard/
# umask 077
# wg genkey | tee privatekey | wg pubkey > publickey
執行完上述命令後,我們會在目錄 /etc/wireguard/ 下生產兩個密鑰文件 privatekey 和 publickey 。
接下來我們需要創建一個接口配置文件,命名爲 wg0.conf,編輯並添加如下內容
[Interface]
## VPN server private IP address ##
Address = 192.168.6.1/24
## VPN server port ##
ListenPort = 4114
## VPN server's private key i.e. /etc/wireguard/privatekey ##
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxx
其中 Address 指定該網絡接口的IP地址,可自己設定一個子網的地址,ListenPort 指定WG的UDP監聽端口(客戶端將需要配置該端口進行連接),PrivateKey 就是上面生成的私有密鑰的內容。
如果你的系統開啓了UFW防火牆,記住要配置ufw允許以上端口(4114),例如
$ sudo ufw status
Status: active
$ sudo ufw allow 4114/udp
我們這裏使用的是雲主機,則需要在雲控制檯配置相應的安全組/防火牆開放 4114/udp
端口的訪問。
接下來,執行以下命令啓動WireGuard服務
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
$ sudo systemcl status wg-quick@wg0
最後一個命令是查看wg服務的運行狀態的,例如返回如下
● [email protected] - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
Active: active (exited) since Thu 2020-12-03 06:48:02 UTC; 5s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 3606 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 3606 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 682)
Memory: 800.0K
CGroup: /system.slice/system-wg\x2dquick.slice/[email protected]
而且系統裏增加了一個虛擬的網絡接口
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1380 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.40.1/24 scope global wg0
valid_lft forever preferred_lft forever
還可以通過wg命令顯示接口信息
$ sudo wg
interface: wg0
public key: rQYpYVpgPYdYYVrlgF52S/M8vrht+rkqSmn5ayVAG0I=
private key: (hidden)
listening port: 4114
配置客戶端連接WG
完成服務器斷的配置,併成功啓動之後,我們需要配置本地客戶端來連接該VPN,我本地使用的是 [openSUSE] 桌面環境,首先需要安裝 wireguard-tools,其他 Linux 系統也是類似的
❯ sudo zypper in wireguard-tools
正在加載軟件源數據...
正在讀取已安裝的軟件包...
正在解決軟件包依賴關係...
將安裝以下 1 個新軟件包:
wireguard-tools
1 個軟件包將新裝.
總下載大小:72.4 KiB。已緩存:0 B。 操作完成後,將使用額外的 140.7 KiB。
繼續嗎? [y/n/v/...? 顯示全部選項] (y): y
一樣地需要創建私有/公共密鑰對
$ sudo -i
# cd /etc/wireguard/
# umask 077
# wg genkey | tee privatekey | wg pubkey > publickey
創建 /etc/wireguard/wg0.conf 文件,配置如下
[Interface]
## This Desktop/client's private key ##
PrivateKey = <client private key>
## Client ip address ##
Address = 192.168.40.10/24
[Peer]
## public key ##
PublicKey = <Server public key>
## set ACL ##
AllowedIPs = 192.168.40.0/24
## Your Ubuntu 20.04 LTS server's public IPv4/IPv6 address and port ##
Endpoint = 35.220.179.202:4114
## Key connection alive ##
PersistentKeepalive = 15
注意需要分別配置接口(也就是客戶端自己)的私有密鑰,還要配置連接服務端(peer)的公共密鑰,還有連接服務端的IP和端口信息。
啓動連接
❯ sudo systemctl start [email protected]
❯ sudo wg
interface: wg0
public key: 1abmCvigQqhXYLOkvjrU864dOyJHN9bf6Ya0GP4tXzs=
private key: (hidden)
listening port: 54147
peer: rQYpYVpgPYdYYVrlgF52S/M8vrht+rkqSmn5ayVAG0I=
endpoint: 35.220.179.202:4114
allowed ips: 192.168.40.0/24
latest handshake: 4 seconds ago
transfer: 92 B received, 180 B sent
persistent keepalive: every 15 seconds
這個時候還不能通過VPN直接訪問服務器端,想要客戶端和服務端可以通過VPN的私有網絡互相訪問,這個時候需要到服務端添加[Peer]的配置,服務端向文件 /etc/wireguard/wg0.conf 添加以下內容
[Peer]
PublicKey = +pztufezkYV8ujhJI2N2Q5SW5yuuTXzHmytrGdJjziE=
AllowedIPs = 192.168.40.10/32
重啓服務器,客戶端服務
$ sudo systemctl restart wg-quick@wg0
這個時候就建立了一個P-to-P的VPN網絡,可以使用私有IP互相訪問
❯ ping 192.168.40.1
PING 192.168.40.1 (192.168.40.1) 56(84) bytes of data.
64 bytes from 192.168.40.1: icmp_seq=2 ttl=64 time=51.8 ms
64 bytes from 192.168.40.1: icmp_seq=3 ttl=64 time=55.0 ms
64 bytes from 192.168.40.1: icmp_seq=4 ttl=64 time=58.6 ms
...
客戶端還不能通過VPN網絡訪問互聯網,要想所有VPN的客戶端都可以通過該服務器來訪問互聯網,還需要在服務器上配置相應的NAT,IP轉發規則。
總結
這裏僅僅通過示例,在Linux上使用 WireGuard 創建了一個端到端(客戶端/服務器)VPN網絡,讓客戶端和服務器可以通過VPN私有IP地址互相訪問。想了解更多關於WireGuard的信息,請訪問其官網 https://www.wireguard.com/ 。