Wireguard
Wireguard 是一套 VPN 軟體,已經被納入 Linux 5.6 kernel 

安裝 ubuntu 18.04
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install openssh-server

$ sudo add-apt-repository ppa:wireguard/wireguard
$ sudo apt-get update
$ sudo apt-get install wireguard

如果加入 repository 時卡住,可以參考:https://zach-adams.com/2015/01/apt-get-cant-connect-to-security-ubuntu-fix/
打開 /etc/gai.conf
取消註解以下這行
#
# For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96 100

在 server 上啟用 ip forward 並重開機,這樣封包才能從預設閘道轉發到同一個子網路的其他介面
echo "net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1" > /etc/sysctl.d/wg.conf

為 server 和 client 產生金鑰
$ umask 077
$ sudo wg genkey > private
$ sudo wg pubkey < private > public

部署 server 設定
檔案:/etc/wireguard/wg0.conf
MASQUERADE:封包的 IP header 會被改成 private IP,寫回時再還原成 public IP
10.0.0.1 可以自由設定,只要確保 peer 都在同一個子網路就好
[Interface]
Address = 10.0.0.1/24
#SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT && iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE && iptables -A INPUT -i wg0 -p udp --dport 51820 -j ACCEPT
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT && iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE && iptables -D INPUT -i wg0 -p udp --dport 51820 -j ACCEPT
ListenPort = 51820
PrivateKey = aP7Y6f0ubHbweFSs5EouXsT+klvsp2iFRZsmuBz+IHQ=

[Peer]
PublicKey = utH967EMNmx3Of9Breqp27T8+ZCOs1nawsmk+HpCLCY=
AllowedIPs = 10.0.0.2/32

部署 client 設定
檔案:/etc/wireguard/client.conf
[Interface]
Address = 10.0.0.2/24
PrivateKey = WHLj16xU6/dq59Qks8Zn14vCjk3PMc7o4Pjm6lktfmE=
DNS = 1.1.1.1

[Peer]
PublicKey = 3GODl2zWseKTpRRiArn00TEZHw9qs0oOxD1AF4gcv3c=
AllowedIPs = 0.0.0.0/0
Endpoint = 10.247.33.177:51820

產生 QRCode
$ sudo apt install qrencode
$ qrencode -t ansiutf8 < /etc/wireguard/client.conf

啟動 server
$ sudo wg-quick up wg0

啟動 client
$ sudo wg-quick up client

Wireguard 透過 UDP 協定做 handshake,所以 client 連線成功不代表 VPN 連線就真的通了。
可以用 ip ping、route、traceroute 等指令來除錯,確認 peer 之間可以互通。