🔭

公共WiFiでも安心! Azure + WireGuardで作る個人VPNサーバー構築ガイド

に公開

✨ はじめに

公共や店舗などの無料のWiFiは便利ですが、どうしてもセキュリティの不安がつきまといますよね😟 そんな時に便利なのがVPNですが、世の中にたくさんあるVPNサービスの中からセキュリティやプライバシーの懸念がないサービスを選ぶのも大変な作業です。VPNを使っていたとしても、VPNサービス業者によるログ収集や通信内容の監視などのプライバシーリスクも懸念されます。

そんなわけでこの記事では、Azure VMとWireGuardを使って自分でVPN環境を構築する方法について解説します。さすがに無料で運用することはできませんが、必要最小限の構成を選んだり、使用するときだけVMを起動するようにすれば出費をかなり抑えることが可能です。

💡 WireGuardとは

WireGuardとは、ChaCha20やCurve25519などの現代的な暗号化技術を採用した、シンプルで高速なVPNプロトコルです。2016年頃に登場した比較的新しい技術で、2020年にLinuxカーネルにも採用されており信頼性も高く評価されています。詳しくは下記公式サイトをご参照ください。

https://www.wireguard.com/

💻 構築する環境

構成図
全体の構成図

  • VPNサーバー側
    • 環境: Azure VM(サイズ:b1ls)
    • OS: Ubuntu 22.04 LTS
    • ソフトウェア: WireGuard Toolsをインストール
  • VPNクライアント側
    • 環境: Windows PC(Android、iOS端末でも可能)
    • OS: Windows 11
    • ソフトウェア: WireGuard Windows版をインストール
  • サーバー管理用
    • 環境: Windows PC(SSH接続できる環境ならなんでも)

📜 作業手順

大まかな作業手順は以下の通りです。

  1. VPNサーバー(Ubuntu)接続用のキーペアを作成
  2. AzureにVPN用仮想サーバー(Ubuntu)を作成
  3. 仮想サーバーにWireGuardをインストール
  4. クライアントにWireGuardをインストール
  5. 仮想サーバーにクライアントの情報を設定
  6. 動作テスト

📌 1. VPNサーバー(Ubuntu)接続用のキーペアを作成

まず、これから作成するVPNサーバーに接続するためのキーペアを作ります。鍵のタイプはed25519を使用します。ed25519は公開鍵暗号方式の一つで、楕円曲線を使った高速かつ安全性の高い鍵タイプです。接続元の環境はWindows PCを想定しています。

キーペアを作成するにはコマンドプロンプトで以下のコマンドを実行します。

ssh-keygen -t ed25519 -C "for VPN Server"

実行するとパスフレーズを聞いてきますが、必要なければ未入力のままEnterキーを2度押せばOKです。

Enter passphrase (empty for no passphrase):↩
Enter same passphrase again:↩

成功するとユーザーディレクトリ(C:\Users\[ユーザ名]\.ssh\)の下に2つのファイルが作成されます。

ファイル 説明
id_ed25519 秘密鍵
id_ed25519.pub 公開鍵

📌 2. AzureにVPN用仮想サーバー(Ubuntu)を作成

作成

作成する仮想サーバーの主なスペックは以下の通りです。安価に運用するための構成になっています。

項目 設定値
仮想マシン名 my-vpn-server(好きな名前で構いません)
リージョン Japan East または Japan West
イメージ Ubuntu Server 22.04 LTS
サイズ Standard b1ls(メモリ0.5GB)… 月額820円
認証の種類 SSH 公開キー
ユーザー名 azureuser(好きな名前で構いません)
SSH公開キーのソース 既存の公開キーを使用
SSH 公開キー 1で作成した公開鍵のテキストをここに貼り付けます
OS ディスクの種類 Standard SSD(ローカル冗長ストレージ)※Standard HDDでもOKです
自動シャットダウンを有効にする 無効(有効だと必要に応じて起動する必要があります)

その他の項目は基本的にデフォルト時でOKです。お好みに合わせて調整してください。
設定を確認し、作成ボタンを押すとデプロイが開始されます。

接続

デプロイが完了したらSSHで接続してみます。
コマンドプロンプトを起動し、以下のコマンドを入力します。
xx.xx.xx.xxのところには作成した仮想サーバーのグローバルアドレスを指定します。

ssh -i ~/.ssh/id_ed25519 azureuser@xx.xx.xx.xx

接続に成功すると以下のように聞かれるので、yesと入力してEnterキーを押します。

The authenticity of host 'xx.xx.xx.xx (xx.xx.xx.xx)' can't be established.
ED25519 key fingerprint is SHA256:tQ/Cz/IMheWbI+f6RdzBoLuqw52pSy3sfJ55qLz0O/E.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

