【Ubuntu】WireGuardで簡単VPN環境を構築

WireGuard

Ububntu Server 20.04へのVPNソフトWireGuardの導入方法です。

WireGuardについて

WireGuardはOpenVPNやIPSecといったVPNソフトと比較すると、導入が簡単で高速に動作すると言われています。

通信速度については比較できていませんが、私が実際にインストールを行った感じではOpenVPNよりもインストールは簡単でした。

「Andoroid」「iOS」「Windows」用のアプリケーションがあり、「Andoroid」「iOS」のアプリではQRコードを使用して設定を読み込むこともできます。

使用上の注意点

WireGuardは公開鍵認証方式で認証を行っていて、接続する機器同士で秘密鍵と公開鍵を互いに持ち合っています。

そのため、秘密鍵や公開鍵が漏洩してしまうと簡単に接続されてしまいますので、鍵の管理は厳重に行う必要があります。

構築環境イメージ

今回は下記の構成でVPNネットワークを構築していきます。

  • VPNサーバ: ConoHaのVPS
    • OS: Ubuntu Server 20.04
    • VPN用IPアドレス: 172.16.0.254/24
    • VPN待受ポート: 51820/UDP
  • クライアント1: スマートフォン
    • OS: iPhone
    • VPN用IPアドレス: 172.16.0.1/24
    • VPN接続後はすべての通信をVPN経由とする
  • クライアント2: 自宅PC
    • OS: Ubuntu 21.10
    • VPN用IPアドレス: 172.16.0.2/24
    • VPNネットワーク宛の通信のみVPNを使用して通信する

WireGuardは「Peer to Peer」の接続を行うのですが、今回の構成ではVPSにインストールするWireGuardを常時起動させてVPN接続の待受を行っているために、VPNサーバと呼ぶことにしています。

スマーフォンや自宅PCは、必要に応じてWireGuardを起動させてVPNサーバに接続するという構成のため、クライアントと呼ぶことにしています。

今回の構成ではVPNサーバ側からクライアントへ接続要求を行うことは想定していません。

VPNサーバ側の作業

はじめにVPNサーバの構築を下記の手順で行っていきます。

  • ufwで通信許可設定(51820/udp)
  • IPフォワーディング許可設定
  • WireGuardインストール
  • 秘密鍵・公開鍵の作成
  • preshared-key(事前共有鍵)作成
  • 設定ファイル作成

通信許可設定(51320/udp)

ufwを使用して、WireGuardで使用するUDPの51320番ポートの通信許可設定を行います。

$ sudo ufw allow 51820/udp

ufwの使用方法がわからない場合は、下記のページに使用方法をまとめていますので、参考にしてみてください。

【Ubuntu】ufwの使い方ー入門編ー

IPフォワーディング許可設定

Ubuntuの初期設定では、VPNネットワークから別のネットワークへの通信をフォワーディング(ルーティング)させることができません。

このままだとVPNネットワーク内でしか通信ができないので、Ubuntuの設定を変更してVPNネットワークから別のネットワークに通信を行えるようにするための設定を行います。

$ sudo cp -p /etc/sysctl.conf /etc/sysctl.conf_$(date +%Y%m%d-%H%M%S)
$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1の行頭にある「#」を削除してください。

#net.ipv4.ip_forward=1  # 変更前
net.ipv4.ip_forward=1  # 変更後

net.ipv4.ip_forward=0といったように設定されている場合は「0」を「1」に変更してください。

設定の反映はsysctl -pで行います。

$ sudo sysctl -p

設定の確認はsysctl net.ipv4.ip_forwardコマンドで行います。

net.ipv4.ip_forwardの値が1であれば、フォワーディングが許可されています。

$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

WireGuardインストール

aptコマンドでWireGuardをインストールします。

$ sudo apt update
$ sudo apt install wireguard

秘密鍵・公開鍵の作成

WireGuardで使用するPraivateKey(秘密鍵)とPublicKey(公開鍵)の鍵ペアを、/etc/wireguardディレクトリにVPNサーバとクライアントの分作成していきます。

