在Linux上配置WireGuard VPN服務

什麼是 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/ 下生產兩個密鑰文件 privatekeypublickey

接下來我們需要創建一個接口配置文件,命名爲 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章