以下のようなプロンプトが表示されれば接続成功です。

azureuser@my-vpn-server:~$

最新の状態に更新

以下のコマンドを実行して、仮想サーバーを最新の状態に更新します。

sudo apt update && sudo apt upgrade -y

更新中に以下のような画面が出ますが、とりあえずOKを選んで(TabキーでOKに移動できます)Enterすれば大丈夫です。

Ubuntuの更新
更新時に表示されるサービス再起動確認画面

ネットワーク設定

WireGuardで接続するにはUDPの51820ポートを受信できるように設定する必要があります。
Azureポータル上で、仮想マシンのネットワーク設定ー受信セキュリティ規則を追加してください。

受信セキュリティ規則
受信セキュリティ規則でUDP 51820ポートを許可

📌 3. 仮想サーバーにWireGuardをインストール

仮想サーバーの更新が終わったら、WireGuardをインストールして設定していきます。

WireGuardのインストール

WireGuardをインストールするには以下のコマンドを実行します。Ubuntu更新時にも表示されたサービス再起動確認画面が表示された場合は、OKを選んでEnterします。

sudo apt install wireguard -y

VPN用のキーペアの作成

以下の一連のコマンドを実行して、VPN用のキーペアを作成します。

sudo -i # root権限でシェルを起動
cd /etc/wireguard
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
exit    # rootからログアウトする

作成できたら次のコマンドを実行して秘密鍵を確認します。

sudo cat /etc/wireguard/privatekey

この秘密鍵は次の工程で使うので表示された文字列をメモ帳か何かに貼り付けておきます。

WireGuardの設定ファイルを作成

以下のコマンドを実行しnanoエディタを起動します。

sudo nano /etc/wireguard/wg0.conf

nanoエディタが起動したら、以下の内容を記述し保存します。サーバーの秘密鍵の箇所には、前工程で取得した秘密鍵を記載します。nanoエディタはCtrl+OEnterで保存、Ctrl+X で終了できます。

wg0.conf
[Interface]
PrivateKey = サーバーの秘密鍵(`cat privatekey` で確認)
Address = 10.66.66.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

この例ではAddressを10.66.66.1/24としていますが、他のローカルネットワークと重複しなければなんでも構いません。

PostUpとPostDownの項目はVPN経由でインターネットに出るためのNAT設定です。

保存したら、以下のコマンドでWireGuardを起動してみます。

sudo wg-quick up wg0

続いて次のコマンドを実行して、WireGuardの状態を確認します。

sudo wg show

以下のような出力が表示されれば起動成功です。

interface: wg0
  public key: ipAN7bXytgT6Ii2NvaNejn5p3k+qXFWivhj9sCxofj0=
  private key: (hidden)
  listening port: 51820

WireGuardの自動起動設定

以下のコマンドを実行して、サーバー再起動後も自動的にWireGuardを実行するようにします。

sudo systemctl enable wg-quick@wg0

IP転送の有効化

サーバー側でIP転送が無効だと、VPNサーバーに接続できても、そこからインターネットに出られません。まず、次のコマンドで状態を確認します。

# IP転送が有効化どうかを確認:0の場合は無効
cat /proc/sys/net/ipv4/ip_forward

0と表示された場合は次のコマンドを実行して、IP転送を有効化します。

# 有効にする(一時的)
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

# 永続化(再起動後も有効)
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf

📌 4. クライアントにWireGuardをインストール

続いて接続元となるクライアントにWireGuardをインストールし設定していきます。ここではWindowsクライアントの例を説明します。

ダウンロード&インストール

以下のサイトにアクセスし、Windows用のインストーラーをダウンロードします。

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

ダウンロードが終わったらwireguard-installer.exeを実行してWireGuardクライアントをインストールします。

設定

左下の▼を押して空のトンネルを追加...を選択します。

WireGuard起動画面
WireGuard起動画面

すると次のような画面が表示されます。初期状態でクライアント用のキーペアが生成されていますので、ここに必要な情報を追加していきます。

トンネルの新規作成画面
起動直後のトンネル新規作成画面

以下が編集例です。PeerPublicKeyにはサーバーのWireGurad公開鍵を、EndpointのIPアドレス部分はサーバーのIPアドレスを記載してください。

トンネルの新規作成画面2
新規トンネルの設定例

以下書き方の説明です(コメント部分は実際には記載しないでください)。

[Interface]
PrivateKey = クライアントのWireGuard秘密鍵
Address = 10.66.66.2/24         # VPN内でのクライアントIP
DNS = 1.1.1.1                   # VPN経由で使用するDNSサーバー

[Peer]
PublicKey = サーバーのWireGuard公開鍵
AllowedIPs = 0.0.0.0/0          # 全トラフィックをVPN経由(フルトンネル)
Endpoint = xx.xx.xx.xx:51820    # VPNサーバーのIPアドレス:ポート

