動かざることバグの如し

近づきたいよ 君の理想に

UbuntuにWireguardサーバーをインストールしてVPN接続する

環境

  • Ubuntu 20.4
  • wireguard-tools 1.0

概要

今までVPN接続するときはIPsec VPNとかOpenVPNが一般的だったが、最近ではWireguardが注目されているらしい。

というのも最近のLinuxカーネルにwireguardというVPNプロトコルが正式にサポートされるようになったとのこと。

Ubuntu 19.10以降では標準でサポートされたので早速試してみる

サーバー側のセットアップ

最初にカーネルパラメータの設定だけしておく。お外との通信のためにはパケットのフォワードを許可する必要があるため。

/etc/sysctl.conf にて net.ipv4.ip_forward=1コメントアウトを外す

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

設定反映

# sysctl -p

インストール

# apt install wireguard

秘密鍵、公開鍵の作成

サーバーとクライアント同士は公開鍵認証によって暗号化される。専用のコマンドで乱数を生成する。

# 秘密鍵の生成
$ wg genkey > server_private.key
# 秘密鍵から公開鍵を生成
$ wg pubkey > server_public.key < server_private.key

クライアント側の鍵も生成しておく

# 秘密鍵の生成
$ wg genkey > client_private.key
# 秘密鍵から公開鍵を生成
$ wg pubkey > client_public.key < client_private.key

なおつくったファイル自体はいらないのでcatだけしてメモっておく

設定を書く。wireguardでは通常インターフェース名wg0で通信するので /etc/wireguard/wg0.conf を作成して以下

ens3の部分はサーバーがデフォルトゲートウェイへ接続できるNICを書くので適宜変更する。

[Peer]項目に書く公開鍵はクライアント側なので注意

[Interface]
PrivateKey = 作成したサーバーの秘密鍵(server_private.key)
Address = 10.0.0.1
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

[Peer]
PublicKey = 作成したクライアントの公開鍵(client_public.key)
AllowedIPs = 10.0.0.2/24

クライアント側のセットアップ

同様にwireguardをインストールしておく

クライアントがMac OSの場合

App Storebrewでクライアントをインストールできる。App Storeの方はGUIだが野良ではインストール不可

今回はbrewでインストールした

brew install wireguard-tools

すると wg というコマンドが叩けるようになるはず(sudo必要

 クライアントがiOS / Androidの場合

アプリが公式でリリースされているので「wireguard」でググってインストール

設定を手入力でもできるがダルいのでQRコード読み込みがおすすめ

サーバーでQRコードを生成できるコマンドをインストール

apt install qrencode

後述する設定ファイルを適当な場所で作って標準入力で読み込ませる

qrencode -t ansiutf8 < client.conf

表示されたQRコードスマホのwireguardアプリで読み込ませればおk

で、肝心の設定 Ubuntuの場合は /etc/wireguard/wg0.conf Macの場合は /usr/local/etc/wireguard/wg0.conf に以下を記述

[Interface]
PrivateKey = 作成したクライアントの秘密鍵(client_private.key)
Address = 10.0.0.2

[Peer]
PublicKey = 作成したサーバーの公開鍵(server_public.key)
Endpoint = サーバーのグローバルIP:51820
AllowedIPs = 0.0.0.0/0
# AllowedIPs = 10.0.0.0/24

起動

サーバー側で自動起動有効化と起動

$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0

うまく起動できていれば ip a したときにwg0がいるはず

# ip a
(略)
7: 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

クライアント側も起動してみる

sudo wg-quick up wg0

そうすると無事にVPN接続ができるようになっているはず

ポイントはクライアント設定の AllowedIPs で、これを0.0.0.0/0だとすべての通信がVPN経由に、10.0.0.0/24だとそのIP帯のみがVPN経由になる IP帯は AllowedIPs = 10.0.0.0/24, 192.168.1.0/24 のように , で複数記述できる

参考リンク