本手順では、下記の名前で鍵ペアを作成していきます。

  • サーバ用鍵ペア
    • PraivateKey: server_private.key
    • PublicKey: server_public.key
  • クライアント1用鍵ペア
    • PraivateKey: client1_private.key
    • PublicKey: client1_public.key
  • クライアント2用鍵ペア
    • PraivateKey: client2_private.key
    • PublicKey: client2_public.key

鍵のファイル名自体には特に決まりがないので、自分でわかりやすいような名前で作成してもらって問題ありません。

作成した鍵ペアは、紛失しないように物理的に別の場所にも保管しておくとよいでしょう。

サーバ用鍵ペアの作成

VPNサーバ用のPraivateKey(秘密鍵)とPublicKey(公開鍵)を作成していきます。

PrivateKey(秘密鍵)作成

wg genkeyコマンドを使用してPrivateKeyを作成します。

$ wg genkey | sudo tee /etc/wireguard/server_private.key
※秘密鍵の内容が出力される

wg genkeyは秘密鍵を標準出力するだけのコマンドなので、teeコマンドでファイルに出力させています。

PublicKey(公開鍵)作成

作成した秘密鍵を使って、クライアントへ配布するためのPublicKey(公開鍵)を作成します。

$ sudo cat /etc/wireguard/server_private.key | wg pubkey | sudo tee /etc/wireguard/server_public.key
※公開鍵の内容が出力される

wg pubkeyも公開鍵を標準出力するだけのコマンドなので、teeコマンドでファイルに出力させています。

パーミッション設定

作成した鍵のパーミッションを600に設定し、他のユーザから閲覧できないようにします。

$ sudo chmod 600 /etc/wireguard/server_private.key
$ sudo chmod 600 /etc/wireguard/server_public.key

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

クライアント用のPraivateKey(秘密鍵)とPublicKey(公開鍵)を作成していきます。

作成方法はサーバ用鍵ペアの時と同じですが、クライアント用の鍵であることがわかるようなファイル名で作成しておきましょう。

PrivateKey(秘密鍵)作成

今回の環境ではクライアントが2台ありますので、2つの鍵ペアを作成をしていきます。

$ wg genkey | sudo tee /etc/wireguard/client1_private.key
※秘密鍵の内容が出力される
$ wg genkey | sudo tee /etc/wireguard/client2_private.key
※秘密鍵の内容が出力される

クライアントの数がもっと多くなる場合は、秘密鍵の名前をclient3_private.key、client4_private.keyといったように、必要な分だけ作成してください。

PublicKey(公開鍵)作成

作成したクライアント用のPraivateKey(秘密鍵)使用して、PublicKey(公開鍵)を作成していきます。

作成する際は、使用するPraivateKey(秘密鍵)を間違えないように注意してください。

$ sudo cat /etc/wireguard/client1_private.key | wg pubkey | sudo tee /etc/wireguard/client1_public.key
※公開鍵の内容が出力される
$ sudo cat /etc/wireguard/client2_private.key | wg pubkey | sudo tee /etc/wireguard/client2_public.key
※公開鍵の内容が出力される
パーミッション設定

作成した鍵ファイルのパーミッションを600に設定します。

$ sudo chmod 600 /etc/wireguard/client1_private.key
$ sudo chmod 600 /etc/wireguard/client1_public.key
$ sudo chmod 600 /etc/wireguard/client2_private.key
$ sudo chmod 600 /etc/wireguard/client2_public.key

preshared-key(事前共有鍵)作成

preshared-key(事前共有鍵)は、VPN接続の時に使用するパスフレーズのようなもので、WierGuardでは必須というわけではないのですが、少しでもセキュリティを高めるために今回は使用することにします。

  • クライアント1用事前共有鍵ペア client1_preshared.key
  • クライアント2用事前共有鍵ペア client2_preshared.key

preshared-key(事前共有鍵)をクライアントの分だけ作成していきます。

$ wg genkey | sudo tee /etc/wireguard/client1_preshared.key
※事前共有鍵の内容が出力される
$ wg genkey | sudo tee /etc/wireguard/client2_preshared.key
※事前共有鍵の内容が出力される
パーミッション設定

