
脱OpenVPN!「WireGuard」で素人が爆死しないために。
前回はDokployの話をしたが、今回はその足回り、VPNの話をする。
エンジニアなら一度は「自宅サーバーに外から安全に繋がりたい」とか「怪しい公衆Wi-Fiでクレカ番号を入れるのが怖い」と思ったことがあるだろう。
そこでVPNを建てようとするわけだが、OpenVPNの設定ファイルの複雑さと、証明書管理(CAだのCRTだのKEYだの)に絶望し、そっとターミナルを閉じた経験はないか?
俺はある。
だが時代は変わった。今はWireGuardがある。
Linuxの生みの親、リーナス・トーバルズに「OpenVPNやIPsecの惨状に比べれば、これは芸術作品だ」と言わしめた、次世代のスタンダードだ。
今回は、この「芸術作品」を、素人が泥にまみれず、かつ安全に使いこなすための最短ルート(Docker + wg-easy)を解説する。
1. なぜWireGuard一択なのか?
「枯れた技術(OpenVPN)の方が信頼できるのでは?」という意見はもっともだ。
しかし、WireGuardの設計思想を知れば、もう戻れなくなる。
① 圧倒的な「軽さ」と「シンプルさ」
コード行数: OpenVPNやIPsecが数十万行レベルの巨大迷路なのに対し、WireGuardは約4,000行だ。バグが隠れる場所がない。セキュリティ監査もしやすい。
カーネル統合: Linux 5.6以降、カーネルに標準搭載されている。つまり、OSレベルで最適化されており、爆速だ。
② "オレオレ"設定を許さない
昔のVPNは「暗号化方式は何にする?AES-256?CBC?GCM?」と聞いてきた。素人はここで設定をミスり、脆弱なVPNを作る。
WireGuardは「暗号化方式はこれ(ChaCha20-Poly1305)が最強だからこれを使え。交渉はしない」というスタンスだ。選択肢がないから、ミスりようがない。
③ 切れない
スマホでWi-Fiから4Gに切り替わった瞬間、VPNが切れてイライラしたことはないか?
WireGuardはステートレスだ。IPが変わっても、何食わぬ顔で通信を継続する。
2. 【実践編】世界一簡単な導入法「wg-easy」
WireGuard自体はコマンドラインツールだが、素人が生で触ると鍵の交換で死ぬ。
そこで、「wg-easy」という神ツールを使う。これ一つで「WireGuardサーバー」と「管理用Web UI」が手に入る。
前提条件
VPS(または自宅サーバー)があり、Dockerが入っていること。
UDPポート 51820 が開放されていること(これ重要)。
STEP 1:パスワードハッシュの生成(最大の罠)
最近の wg-easy はセキュリティ強化のため、平文パスワード(PASSWORD=xxx)の使用が非推奨(または廃止)になった。
ここがつまずきポイントだ。
まず、ターミナルで以下を叩いて、管理画面用のパスワードハッシュを作る。
Bash
docker run --rm ghcr.io/wg-easy/wg-easy wgpw 'ここに設定したいパスワード'
すると $2y$10$Of... みたいな文字列(Bcryptハッシュ)が出てくる。これをコピーしておく。
STEP 2:docker-compose.yml の作成
以下のファイルをサーバーに作成する。
【超重要】
さっき作ったハッシュ内の $ マークは、Docker Compose内では変数と誤認される。
すべての $ を $$ に書き換えて記述すること(例: $2y$ → $$2y$$)。これをやらないと一生ログインできない。
YAML
services:
wg-easy:
environment:
# ⚠️ サーバーのグローバルIP、またはドメイン名を入れる
- WG_HOST=your.server.ip.address
# ⚠️ 生成したハッシュを入れる($を$$に置換するのを忘れるな!)
- PASSWORD_HASH=$$2y$$10$$ExampleHash...
# 言語設定(日本語対応済み)
- LANG=ja
- PORT=51821
- WG_PORT=51820
image: ghcr.io/wg-easy/wg-easy
container_name: wg-easy
volumes:
-./.wg-easy:/etc/wireguard
ports:
- "51820:51820/udp" # VPN通信用
- "51821:51821/tcp" # 管理画面用(扱い注意)
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
STEP 3:起動と接続
Bash
docker compose up -d
これで完了だ。
ブラウザで http://<サーバーIP>:51821 にアクセスし、設定したパスワードを入れる。
「新規作成」ボタンを押して名前(iPhoneとか)を付ければ、QRコードが表示される。それをスマホのWireGuardアプリで読み込めば、もうVPN開通だ。
3. 【警告】セキュリティと運用の注意点
「簡単じゃん!」と思ったあなた、ここでブラウザを閉じるな。ここからが生存戦略だ。
① 管理画面(51821)を全裸で公開するな
上記のままだと、管理画面のログインページが全世界に公開されている。パスワード認証があるとはいえ、気持ち悪い。
推奨策: VPNを繋いだ後じゃないと管理画面に入れないようにする(ポートフォリオを閉じる)。
妥協策: Basic認証をかけたリバースプロキシ(Nginxなど)を通すか、自宅のIPからしかアクセスできないようにファイアウォール(UFWなど)で縛る。
② パスワードの $$ トラップ
前述したが、Docker Composeで $ は変数の頭文字だ。ハッシュ値に含まれる $ をそのまま書くと、Dockerが「そんな変数ねーよ」と無視してしまい、「正しいパスワードを入れてるのにログインできない」という地獄に落ちる。必ず $$ にエスケープしろ。
③ プライバシー(ログ)の話
WireGuardは仕様上、メモリ内に「直近で誰(どのIP)が繋いだか」の情報を保持する。
「ノーログ」を謳う商用VPN業者はここを改造して消しているが、自鯖でやる分には「自分がいつ繋いだか」が残るだけなので、実害はない。むしろトラブルシューティングに役立つ。
4. Tailscale vs WireGuard(自前)
「Tailscale でよくない?」という声が聞こえる。
半分正解だ。TailscaleはWireGuardを裏で使っており、ポート開放すら不要にする魔法のツールだ。
特徴Tailscale自前WireGuard (wg-easy)導入アプリ入れるだけ(魔法)サーバー構築が必要ポート開放不要(二重ルーターでも抜ける)必要 (UDP 51820)速度普通(ユーザー空間動作)爆速(カーネル動作)プライバシー認証はGoogle等に依存完全なるデータの主権
Tailscaleを使うべき人: ポート開放ができない環境にいる人。楽をしたい人。
自前WireGuardを使うべき人: 通信経路を完全に自分で掌握したい人。Google等の認証基盤に依存したくない人。1msでもレイテンシを削りたい速度狂。
結論
OpenVPNの設定ファイルと格闘して休日を潰す時代は終わった。
VPSを借りて、wg-easy を立ち上げろ。
カフェのWi-Fiから自宅のサーバーに安全かつ爆速でアクセスできた瞬間、君は「自由」を手に入れる。
ただし、docker-compose.yml の $$ だけは忘れるな。約束だぞ。