メインコンテンツへスキップ
見出し画像

脱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 の $$ だけは忘れるな。約束だぞ。


    あなたへのおすすめ