作成した事前共有鍵ファイルのパーミッションを600に設定します。

$ sudo chmod 600 /etc/wireguard/client1_preshared.key
$ sudo chmod 600 /etc/wireguard/client2_preshared.key

VPNサーバ用設定ファイル作成

「/etc/wireguard/VPNインターフェイス名.conf」という名前で、VPNサーバの設定ファイルを作成していきます。

VPN用のインターフェイス名を「wg0」と設定したいので、今回は「/etc/wireguard/wg0.conf」という名前で設定ファイルを作成していきます。

$ sudo vi /etc/wireguard/wg0.conf

設定内容

設定ファイルは[Interface]と[Peer]の項目に分かれています。

  • [Interface]: 自分(VPNサーバ側)に関する設定
  • [Peer]: クライアント側に関する設定
[Interface]項目の設定

[Interface]の項目で設定する内容です。

  • PrivateKey: VPNサーバ用PrivateKey(秘密鍵)
  • Address: VPN用インターフェイスに設定するIPアドレス
  • ListenPort: VPN接続に使用するポート番号
  • PostUp: WireGuard 起動後に実行するコマンド
  • PostDown: WireGuard 終了前に実行するコマンド

「PostUp」では、VPNインターフェイスと物理インターフェイス間をNATさせるルールをiptablesで追加しています。

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

「PostDown」では、作成したルールを削除しています。

PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer] 項目の設定

[Peer]の項目で設定する内容です。

  • PublicKey: クライアント用のPublicKey(公開鍵)
  • PresharedKey: 事前共有キー
  • AllowedIPs: クライアントのVPN用インターフェイスに設定するIPアドレス

接続するクライアントの数だけ[Peer]の設定が必要になります。

[Interface]
PrivateKey = VPNサーバ用PrivateKey(server_private.key)の内容
Address = 172.16.0.254/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
 
[Peer]
### クライアント1用設定
PublicKey = クライアント1用のPublicKey(client1_public.key)の内容
PresharedKey = クライアント1用のpreshared-key(client1_preshared.key)の内容
AllowedIPs = 172.16.0.1/32

[Peer]
### クライアント2 用設定
PublicKey = クライアント2用のPublicKey(client2_public.key)の内容
PresharedKey = クライアント2のpreshared-key(client2_preshared.key)の内容
AllowedIPs = 172.16.0.2/32
AllowedIPsについて

AllowedIPsの設定を簡単に説明すると、VPN通信を行うネットワークを設定する項目になります。

VPNサーバ側はクライアント側と通信する場合のみVPN通信を行いたいため、クライアント側に設定するIPアドレスを指定しています。

すべての通信をVPNで行いたい場合は、0.0.0.0/0といったように指定します。

クライアント用設定ファイル作成

次にクライアント側で使用するための設定ファイルを作成していきます。

クライアント1用設定

クライアント1用の設定ファイルを作成していきます。

$ sudo vi /etc/wireguard/wireguard_client1.conf

設定ファイルの名前には決まりはありませんので、どのクライアント用なのかが判別しやすい名前で作成してください。

設定内容

クライアント用の設定ファイルも[Interface]と[Peer]の項目に分かれていて、こちらは[Interface]がクライアント側に関する設定となり、[Peer]がVPNサーバ側に関する設定になります。

  • Interface: クライアント側設定
  • Peer: VPNサーバ側設定
[Interface]項目の設定

[Interface]部分はクライアント側に関する設定となります。

  • PrivateKey: クライアント1用のPrivateKey
  • Address: VPN用インターフェイスに設定するIPアドレス
  • DNS: VPN通信時に使用するDNSサーバ
DNS設定について

[Peer]部分で設定するAllowedIPsに0.0.0.0/0を指定した場合、すべての通信がVPN経由となります。

そのため、すでに機器上に設定されているDNSサーバと通信できなくなる場合があるため、VPN使用時に使用するDNSの設定も入れる必要があります。

