2026年5月26日

2026年5月26日

WireGuardで社内VPNを構築する方法(社員ごとの鍵管理と社内LAN・管理画面へのアクセス制限)

WireGuard で社内VPNを作るには、VPNサーバー(ハブ)を1台用意し、社員の端末ごとに鍵ペアとVPN内のアドレスを割り当てて、社内LANへの経路を通します。この記事では、Ubuntu のサーバーをハブにして、リモートワークの端末から社内LANや社内向けサーバーへ安全に入れるようにする手順を説明します。社員の追加・削除の運用と、WordPress の管理画面をVPN経由に限定する使い方まで扱います。

この記事で作る構成

  • VPNサーバー:Ubuntu、グローバルIPあり、UDP 51820番で待ち受け
  • VPN内のアドレス帯:10.8.0.0/24(サーバーは 10.8.0.1)
  • 社内LAN:192.168.10.0/24(VPNサーバーから到達できる)
  • 社員の端末:Windows・macOS・スマートフォンなど、端末ごとに 10.8.0.2、10.8.0.3…を割り当て

通信の流れは「社員の端末 → VPNサーバー → 社内LAN」です。インターネット全体の通信をVPNに通すのではなく、社内向けの通信だけをVPNに流す「スプリットトンネル」を基本にします。全通信をVPN経由にすると、サーバーの回線負荷が増え、社員の通常のWeb閲覧も遅くなりやすいためです。

VPN内のアドレス帯は、社内LANや社員の自宅ルーターでよく使われる 192.168.0.0/24・192.168.1.0/24 と重ならないものを選びます。重なると、自宅のネットワークとVPNのどちらに送るべきか端末が判断できず、つながらなくなります。

WireGuardの考え方:鍵が「ユーザー」の代わり

WireGuard は、各端末(ピア)が公開鍵と秘密鍵のペアを持ち、相手の公開鍵を登録し合うことで通信します。ユーザー名やパスワードの仕組みはなく、「どの公開鍵を持つ端末が、どのVPN内アドレスを使えるか」を AllowedIPs で決めます。

このため、社内VPNとして運用するときは次の点を意識します。

  • 1人1台ごとに鍵を分けます。鍵を共有すると、誰の接続か分からず、退職時に1人だけを切ることもできません。
  • 秘密鍵は端末から外に出さないのが原則です。管理者が代理で作る場合は、受け渡し後に管理者側の控えを削除します。
  • WireGuard 自体には多要素認証やシングルサインオンの機能はありません。必要なら、WireGuard を基盤にした Tailscale などの管理サービスや、自社の認証基盤と組み合わせる方法も検討します。

サーバーの準備とインストール

WireGuard は Linux カーネル 5.6 以降に組み込まれており、現在の Ubuntu や Debian ではパッケージを入れるだけで使えます。

sudo apt update
sudo apt install wireguard

サーバーの鍵ペアを作ります。秘密鍵が他のユーザーに読まれないよう、umask を設定してから作業します。

sudo -i
cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub

サーバーの設定ファイル

/etc/wireguard/wg0.conf を作ります。PrivateKey には server.key の中身を貼ります。

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server.key の内容>
# VPNから社内LANへ出る通信を、サーバーのアドレスに変換して転送する
PostUp   = iptables -A FORWARD -i %i -o eth1 -j ACCEPT; iptables -A FORWARD -i eth1 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -o eth1 -j ACCEPT; iptables -D FORWARD -i eth1 -o %i -m state --state RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -o eth1 -j MASQUERADE

# 社員A のノートPC
[Peer]
PublicKey = <社員Aの端末の公開鍵>
AllowedIPs = 10.8.0.2/32

eth1 は社内LAN側のインターフェース名に置き換えます(ip -br addr で確認できます)。%i は wg-quick が wg0 に置き換えます。

ここでは社内LANへ出る通信をサーバーのアドレスに変換(MASQUERADE)しています。こうすると社内LAN側のルーターに設定を足さなくても通信が戻ってきます。社内の機器のログに社員ごとのVPNアドレスを残したい場合は、変換をやめ、社内LANのルーターに「10.8.0.0/24 宛てはVPNサーバーへ」という経路を追加します。

AllowedIPs = 10.8.0.2/32 は「この公開鍵の端末は 10.8.0.2 だけを名乗れる」という意味です。サーバー側では各ピアに /32 を割り当てるのが基本です。

IP転送とファイアウォール

サーバーがVPNと社内LANの間で通信を中継できるよう、IP転送を有効にします。

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

ufw を使っている場合は、WireGuard のポートを開けます。ufw は転送の既定方針で FORWARD を拒否していることが多いため、上の PostUp のルールが効かない場合は /etc/default/ufw の転送設定や ufw のルーティングルール(ufw route allow)も確認します。