設定が完了すると以下のような画面になります。

WireGuard設定完了後
新規トンネル追加後の画面


📌 5. 仮想サーバーにクライアントの情報を設定

再度サーバーに接続して、前項で作成したクライアントのWireGuard公開鍵を登録します。

接続

ssh -i ~/.ssh/id_ed25519 azureuser@xx.xx.xx.xx

WireGuard設定ファイルの編集

nanoエディタでwg0.confファイルを開き、[Peer]以下を追記して保存します。
PeerのPublicKeyにはクライアントのWireGuard公開鍵を記入します。

sudo nano /etc/wireguard/wg0.conf
wg0.conf
[Interface]
PrivateKey = サーバーのWireGuard秘密鍵(記載済み)
Address = 10.66.66.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = cgdDUv3IJRpylL1OhNzl0HUMZT1UfvSfUK1B9fThR2U=
AllowedIPs = 10.66.66.2/32

WireGuardの再起動

サーバー側のWireGuardを再起動し、編集した設定を有効化します。

# WireGuardサーバーの停止
sudo wg-quick down wg0
# WireGuardサーバーの起動
sudo wg-quick up wg0
# 設定反映後の状態確認
sudo wg show

📌 6. ファイアウォールの設定

Azureのネットワークセキュリティグループ(NSG)は既に機能していますが、セキュリティをより強固にするためにOSレベルでのファイアウォール(ufw)を導入します。以下の手順で進めてください。

ufwのインストール

sudo apt install ufw

デフォルトポリシーの設定

# 受信全拒否
sudo ufw default deny incoming
# 送信全許可
sudo ufw default allow outgoing

SSHを許可

sudo ufw allow ssh

WireGuard用のポート(UDP 51820)を許可

sudo ufw allow 51820/udp

WireGuardインターフェイスからLAN側への通信を許可

# WireGuardから入ってきたパケットをLAN(eth0)に流す
sudo ufw route allow in on wg0 out on eth0

ファイアウォールの有効化

sudo ufw enable

ファイアウォールの状態確認

sudo ufw status verbose

以下のような表示になればOKです。

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
51820/udp                  ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)
51820/udp (v6)             ALLOW IN    Anywhere (v6)

Anywhere on eth0           ALLOW FWD   Anywhere on wg0
Anywhere (v6) on eth0      ALLOW FWD   Anywhere (v6) on wg0

📌 7. 動作テスト

WireGuardクライアントの有効化(VPNサーバーと接続)

クライアントに戻り、有効化ボタンを押します。

有効化ボタンを押す
WireGuardクライアントで有効化ボタンを押す

するとWireGuardサーバー(VPNサーバー)に接続し、次のような画面になります。

VPNサーバー接続後
WireGuardサーバー(VPNサーバー)接続後の画面

ブラウザでインターネットにアクセスしてみる

クライアントPCでブラウザを起動して、適当なサイトにアクセスしてみます。
本当にVPNサーバーからインターネットに出ているかどうかを確かめるには、「確認くん」などのサイトで接続元のIPアドレスを確認するといいでしょう。表示されるIPが仮想サーバーのグローバルIPと同じなら、VPN経由でインターネットに接続していることになります。

確認くん

🛠️ トラブルシューティング

VPN環境の構築中によくある問題と解決方法をまとめました。困った時の参考にしてください。

🥺 SSH接続ができない場合

症状: ssh: connect to host xx.xx.xx.xx port 22: Connection timed out

原因と対処法:

  1. ネットワークセキュリティグループの設定確認

    • Azureポータルで仮想マシンの「ネットワーク」タブを確認
    • SSH(ポート22)の受信規則が有効になっているか確認
  2. 秘密鍵のパスが間違っている

    # Windows形式のパスを試してみる
    ssh -i %HOMEPATH%\.ssh\id_ed25519 azureuser@xx.xx.xx.xx
    
    # ファイルが存在するか確認
    dir %HOMEPATH%\.ssh\
    
  3. 仮想マシンが起動していない

    • Azureポータルで仮想マシンの状態を確認し、必要に応じて起動

症状: Permission denied (publickey)

原因と対処法:

  • 公開鍵の設定が間違っている可能性があります
  • Azure仮想マシン作成時に指定した公開鍵の内容を再確認してください

🥺 WireGuard接続ができない場合

症状: クライアントで「有効化」を押しても接続できない