ちなみに今回設定している「8.8.8.8」は、googleで提供されているDNSサーバのアドレスになります。

[Peer]項目の設定

[Peer]部分は接続先のVPNサーバ側に関する設定となります。

  • PublicKey: VPNサーバのPublicKey(公開鍵)
  • PresharedKey: 事前共有キー
  • EndPoint: VPNサーバ側の接続用アドレスとポート番号
  • AllowedIPs: VPNを経由させる通信先アドレス
EndPoint設定について

EndPpintに設定するVPNサーバの接続用アドレスは、クライアントからインターネット経由で接続できるグローバルIPかホスト名を設定してください。

AllowedIPs設定について

クライアント1は、外出先でFreeWiFi等を使用している場合を想定しています。

AllowedIPsに0.0.0.0/0を指定することで、Web閲覧などのすべての通信をVPN経由にして通信を暗号化させています。

[Interface]
PrivateKey = クライアント1用PrivateKey(client1_private.key)
Address = 172.16.0.1/24
DNS = 8.8.8.8

[Peer]
PublicKey = VPNサーバー用のPublicKey(server_public.key)
PresharedKey = クライアント1用のpreshared-key(client1_preshared.key)
EndPoint = VPNサーバーのアドレス:51820
AllowedIPs = 0.0.0.0/0 

QRコード作成

クライアントがスマホの場合、WireGuardのアプリからQRコードを読み込ませることで、作成した設定内容を反映させることができます。

設定ファイルからQRコードを作成させるために必要なqrencodeというアプリケーションをインストールします。

$ sudo apt install qrencode
コンソールにQRコードを表示させる場合

現在作業している画面(コンソールやSSHクライアント)にQRコードを表示させいたい場合は、下記のようにコマンドを実行してください。

$ sudo qrencode -t ansiutf8 -r /etc/wireguard/wireguard_client1.conf

表示されるQRコードのサイズは大きめなので、環境によっては画面上に表示しきれない場合もあるかもしれません。

QRコードを画像として保存したい場合

QRコードを画像ファイルとして保存したい場合は、下記のコマンドを実行してください。

$ sudo qrencode -o client1.png -d 350 -r /etc/wireguard/wireguard_client1.conf 

クライアント2用設定

クライアント1用の設定と同様に、クライアント2用の設定ファイルを作成していきます。

$ sudo vi /etc/wireguard/wireguard_client2.conf
AllowedIPsの設定について

クライアント2は、VPNに接続された機器と通信する場合のみVPNを経由させる想定となっているので、AllowedIPsにVPN用ネットワークの172.16.0.0/24を設定しています。

PersistentKeepaliveの設定について

PersistentKeepaliveはVPN接続を維持させるためのKeepAliveを送信する間隔を設定する項目です。

今回の構成ではクライアント2は自宅にあるPCとなっていて、外出先からもVPN経由でアクセスしたいので「PersistentKeepalive」を設定して、VPNの接続を常時維持させるようにしています。

[Interface]
PrivateKey = クライアント2用のPrivateKey(client2_private.key)の内容
Address = 172.16.0.2/24

[Peer]
PublicKey = VPNサーバー用のPublicKey(server_public.key)
PresharedKey = クライアント1用のpreshared-key(client2_preshared.key)
EndPoint = VPNサーバーのアドレス:51820
AllowedIPs = 172.16.0.0/24
PersistentKeepalive = 25

WireGauardの起動・停止方法

設定ファイルが作成できたら、VPNサーバ側のWireGuardを起動させます。

起動

WireGuardの起動は下記のコマンドで行います。

$ sudo wg-quick up VPNインターフェイス名

本手順では、VPNサーバ側の設定ファイルを「/etc/wireguard/wg0.conf」という名前で作成しているので、VPN用のインターフェイス名は「wg0」となります。

$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 172.16.0.254/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

停止

WireGuardを停止させるためのコマンドです。

$ sudo wg-wuick down VPNインターフェイス名

VPNインターフェイス名が「wg0」なので、下記のように実行します。