sudo ufw allow 51820/udp

設定を反映して起動し、OS起動時に自動で立ち上がるようにします。

sudo systemctl enable --now wg-quick@wg0
sudo wg show

社員の端末の設定

社員の端末には WireGuard の公式アプリを入れ、端末側で鍵ペアを作ります。公式アプリは Windows・macOS・iOS・Android 向けが提供されています(2026年10月現在)。アプリでトンネルを新規作成すると鍵が自動で生成されるので、公開鍵だけを管理者に送ってもらいます。

端末側の設定は次のようになります。

[Interface]
PrivateKey = <端末で生成された秘密鍵(アプリが自動で入れる)>
Address = 10.8.0.2/32
DNS = 192.168.10.1

[Peer]
PublicKey = <server.pub の内容>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.8.0.0/24, 192.168.10.0/24
PersistentKeepalive = 25

AllowedIPs に書いたアドレス帯だけがVPNを通ります。ここを 0.0.0.0/0 にすると全通信がVPN経由になります。DNS は社内のDNSサーバーで社内向けの名前を引きたいときに指定します。不要なら行ごと省略します。

PersistentKeepalive = 25 は、自宅ルーターやモバイル回線のNATで接続が切れるのを防ぐため、25秒ごとに小さなパケットを送る設定です。

QRコードで配布したい場合は、qrencode などのツールで端末用の設定ファイルをQRコードにできます。ただし、この方法では管理者側で秘密鍵を作ることになるため、表示後に設定ファイルを削除します。

社員の追加・削除の運用

社員を追加するときは、wg0.conf に [Peer] を追記し、通信中の接続を切らずに反映します。

sudo bash -c 'wg syncconf wg0 <(wg-quick strip wg0)'

退職や端末の紛失時は、該当する [Peer] を削除して同じコマンドで反映します。その場ですぐ切りたい場合は、次のコマンドでも外せます(設定ファイルからも忘れずに削除します)。

sudo wg set wg0 peer <公開鍵> remove

運用が増えてくると「どの公開鍵が誰の端末か」が分からなくなりがちです。[Peer] の直前のコメントに氏名・端末名・発行日を書き、別途台帳でも管理しておきます。wg show の「latest handshake」で、長期間使われていない鍵を見つけて整理することもできます。

応用:WordPressの管理画面をVPN経由に限定する

社内向けのWordPressや、社外公開しているサイトの管理画面を、VPNからのアクセスだけに絞る使い方があります。サイトがVPNサーバーと同じ社内ネットワークにある場合、Nginx なら次のように書けます。

location = /wp-login.php {
    allow 10.8.0.0/24;
    allow 192.168.10.0/24;
    deny  all;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/run/php/php-fpm.sock;
}

VPNサーバーでアドレス変換(MASQUERADE)をしている場合、社内LANのサーバーから見た接続元はVPNサーバーの社内LAN側アドレスになります。許可するアドレスは、実際のアクセスログに記録される接続元に合わせて絞り込みます。社外のレンタルサーバーで動いているサイトは、VPNを通らずに直接アクセスされるため、この方法では制限できません。

/wp-admin/ 全体を制限する場合、フロント側の機能が使う /wp-admin/admin-ajax.php まで止めると、フォームや検索などが動かなくなることがあります。制限の範囲を決めたら、ログアウトした状態でサイトの主な機能を一通り確かめてください。設定を誤ると自分も入れなくなるため、サーバーにSSHで入れる経路を残したうえで作業し、設定ファイルのバックアップを取っておきます。

つながらないときの確認順

  1. sudo wg show で、該当ピアの「latest handshake」が更新されているかを見ます。更新されていなければ、UDP 51820番がサーバーやクラウドのファイアウォールで閉じているか、公開鍵の貼り間違いが疑われます。
  2. ハンドシェイクはできているのに社内LANに届かない場合は、IP転送の設定と FORWARD のルール、端末側の AllowedIPs に社内LANのアドレス帯が入っているかを確認します。
  3. 一部の自宅回線だけつながらない場合は、自宅LANのアドレス帯と社内LAN・VPNのアドレス帯が重なっていないかを確認します。

まとめ

  • ハブとなるVPNサーバーに社員の端末を1台ずつピアとして登録し、AllowedIPs でVPN内のアドレスを固定します。
  • 社内向けの通信だけをVPNに流すスプリットトンネルを基本にし、アドレス帯は自宅ネットワークと重ならないものを選びます。
  • 鍵は1人1台ごとに分け、追加・削除は wg syncconf で反映し、台帳で誰の鍵かを管理します。
  • WordPressの管理画面をVPN経由に限定する場合は、admin-ajax.php の扱いと、自分が締め出されない経路に注意します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