原因と対処法:

  1. ポート51820が開放されていない

    # サーバー側でポートの状態を確認
    sudo ss -tuln | grep 51820
    
    • AzureのネットワークセキュリティグループでUDP 51820ポートが許可されているか確認
  2. 公開鍵の設定ミス

    # サーバー側でWireGuardの状態確認
    sudo wg show
    
    # 設定ファイルの内容確認
    sudo cat /etc/wireguard/wg0.conf
    
    • クライアントとサーバーで互いの公開鍵が正しく設定されているか確認
  3. WireGuardサービスが起動していない

    # サービスの状態確認
    sudo systemctl status wg-quick@wg0
    
    # 手動でWireGuardを起動
    sudo wg-quick up wg0
    

🥺 インターネットに接続できない場合

症状: VPN接続は成功するが、ブラウザでWebサイトにアクセスできない

原因と対処法:

  1. IP転送が無効になっている

    # IP転送の状態確認(0なら無効)
    cat /proc/sys/net/ipv4/ip_forward
    
    # 有効化
    echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
    echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
    
  2. iptablesの設定が正しくない

    # 現在のiptables設定を確認
    sudo iptables -t nat -L
    sudo iptables -L FORWARD
    
    # WireGuardを再起動して設定を再適用
    sudo wg-quick down wg0
    sudo wg-quick up wg0
    
  3. DNSの問題

    • クライアント設定のDNSを別のものに変更してみる
      • 1.1.1.18.8.8.8
      • 8.8.8.81.1.1.1

🥺 クライアント側でよくある問題

症状: 「トンネルを有効化できませんでした」

原因と対処法:

  1. 管理者権限で実行していない

    • WireGuardクライアントを右クリック → 「管理者として実行」
  2. 他のVPNソフトとの競合

    • 他のVPN接続を切断してから再試行
  3. 設定ファイルの書式エラー

    • 余分な空白や改行がないか確認
    • PublicKeyやPrivateKeyが正しい形式か確認(Base64エンコードされた文字列)

🥺 接続後の動作確認方法

以下のコマンドで現在の接続状態を確認できます:

# サーバー側:接続中のクライアント確認
sudo wg show

# クライアント側:現在のIP確認(Windows)
curl ifconfig.me

正常な状態の例:

# サーバー側の表示例
interface: wg0
  public key: ipAN7bXytgT6Ii2NvaNejn5p3k+qXFWivhj9sCxofj0=
  private key: (hidden)
  listening port: 51820

peer: cgdDUv3IJRpylL1OhNzl0HUMZT1UfvSfUK1B9fThR2U=
  allowed ips: 10.66.66.2/32
  latest handshake: 1 minute, 23 seconds ago  # ← 最近の通信があることを示す
  transfer: 2.75 KiB received, 3.19 KiB sent

🥺 まだ解決しない場合

  1. ログの確認

    # システムログでWireGuard関連のエラーを確認
    sudo journalctl -u wg-quick@wg0 -f
    
  2. 設定の初期化

    • 一度すべての設定を削除して、手順を最初からやり直す
  3. ネットワーク環境の確認

    • 接続元のネットワークでVPNが制限されていないか確認
    • 企業ネットワークなどでは特定のポートがブロックされている場合があります

💎 まとめ

お疲れさまでした! これでAzure上にWireGuardを使った個人用VPNサーバーが完成しました。

🎉 構築したVPNサーバーでできること

  • 公共WiFiでの安全なインターネット利用
    カフェ、空港、ホテルなどのWiFiでも通信が暗号化されます
  • プライバシーの保護
    ISPや第三者からの通信内容の盗み見を防げます

💰 運用コスト

今回構築した構成での月額コストは約2000円程度です。

  • 仮想マシン: 820円
  • グローバルIP: 約400円(VMを停止しても課金される)
  • ストレージ: 約400円(VMを停止しても課金される)
  • 通信料: 少々(通信料に依存)

VMを停止したとしても毎月800円程度は取られてしまうのは痛いですね。もっとリーズナブルにしたいという場合は、さくらインターネットなどのVPSサービスを使うという手もあります。または、自宅にグローバルIPがある方は、自宅にVPNサーバーを作っちゃうという手もあります。はたまた、あなたがVisual Studioサブスクリプションのライセンスを持っているなら、その特典を利用するという手もあります。ひょっとすると、それが一番お得かもしれません。

⚠️ セキュリティ上の注意点

  • SSH秘密鍵とWireGuard秘密鍵は厳重に管理してください
  • 定期的にUbuntuのアップデートを実行しましょう
  • 不要になったクライアント設定は速やかに削除してください

😊 さいごに

この記事ではAzureとWireGuardを使ったVPN環境の構築方法を説明してきました。
やることが結構あって大変そうですが、ひとつひとつやっていけばそう難しくはありません。
一度設定が終わってしまえば、安心して公共WiFiを使えるようになります!

それではVPNを使って楽しいネットライフを。
じゃあね~、バイバイ! 😊

Discussion