WireGuardを使ったVPNの構築

はじめに

次のVM上のサーバ間でWireGuardを使ってVPN接続ができるように構築する。

$ virsh net-dhcp-leases default
 Expiry Time           MAC address         Protocol   IP address           Hostname   Client ID or DUID
------------------------------------------------------------------------------------------------------------------------------------------------
 2023-12-22 02:27:45   52:54:00:70:0f:14   ipv4       192.168.123.123/24   vpn1       ff:56:50:4d:98:00:02:00:00:ab:11:21:77:3b:5b:4c:12:bc:c2
 2023-12-22 02:40:08   52:54:00:cc:d7:ca   ipv4       192.168.123.192/24   vpn2       ff:56:50:4d:98:00:02:00:00:ab:11:43:f1:be:a3:9d:05:4e:e9

環境

  • Ubuntu 20.04.6 LTS(ホストOS)
  • Ubuntu 22.04.2 LTS(ゲストOS)

構築

VPNサーバの構築

#ホストからVMにログイン
$ ssh 192.168.123.123

#VM上で操作
$ sudo apt update;sudo apt upgrade -y
wireguardパッケージのインストール
$ sudo apt install wireguard -y

サーバー用鍵ペアの作成する。

#秘密鍵の作成と保存
$ wg genkey | sudo tee /etc/wireguard/server.key
$ sudo chmod 600 /etc/wireguard/server.key
$ sudo ls -la /etc/wireguard/server.key
-rw------- 1 root root 45 Dec 22 01:48 /etc/wireguard/server.key

#作成したサーバーの秘密鍵の確認
$ sudo cat /etc/wireguard/server.key
oLXg+zI+hFbWqWg5abKZsCOpu0HDG8XJX5xGFT4CoGw=

#秘密鍵から公開鍵を作成する
$ sudo cat /etc/wireguard/server.key | wg pubkey | sudo tee /etc/wireguard/server.pub
$ sudo chmod 600 /etc/wireguard/server.pub
$ sudo ls -la /etc/wireguard/server.pub
-rw------- 1 root root 45 Dec 22 01:49 /etc/wireguard/server.pub

#作成したサーバーの公開鍵の確認
$ sudo cat /etc/wireguard/server.pub
dzLJmkwcJ5D4hgfxj3hD5H5qMxjxzep3VzXRhipa/3o=

IPアドレスの確認
$ ip a
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:70:0f:14 brd ff:ff:ff:ff:ff:ff
    inet 192.168.123.123/24 metric 100 brd 192.168.123.255 scope global dynamic enp1s0
       valid_lft 3266sec preferred_lft 3266sec
    inet6 fe80::5054:ff:fe70:f14/64 scope link
       valid_lft forever preferred_lft forever

VPNクライアントの構築

クライアント用鍵ペアの作成する。

#ホストからVMにログイン
$ ssh 192.168.123.192

#VM上で操作
$ sudo apt install wireguard -y
$ 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
$ sudo ls -la /etc/wireguard/client.key /etc/wireguard/client.pub
-rw------- 1 root root 45 Dec 22 01:52 /etc/wireguard/client.key
-rw------- 1 root root 45 Dec 22 01:52 /etc/wireguard/client.pub

# 作成したクライアントの秘密鍵の確認
$ sudo cat /etc/wireguard/client.key
KO1zn3Qq0HQDrvFaYfs8z9iuARl9VOghfBAXOpxBCHk=
# 作成したクライアントの公開鍵の確認
$ sudo cat /etc/wireguard/client.pub
j9SRypHMiQ3AshaL/VITyyEVqaJxW22kWXyUIwQNiA4=

VPNサーバの設定

WireGuardの設定ファイルは、「⁠/etc/wireguard/作成するインターフェイス名.conf」という名前で作成する必要がある。今回はインターフェイス名を「wg0」とするので、「⁠/etc/wireguard/wg0.conf」というファイルを作成し、以下の内容を記述する。 VPNサーバのプライベートキー、VPNクライアントのパブリックキーを使用することに留意する。

$ sudo vim /etc/wireguard/wg0.conf
[Interface]
PrivateKey = oLXg+zI+hFbWqWg5abKZsCOpu0HDG8XJX5xGFT4CoGw=
Address = 10.0.0.1 (サーバーのインターフェイスに割り当てるIPアドレス)
ListenPort = 51820

[Peer]
PublicKey = j9SRypHMiQ3AshaL/VITyyEVqaJxW22kWXyUIwQNiA4=
AllowedIPs = 10.0.0.2/32 (クライアントに割り当てたIPアドレス)

VPNクライアントの設定

クライアント側にも設定ファイルが必要である。以下の内容で「/etc/wireguard/wg0.conf」を作成する。 VPNクライアントのプライベートキー、VPNサーバのパブリックキーを使用することに留意する。

$ sudo vim /etc/wireguard/wg0.conf
[Interface]
PrivateKey = KO1zn3Qq0HQDrvFaYfs8z9iuARl9VOghfBAXOpxBCHk=
Address = 10.0.0.2 (クライアントのIPアドレス)

[Peer]
PublicKey = dzLJmkwcJ5D4hgfxj3hD5H5qMxjxzep3VzXRhipa/3o=
EndPoint = 192.168.123.123:51820(サーバーのIPアドレス:51820)
AllowedIPs = 10.0.0.0/24 (WireGuardを経由して通信する先のIPアドレス)
WireGuardの起動(VPNサーバでの作業)

VPNサーバのサービス起動

VPNサーバで、WireGuardのサービスを起動する。

$ sudo wg-quick down wg0
$ sudo wg-quick up wg0

$ ip a show wg0
4: 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クライアントのサービス起動と接続

VPBクライアントからVPNサーバへの接続する。

$ sudo wg-quick up wg0
$  ip a show wg0
3: 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

接続を確認できた。