Ubuntu20.04でWireGuard VPNを使ってみた。

自宅のネットワークに安全にアクセス出来る環境を作りたいなぁと思い簡単で無料にVPNを構築できるツールは無いか探したところ「WireGuard」と言うVPNが良さげだったのでちょっくら試してみます。

参考にさせて頂いた記事の紹介と謝辞
gihyo.jp

環境

Conoha VPS2台をレンタル

  • Ubuntu20.04(VPNサーバ用)
  • Ubuntu20.04(VPNクライアント用)

手順1 Ubuntuのアップグレード(サーバ/クライアント共通)

# apt update
# apt upgrade

手順2 WireGuardのインストール(サーバ/クライアント共通)

apt install wireguard

手順3 サーバー用鍵ペアの作成

# wg genkey | sudo tee /etc/wireguard/server.key
# chmod 600 /etc/wireguard/server.key
# cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
# chmod 600 /etc/wireguard/server.pub

手順4 クライアント用鍵ペアの作成

# wg genkey | sudo tee /etc/wireguard/client.key
# sudo cat /etc/wireguard/client.key | wg pubkey | sudo tee /etc/wireguard/client.pub
# sudo chmod 600 /etc/wireguard/client.key /etc/wireguard/client.pub

サーバー側の設定

/etc/wireguard/wg0.confvimなどで編集する。
最初ファイルが無いのでtouchかvimで作成してあげる。

[Interface]
PrivateKey = iA2DB5KH************** #作成したサーバーの秘密鍵
Address = 10.0.0.1 #サーバーのインターフェイスに割り当てるIPアドレス
ListenPort = 51820

[Peer]
PublicKey = j2ozr8LQv************** #クライアントの公開鍵
AllowedIPs = 10.0.0.2/32 #クライアントに割り当てたIPアドレス

クライアント側の設定

サーバ同様に/etc/wireguard/wg0.confvimなどで編集する。

[Interface]
PrivateKey = COv5Kpt9T4************** #クライアントの秘密鍵
Address = 10.0.0.2 #クライアントのIPアドレス

[Peer]
PublicKey = kNMbEvaOO************** #サーバーの公開鍵
EndPoint = 150.95.xxx.xxx:51820
AllowedIPs = 10.0.0.0/24 #WireGuardを経由して通信する先のIPアドレス

WireGuardの起動(サーバ側)

# systemctl start wg-quick@wg0
# systemctl status wg-quick@wg0

起動が成功してればインタフェースに10.0.0.1のアドレスが付与されているはず。

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:01:96:5f:85:7a brd ff:ff:ff:ff:ff:ff
    inet 150.95.xxx.xxx/23 brd 150.95.xxx.xxx scope global dynamic eth0
       valid_lft 83753sec preferred_lft 83753sec
    inet6 fe80::1:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.0.1/32 scope global wg0
       valid_lft forever preferred_lft forever
# 

クライアントからVPNへの接続

wg-quick up wg0コマンドでインタフェースを起動する。
問題なく起動できていればip aコマンドで10.0.0.2が表示される。

# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.0.0.2 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.0.0.0/24 dev wg0
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 02:01:96:5f:8e:18 brd ff:ff:ff:ff:ff:ff
    inet 150.95.xxx.xxx/23 brd 150.95.xxx.xxx scope global dynamic eth0
       valid_lft 84292sec preferred_lft 84292sec
    inet6 fe80::1:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.0.0.2/32 scope global wg0
       valid_lft forever preferred_lft forever
# 

最後にクライアントからサーバに向けてPingを実行し疎通OKか確認する

# ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=1.63 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.482 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.492 ms
^C
--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2030ms
rtt min/avg/max/mdev = 0.482/0.867/1.627/0.537 ms
#