$ sudo wg-quick down wg0
[#] ip link delete dev wg0
[#] iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

自動起動設定

VPNサーバが起動した際に、自動的にWireGuardを起動させるために自動起動設定を行います。

$ sudo systemctl enable wg-quick@VPNインターフェイス名

VPNインターフェイス名が「wg0」なので、下記のように実行します。

$ sudo systemctl enable wg-quick@wg0
Created symlink /etc/systemd/system/multi-user.target.wants/wg-quick@wg0.service → /lib/systemd/system/wg-quick@.service.

確認方法

VPNの接続状況は「wg」コマンドで確認することができます。

$ sudo wg
interface: wg0
  public key: VPNサーバのPublicKeyが表示される
  private key: (hidden)
  listening port: 51820

  peer: クライアント1用PublicKey
  preshared key: (hidden)
  endpoint: クライアント1のIPアドレス:ポート番号
  allowed ips: 172.16.0.1/32
  latest handshake: 3 minutes, 36 seconds ago
  transfer: 1020 B received, 7.55 KiB sent

peer: クライアント2用PublicKey
  preshared key: (hidden)
  endpoint: クライアント2のIPアドレス:ポート番号
  allowed ips: 172.16.0.2/32
  latest handshake: 5 minutes, 9 seconds ago
  transfer: 16.51 KiB received, 11.53 KiB sent

クライアント側へWireGuardをインストール

クライアント側にインストールするWireGuardは、下記の公式サイトから探すことができます。

https://www.wireguard.com/install/

クライアント1(iPhone)へのインストール

iPhone(iOS)へインストールする場合は、AppStoreへのリンクがあるので、そこからインストールしてください。

https://apps.apple.com/jp/app/wireguard/id1441195209

クライアント2(Ubuntu)へのインストール

Ubuntuの場合は、VPNサーバと同様にaptを使用してインストールを行います。

$ sudo apt update
$ sudo apt install wireguard

その他のデバイスへのインストール

Androidの場合はGoogleのPlayStoreから、Windowsの場合はインストーラーをダウンロードしてインストールを行ってください。

クライアント1(iPhone)設定

今回は、VPNサーバで作成したQRコードを読み込んで設定を行っていきます。

iPhoneにインストールしたWireGuardで、QRコードを読み込むための手順は下記のとおりです。

  • WireGuardを起動
  • 右上の「+」をタップ
  • QRコードから作成をタップ
  • QRコードを読み込む
  • 設定に名前をつける
  • VPN構成の追加を許可する

右上の「+」をタップします。

QRコードから作成をタップします。

カメラへのアクセス許可を求められるのでOKをタップします。

QRコードをスキャンすると、読み込んだ設定に名前をつけるためのウィンドウが表示されるので、名前を入力して保存をタップします。

VPNの構成を追加しても良いかの許可を求めるウィンドウが表示されるので、許可をタップします。

VPNの設定を追加するために、iPhoneでの認証を行ってください。

VPNへの接続と切断

右側にあるスイッチをタップすることで、VPNへの接続・切断を操作することができます。

設定内容の確認方法

設定したVPNの名前をタップすると、そこに設定されている内容を表示させることができます。

クライアント2(Ubuntu)設定

VPNサーバの時と同じように設定ファイルを作成していきます。

$ sudo vi /etc/wireguard/wg0.conf

設定ファイルの内容は、VPNサーバで作成した「/etc/wireguard/wireguard_client2.conf」の内容をコピペしてください。

VPNサーバで設定ファイルを表示させる際の注意点

VPNサーバ側で設定ファイルを表示させる場合は、sudoを使用しないと「Permission denied」になってしまいますので注意してください。

$ sudo cat /etc/wireguard/wireguard_client2.conf

WireGuardの起動・停止

VPNサーバと同様に、wg-quickコマンドでWireGuardの起動・停止を行うことができます。

  • 起動: sudo wg-quick up wg0
  • 停止: sudo wg-wuick down wg0

接続状態の確認

接続状態などを確認したい場合は、wgコマンドを実行してください。

  • ステータス確認: sudo wg

コメント

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