最新のVPNプロトコル「WireGuard」でUbuntu 18.04にVPNを構成する

ネットワーク

WireGuardという新しいVPNが最近出てきました。OpenVPNより遥かに軽快に動き、設定も簡単です。

今回はWireGuardでVPNを設定する方法を説明していきたいと思います。

WireGuard利用時の構成

まず、全体の構成は以下の通りとなっています。Sakura VPSをVPNサーバーとして、10.18.0.0/24のネットワークを構築し、Ubuntu 18.04のサーバをこのネットワークのデフォルトゲートウェイとなるように設定していきます。

WireGuardサーバーのインストール

以下のコマンドを実行します。

sudo add-apt-repository ppa:wireguard/wireguard
sudo apt update && sudo apt install wireguard-dkms wireguard-tools

サーバー側のネットワーク設定

ここでは、サーバーに送ったパケットをインターネットに出られるようにして、かつ戻ってこられるようにNATする設定を行います。

以下のコマンドを実行して、インターネットに出られるIFがどれなのかを確認します(今回はens3として仮定)

ifconfig

インターネットに出るパケットはNATを行い、戻ってこられるようにします。

iptables -t nat -A POSTROUTING -o ens3 -s 10.18.0.0/24 -j MASQUERADE

パケットの転送機能を有効にします。

sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=0 # この項目があったら、以下のように変更
↓
net.ipv4.ip_forward=1

WireGuardの設定

以下のコマンドを実行して、設定ファイルに入れる秘密鍵 private_keyと公開鍵public_keyを出力します。秘密鍵は、1つのピアに対して1つ必ずユニークなものを使ってください(サーバー、クライアント1、クライアント2でダブりがないように)

wg genkey | tee server.key | wg pubkey > server.pub

同様に、クライアント用の秘密鍵、公開鍵を出力します。

wg genkey | tee android1.key | wg pubkey > android1.pub
wg genkey | tee android2.key | wg pubkey > android2.pub

設定ファイル

サーバーの設定ファイル

設定ファイルのファイル名がインターフェース名になります。この場合wg0とします。以下のコマンドで、新しくWireGuardのサーバー側設定ファイルを作成します。

sudo vi /etc/wireguard/wg0.conf

この場合、サーバー側のポートを30103で待ち受けています。

[Interface]
Address = 10.18.0.1/24
SaveConfig = false
ListenPort = 30103
PrivateKey = OLEgrWvynj3HD4yn(省略)vymlztDfyDIfqmV51Q=
# ↑サーバーの秘密鍵

[Peer]
# android1
PublicKey = +CHoN4UO2urp7Gvt(省略)rESRwRqa5K09mmY=
# ↑クライアント1の公開鍵
AllowedIPs = 10.18.0.101/32

[Peer]
# android2
PublicKey = 2MWDkeueNnbuR(省略)r66+Y+/dOUM2A=
# ↑クライアント2の公開鍵
AllowedIPs = 10.18.0.102/32

AllowedIPsに指定したネットワークへのパケットはWireGuardを経由するようになります。

例えばAllowed IPsに、192.168.0.0/24のように対象のピアが属するLANのネットワークを入れてフォワードが行えるように設定すれば、拠点間VPNも設定できます。

クライアント側の設定ファイル

クライアント側の設定ファイルは以下のとおりですが、フロントエンドでそれzそれの項目に以下の設定を入れます。

Android1

[Interface]
Address = 10.18.0.101/32
# ↑クライアント1のアドレス。サーバ側設定と統一する
SaveConfig = false
PrivateKey = MBdHIprosIpLsuLvg(省略)/vxIAJJ+ggHHUVXE=
# ↑クライアント1の秘密鍵

[Peer]
# ↓サーバーの公開鍵
PublicKey = 4L+mVBYNF6lvAW(省略)0QLEiiMjCnekY1Cgalk=
AllowedIPs = 0.0.0.0/0
# WireGuardを経由させたい宛先。0.0.0.0/0ですべてのトラフィック。

Android2

[Interface]
Address = 10.18.0.101/32
# ↑クライアント1のアドレス。サーバ側設定と統一する
SaveConfig = false
PrivateKey = MBdHIprosIpLsuLvg(省略)/vxIAJJ+ggHHUVXE=
# ↑クライアント1の秘密鍵

[Peer]
# ↓サーバーの公開鍵
PublicKey = 4L+mVBYNF6lvAW(省略)0QLEiiMjCnekY1Cgalk=
AllowedIPs = 0.0.0.0/0
# WireGuardを経由させたい宛先。0.0.0.0/0ですべてのトラフィック。

WireGuardの起動

以下のコマンドを起動して、WireGuardを起動します。

sudo systemctl start [email protected]

iptablesでファイアウォールを設定している方は、以下のコマンドで開放します。

sudo iptables -A INPUT -p udp -m udp --dport 30103 -j ACCEPT

この状態で、Androidスマホ側にも接続を行います。完了したら、動作確認のために診断くんにアクセスしてみましょう。

診断くん

↑sakuraのホスト名が表示されれば完成です。

サーバーのサービス化

以下のコマンドを実行すると、サーバー起動時にに合わせてサービスも開始されます。

sudo systemctl enable [email protected]

まとめ

WireGuardはルーティングの設定も簡単にできるVPNクライアントです。OpenVPNよりかなり単純な設定で、VPNを実現できます。

コメント

タイトルとURLをコピーしました