OSS VPN比較:WireGuard vs OpenVPN vs Tailscale でセキュアなリモートアクセスを構築
オープンソースラボ編集部 ・ 2026年6月13日
OSS VPN比較:WireGuard vs OpenVPN vs Tailscale でセキュアなリモートアクセスを構築
AWSのVPN(月$72〜)やZscalerの企業VPN(月$5〜15/ユーザー)に対して、WireGuard(最速・最軽量)・OpenVPN(歴史ある互換性最高)・Tailscale(WireGuardベースのメッシュVPN・部分OSSコア)はセルフホスト可能なVPNソリューションです。リモートワーカーの社内リソースアクセス・クラウドネットワーク接続・ゼロトラスト化を低コストで実現できます。
OSS VPNを選ぶ理由
- コスト削減: AWS Site-to-Site VPNの月$72 + データ転送料をゼロに
- プライバシー: 商用VPNサービスはログを保持する可能性があるが、セルフホストなら完全なプライバシー
- パフォーマンス: WireGuardはOpenVPNより3〜4倍高速(本番実測値)
- ゼロトラスト: IPアドレスでなくデバイス証明書・ユーザー認証でアクセス制御
- エッジケース対応: 独自のルーティング・スプリットトンネリング・Kill Switchを設定
主要ツールの概要
WireGuard
Linux Kernel 5.6以降に統合されたVPNプロトコルです。GitHubスター6k+(wireguard-go実装)。4,000行のコード(OpenVPNの70,000行に対して)で実装され、ChaCha20暗号・Curve25519鍵交換でシンプルかつ安全。起動が瞬時で、モバイルのネットワーク切り替え時の再接続が非常に速い。
# WireGuardをUbuntuサーバーにセットアップ(VPNサーバー側)
apt-get install -y wireguard
# サーバーの鍵ペアを生成
cd /etc/wireguard
wg genkey | tee server_private.key | wg pubkey > server_public.key
chmod 600 server_private.key
# クライアントの鍵ペアを生成
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
# WireGuard設定ファイル(サーバー)
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = $(cat server_private.key)
# NAT設定(サーバーが複数クライアントのトラフィックをルーティング)
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 = $(cat client1_public.key)
AllowedIPs = 10.0.0.2/32
EOF
# IPフォワーディングを有効化
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
# WireGuardを起動・自動起動設定
systemctl enable --now wg-quick@wg0
# クライアント用設定ファイルを生成
cat > client1.conf << EOF
[Interface]
PrivateKey = $(cat client1_private.key)
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = $(cat server_public.key)
Endpoint = your-server-ip:51820
AllowedIPs = 0.0.0.0/0 # 全トラフィックをVPN経由(フルトンネル)
# AllowedIPs = 10.0.0.0/24, 192.168.1.0/24 # スプリットトンネル(社内リソースのみ)
PersistentKeepalive = 25
EOF
# wgのピア管理をPythonスクリプトで自動化
import subprocess
import base64
import secrets
def generate_keypair() -> tuple:
'''WireGuardキーペアを生成する'''
private_key = subprocess.run(['wg', 'genkey'], capture_output=True, text=True).stdout.strip()
public_key = subprocess.run(['wg', 'pubkey'], input=private_key, capture_output=True, text=True).stdout.strip()
return private_key, public_key
def add_peer(interface: str, public_key: str, client_ip: str):
'''VPNサーバーに新しいピアを追加する(ランタイム + 永続化)'''
# ランタイムに追加
subprocess.run(['wg', 'set', interface, 'peer', public_key,
'allowed-ips', f'{client_ip}/32'], check=True)
# wg0.confに永続化
with open(f'/etc/wireguard/{interface}.conf', 'a') as f:
f.write(f'
[Peer]
PublicKey = {public_key}
AllowedIPs = {client_ip}/32
')
print(f"Added peer {public_key[:16]}... with IP {client_ip}")
def remove_peer(interface: str, public_key: str):
'''ピアを削除(退職者のアクセス取り消し)'''
subprocess.run(['wg', 'set', interface, 'peer', public_key, 'remove'], check=True)
print(f"Removed peer {public_key[:16]}...")
def list_peers(interface: str):
'''現在接続中のピアとトラフィック統計を表示'''
result = subprocess.run(['wg', 'show', interface], capture_output=True, text=True)
print(result.stdout)
# 使用例: 新しいリモートワーカーにVPNアクセスを付与
private_key, public_key = generate_keypair()
add_peer('wg0', public_key, '10.0.0.10')
OpenVPN
2001年から開発されているSSL/TLS VPNの定番OSS です。GitHubスター10k+。Windows・Mac・Linux・iOS・Android・ルーター等のすべてのプラットフォームにクライアントが存在し、互換性が最高。NAT越えも得意。企業向けのOpenVPN Access Server(有料・2同時接続まで無料)もあり、WebUIでユーザー管理できます。
# OpenVPN Community EditionをUbuntuにセットアップ
apt-get install -y openvpn easy-rsa
# PKI(証明書管理)の初期化
make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh
openvpn --genkey secret /etc/openvpn/ta.key
# クライアント証明書を生成(ユーザーごとに実行)
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
# /etc/openvpn/server.conf の例
cat > /etc/openvpn/server.conf << 'EOF'
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key
dh /etc/openvpn/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/ta.key 0
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-GCM
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
verb 3
EOF
systemctl enable --now openvpn@server
Tailscale
WireGuardをベースにしたメッシュVPNです。コアOSS(tailscale/tailscale、BSD-3-Clause)で、コーディネーションサーバー(制御プレーン)は有料SaaSですがHeadscale(OSSの制御サーバー)でフルセルフホストも可能です。設定不要でNAT越えメッシュ接続ができ、デバイスをタグ管理できます。
# Tailscaleのインストール(クライアント)
curl -fsSL https://tailscale.com/install.sh | sh
tailscale up
# セルフホスト版(Headscale)をDockerで起動
docker run -d --name headscale --restart unless-stopped -p 8080:8080 -p 9090:9090 -v headscale_data:/var/lib/headscale -v ./config/config.yaml:/etc/headscale/config.yaml headscale/headscale:latest headscale serve
# Headscaleに接続(Tailscaleクライアントから)
tailscale up --login-server https://headscale.yourcompany.com
機能比較表
| 比較項目 | WireGuard | OpenVPN | Tailscale(Headscale) |
|---|---|---|---|
| ライセンス | GPLv2 | GPLv2 | BSD-3(コア) |
| 速度 | 最速(3〜4倍) | 中速 | 中速(WireGuardベース) |
| 設定難易度 | 中 | 高 | 低(ゼロ設定) |
| NAT越え | △(追加設定必要) | ✅ | ✅(自動) |
| モバイル対応 | ✅ | ✅ | ✅ |
| メッシュトポロジー | ❌(スター型) | ❌ | ✅ |
| フルセルフホスト | ✅ | ✅ | Headscaleで可能 |
VPNとゼロトラストアーキテクチャについてはSecurityカテゴリ/categories/securityを参照してください。VPNサーバーのインフラ構成はDevOpsカテゴリ/categories/devopsにまとめています。
FAQ
Q. WireGuardとOpenVPNのどちらが速いですか?本番ベンチマークは?
A. WireGuardが一般的に3〜4倍高速です。参考ベンチマーク(1Gbpsリンク・AES-256・同一ハードウェア): WireGuard: ダウンロード約900Mbps・CPU使用率約15%・レイテンシー1〜2ms追加。OpenVPN UDP: ダウンロード約220Mbps・CPU使用率約65%・レイテンシー5〜10ms追加。速度差の理由: WireGuardはカーネルモジュールとして実装(ユーザースペースとカーネルスペースの切り替えが最小)、ChaCha20暗号はAES-256より軽量な実装。実際に違いが出るケース: 大容量ファイルの転送・ビデオ会議・リモートデスクトップ。差が出にくいケース: Webブラウジング・メール・IM等の低帯域用途。
Q. 退職者のVPNアクセスを即座に取り消す仕組みはどう作りますか?
A. ツールごとに異なります。WireGuard: wg set wg0 peer <PUBLIC_KEY> removeで即座にアクセス切断。wg0.confからも削除してwg-quick save wg0で永続化。OpenVPN: PKI証明書の失効(CRL)を使います。easyrsa revoke client1 && easyrsa gen-crlでCRLを更新してOpenVPNに再読み込みさせます(プロセス不停止で適用可能)。Tailscale/Headscale: headscale nodes delete --identifier <NODE_ID>で即座に切断。自動化推奨: 人事システム(例: Workday・HRMos)のAPIからユーザー退職イベントをWebhookで受け取り、VPN管理スクリプトを自動実行するフローを構築します。
Q. 複数のサイト(東京・大阪・海外拠点)をWireGuardで接続するサイト間VPNの設定は?
A. ハブ&スポーク型(東京をハブとする)またはフルメッシュ型を選びます。
# 東京サーバー(ハブ)の設定
[Interface]
Address = 10.200.0.1/24
ListenPort = 51820
PrivateKey = <tokyo-private-key>
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]
# 大阪サーバー
PublicKey = <osaka-public-key>
AllowedIPs = 10.200.0.2/32, 192.168.2.0/24 # 大阪の社内NW
Endpoint = osaka-server.yourcompany.com:51820
[Peer]
# シンガポールサーバー
PublicKey = <sg-public-key>
AllowedIPs = 10.200.0.3/32, 172.16.3.0/24 # SG社内NW
Endpoint = sg-server.yourcompany.com:51820
WireGuardはフルメッシュが苦手(ピアが増えると設定が複雑)なため、10拠点を超えるならTailscale(Headscale)のメッシュVPNの方が管理が楽です。
Q. TailscaleとHeadscaleでセルフホストする場合のデメリットは?
A. Headscaleのデメリット: ①Tailscale公式のいくつかの機能が未実装(Magic DNS・Subnet Routerは対応、ACL設定UIは未実装)②TailscaleアプリのアップデートでたまにHeadscaleとの非互換が発生するため、Tailscaleクライアントのバージョンを固定する必要がある③Tailscaleのカスタマーサポートが受けられない(コミュニティのみ)④MFAとSSOはTailscale SaaSに依存する部分があり、Headscaleでの対応は発展途上。向いているケース: クローズドな企業ネットワーク・PII管理が厳しくSaaSに接続情報を送れない環境・Tailscale有料プランのコスト(月$6/ユーザー)を削減したいケース。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 高速・シンプル・少人数 | WireGuard |
| 互換性重視・レガシー対応 | OpenVPN |
| ゼロ設定・メッシュ・多デバイス | Tailscale(Headscale) |
| サイト間VPN(拠点間) | WireGuard |